Repository: k8ssandra/k8ssandra-operator
Pull request #797 (2022-12-15 07:12:05)

Allow 4.x versions
<!--  Thanks for sending a pull request!  Before submitting:

1. Read our CONTRIBUTING.md guide
2. Rebase your PR if it gets out of sync with main
-->

**What this PR does**:
Allows using 4.x versions (including the recently released 4.1.0).

**Checklist**
- [ ] Changes manually tested
- [ ] Automated Tests added/updated
- [ ] Documentation added/updated
- [ ] CHANGELOG.md updated (not required for documentation PRs)
- [ ] CLA Signed:  [DataStax CLA](https://cla.datastax.com/)


github-actions[bot]: No linked issues found. Please add the corresponding issues in the pull request description. <br/> [Use GitHub automation to close the issue when a PR is merged](https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue#linking-a-pull-request-to-an-issue-using-a-keyword) <!-- metadata = {"action":"linked_issue"} -->
codecov-commenter: # [Codecov](https://codecov.io/gh/k8ssandra/k8ssandra-operator/pull/797?src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=k8ssandra) Report
> Merging [#797](https://codecov.io/gh/k8ssandra/k8ssandra-operator/pull/797?src=pr&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=k8ssandra) (ae4e97c) into [main](https://codecov.io/gh/k8ssandra/k8ssandra-operator/commit/5ac2c68c6c9f601f704a9461e8bf54b862fde029?el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=k8ssandra) (5ac2c68) will **increase** coverage by `0.04%`.
> The diff coverage is `n/a`.

[![Impacted file tree graph](https://codecov.io/gh/k8ssandra/k8ssandra-operator/pull/797/graphs/tree.svg?width=650&height=150&src=pr&token=5FJ9A7ZBA1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=k8ssandra)](https://codecov.io/gh/k8ssandra/k8ssandra-operator/pull/797?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=k8ssandra)

```diff
@@            Coverage Diff             @@
##             main     #797      +/-   ##
==========================================
+ Coverage   55.92%   55.96%   +0.04%     
==========================================
  Files          88       88              
  Lines        8562     8562              
==========================================
+ Hits         4788     4792       +4     
+ Misses       3344     3341       -3     
+ Partials      430      429       -1     
```


| [Impacted Files](https://codecov.io/gh/k8ssandra/k8ssandra-operator/pull/797?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=k8ssandra) | Coverage Δ | |
|---|---|---|
| [apis/k8ssandra/v1alpha1/k8ssandracluster\_types.go](https://codecov.io/gh/k8ssandra/k8ssandra-operator/pull/797/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=k8ssandra#diff-YXBpcy9rOHNzYW5kcmEvdjFhbHBoYTEvazhzc2FuZHJhY2x1c3Rlcl90eXBlcy5nbw==) | `32.46% <ø> (ø)` | |
| [controllers/replication/secret\_controller.go](https://codecov.io/gh/k8ssandra/k8ssandra-operator/pull/797/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=k8ssandra#diff-Y29udHJvbGxlcnMvcmVwbGljYXRpb24vc2VjcmV0X2NvbnRyb2xsZXIuZ28=) | `64.42% <0.00%> (-1.01%)` | :arrow_down: |
| [controllers/stargate/stargate\_controller.go](https://codecov.io/gh/k8ssandra/k8ssandra-operator/pull/797/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=k8ssandra#diff-Y29udHJvbGxlcnMvc3RhcmdhdGUvc3RhcmdhdGVfY29udHJvbGxlci5nbw==) | `47.48% <0.00%> (+1.11%)` | :arrow_up: |
| [controllers/k8ssandra/stargate.go](https://codecov.io/gh/k8ssandra/k8ssandra-operator/pull/797/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=k8ssandra#diff-Y29udHJvbGxlcnMvazhzc2FuZHJhL3N0YXJnYXRlLmdv) | `66.14% <0.00%> (+2.36%)` | :arrow_up: |


Patch:
diff --git a/CHANGELOG/CHANGELOG-1.4.md b/CHANGELOG/CHANGELOG-1.4.md
index ace9b683..67e88faf 100644
--- a/CHANGELOG/CHANGELOG-1.4.md
+++ b/CHANGELOG/CHANGELOG-1.4.md
@@ -15,6 +15,8 @@ When cutting a new release, update the `unreleased` heading to the tag being gen
 
 ## unreleased
 
+* [ENHANCEMENT] [#797](https://github.com/k8ssandra/k8ssandra-operator/pull/797) Allow using Cassandra 4.1+ releases
+
 ## v1.4.0 - 2022-11-18
 
 * [ENHANCEMENT] [#766](https://github.com/k8ssandra/k8ssandra-operator/issues/766) Upgrade Reaper to v3.2.1
diff --git a/CHANGELOG/CHANGELOG-1.5.md b/CHANGELOG/CHANGELOG-1.5.md
index 37ccd503..174ae7f0 100644
--- a/CHANGELOG/CHANGELOG-1.5.md
+++ b/CHANGELOG/CHANGELOG-1.5.md
@@ -17,6 +17,7 @@ When cutting a new release, update the `unreleased` heading to the tag being gen
 
 * [FEATURE] [#775](https://github.com/k8ssandra/k8ssandra-operator/issues/775) Add the ability to inject and configure a Vector agent sidecar in the Cassandra pods
 * [FEATURE] [#600](https://github.com/k8ssandra/k8ssandra-operator/issues/600) Disable secrets management and replication with the external secrets provider
+* [ENHANCEMENT] [#796](https://github.com/k8ssandra/k8ssandra-operator/issues/796) Enable smart token allocation by default for DSE
 * [ENHANCEMENT] [#765](https://github.com/k8ssandra/k8ssandra-operator/issues/765) Add GitHub workflow to test various k8s versions
 * [ENHANCEMENT] [#323](https://github.com/k8ssandra/k8ssandra/issues/323) Use Cassandra internals for JMX authentication
 * [ENHANCEMENT] [#770](https://github.com/k8ssandra/k8ssandra-operator/issues/770) Update to Go 1.19 and Operator SDK 1.25.2
@@ -26,3 +27,4 @@ When cutting a new release, update the `unreleased` heading to the tag being gen
 * [BUGFIX] [#778](https://github.com/k8ssandra/k8ssandra-operator/issues/778) Fix Stargate deployments on k8s clusters using a custom domain name
 * [TESTING] [#761](https://github.com/k8ssandra/k8ssandra-operator/issues/761) Stabilize integration and e2e tests
 * [TESTING] [#799](https://github.com/k8ssandra/k8ssandra-operator/issues/799) Fix GHA CI failures with Kustomize install being rate limited
+* [FEATURE] [#501](https://github.com/k8ssandra/k8ssandra-operator/issues/501) Allow configuring annotations and labels on services, statefulsets, deployments and pods
diff --git a/CHANGELOG/RELEASE-NOTES.md b/CHANGELOG/RELEASE-NOTES.md
new file mode 100644
index 00000000..fe2ebb26
--- /dev/null
+++ b/CHANGELOG/RELEASE-NOTES.md
@@ -0,0 +1,10 @@
+# k8ssandra-operator - Release Notes
+
+## v1.4.1
+
+This patch release adds support for Apache Cassandra 4.1.0.
+
+### Apache Cassandra 4.1 support
+
+k8ssandra-operator now supports Apache Cassandra 4.1.x. To use Apache Cassandra 4.1.0, you must set the `spec.serverVersion` field to `4.1.0`.  
+At the time of this release, Stargate is not yet compatible with Apache Cassandra 4.1. See [this issue](https://github.com/stargate/stargate/issues/2311) for more details.
\ No newline at end of file
diff --git a/apis/k8ssandra/v1alpha1/k8ssandracluster_types.go b/apis/k8ssandra/v1alpha1/k8ssandracluster_types.go
index d170c10d..2eaf9ff3 100644
--- a/apis/k8ssandra/v1alpha1/k8ssandracluster_types.go
+++ b/apis/k8ssandra/v1alpha1/k8ssandracluster_types.go
@@ -24,6 +24,7 @@ import (
 	telemetryapi "github.com/k8ssandra/k8ssandra-operator/apis/telemetry/v1alpha1"
 	"github.com/k8ssandra/k8ssandra-operator/pkg/encryption"
 	"github.com/k8ssandra/k8ssandra-operator/pkg/images"
+	"github.com/k8ssandra/k8ssandra-operator/pkg/meta"
 	corev1 "k8s.io/api/core/v1"
 	"k8s.io/apimachinery/pkg/api/resource"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -225,6 +226,8 @@ type K8ssandraClusterList struct {
 type CassandraClusterTemplate struct {
 	DatacenterOptions `json:",inline"`
 
+	Meta meta.CassandraDatacenterMeta `json:"metadata,omitempty"`
+
 	// The reference to the superuser secret to use for Cassandra. If unspecified, a default secret will be generated
 	// with a random password; the generated secret name will be "<cluster_name>-superuser" where <cluster_name> is the
 	// K8ssandraCluster CRD name.
@@ -304,7 +307,7 @@ type DatacenterOptions struct {
 	// ServerVersion is the Cassandra or DSE version. The following versions are supported:
 	// - Cassandra: 3.11.X and 4.0.X
 	// - DSE: 6.8.X
-	// +kubebuilder:validation:Pattern=(6\.8\.\d+)|(3\.11\.\d+)|(4\.0\.\d+)
+	// +kubebuilder:validation:Pattern=(6\.8\.\d+)|(3\.11\.\d+)|(4\.\d+\.\d+)
 	ServerVersion string `json:"serverVersion,omitempty"`
 
 	// ServerImage is the image for the cassandra container. Note that this should be a
@@ -457,26 +460,7 @@ type EmbeddedObjectMeta struct {
 	Name string `json:"name"`
 
 	// +optional
-	Labels map[string]string `json:"labels,omitempty"`
-
-	// +optional
-	Annotations map[string]string `json:"annotations,omitempty"`
-}
-
-func (in *EmbeddedObjectMeta) GetAnnotations() map[string]string {
-	return in.Annotations
-}
-
-func (in *EmbeddedObjectMeta) SetAnnotations(annotations map[string]string) {
-	in.Annotations = annotations
-}
-
-func (in *EmbeddedObjectMeta) GetLabels() map[string]string {
-	return in.Labels
-}
-
-func (in *EmbeddedObjectMeta) SetLabels(labels map[string]string) {
-	in.Labels = labels
+	Metadata meta.CassandraDatacenterMeta `json:",inline"`
 }
 
 func (s *K8ssandraClusterStatus) GetConditionStatus(conditionType K8ssandraClusterConditionType) corev1.ConditionStatus {
diff --git a/apis/k8ssandra/v1alpha1/zz_generated.deepcopy.go b/apis/k8ssandra/v1alpha1/zz_generated.deepcopy.go
index 5935e30e..9199b482 100644
--- a/apis/k8ssandra/v1alpha1/zz_generated.deepcopy.go
+++ b/apis/k8ssandra/v1alpha1/zz_generated.deepcopy.go
@@ -117,6 +117,7 @@ func (in *AuditLogOptions) DeepCopy() *AuditLogOptions {
 func (in *CassandraClusterTemplate) DeepCopyInto(out *CassandraClusterTemplate) {
 	*out = *in
 	in.DatacenterOptions.DeepCopyInto(&out.DatacenterOptions)
+	in.Meta.DeepCopyInto(&out.Meta)
 	out.SuperuserSecretRef = in.SuperuserSecretRef
 	if in.Datacenters != nil {
 		in, out := &in.Datacenters, &out.Datacenters
@@ -304,20 +305,7 @@ func (in *DatacenterOptions) DeepCopy() *DatacenterOptions {
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *EmbeddedObjectMeta) DeepCopyInto(out *EmbeddedObjectMeta) {
 	*out = *in
-	if in.Labels != nil {
-		in, out := &in.Labels, &out.Labels
-		*out = make(map[string]string, len(*in))
-		for key, val := range *in {
-			(*out)[key] = val
-		}
-	}
-	if in.Annotations != nil {
-		in, out := &in.Annotations, &out.Annotations
-		*out = make(map[string]string, len(*in))
-		for key, val := range *in {
-			(*out)[key] = val
-		}
-	}
+	in.Metadata.DeepCopyInto(&out.Metadata)
 }
 
 // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EmbeddedObjectMeta.
diff --git a/apis/reaper/v1alpha1/reaper_types.go b/apis/reaper/v1alpha1/reaper_types.go
index c7f06aa6..12276cad 100644
--- a/apis/reaper/v1alpha1/reaper_types.go
+++ b/apis/reaper/v1alpha1/reaper_types.go
@@ -20,6 +20,7 @@ import (
 	telemetryapi "github.com/k8ssandra/k8ssandra-operator/apis/telemetry/v1alpha1"
 	"github.com/k8ssandra/k8ssandra-operator/pkg/encryption"
 	"github.com/k8ssandra/k8ssandra-operator/pkg/images"
+	"github.com/k8ssandra/k8ssandra-operator/pkg/meta"
 	corev1 "k8s.io/api/core/v1"
 	"k8s.io/apimachinery/pkg/api/resource"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -134,6 +135,10 @@ type ReaperTemplate struct {
 	// (unless overriden by DC specific settings)
 	// +optional
 	Telemetry *telemetryapi.TelemetrySpec `json:"telemetry,omitempty"`
+
+	// labels and annotations for Reaper resources
+	// +optional
+	ResourceMeta *meta.ResourceMeta `json:"metadata,omitempty"`
 }
 
 // UseExternalSecrets defines whether the user has specified if credentials and
diff --git a/apis/reaper/v1alpha1/zz_generated.deepcopy.go b/apis/reaper/v1alpha1/zz_generated.deepcopy.go
index 303916e2..5cf08c8d 100644
--- a/apis/reaper/v1alpha1/zz_generated.deepcopy.go
+++ b/apis/reaper/v1alpha1/zz_generated.deepcopy.go
@@ -25,6 +25,7 @@ import (
 	telemetryv1alpha1 "github.com/k8ssandra/k8ssandra-operator/apis/telemetry/v1alpha1"
 	"github.com/k8ssandra/k8ssandra-operator/pkg/encryption"
 	"github.com/k8ssandra/k8ssandra-operator/pkg/images"
+	"github.com/k8ssandra/k8ssandra-operator/pkg/meta"
 	"k8s.io/api/core/v1"
 	runtime "k8s.io/apimachinery/pkg/runtime"
 )
@@ -281,6 +282,11 @@ func (in *ReaperTemplate) DeepCopyInto(out *ReaperTemplate) {
 		*out = new(telemetryv1alpha1.TelemetrySpec)
 		(*in).DeepCopyInto(*out)
 	}
+	if in.ResourceMeta != nil {
+		in, out := &in.ResourceMeta, &out.ResourceMeta
+		*out = new(meta.ResourceMeta)
+		(*in).DeepCopyInto(*out)
+	}
 }
 
 // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ReaperTemplate.
diff --git a/apis/stargate/v1alpha1/stargate_types.go b/apis/stargate/v1alpha1/stargate_types.go
index cc60285f..a8b88613 100644
--- a/apis/stargate/v1alpha1/stargate_types.go
+++ b/apis/stargate/v1alpha1/stargate_types.go
@@ -21,6 +21,7 @@ import (
 	"github.com/k8ssandra/k8ssandra-operator/pkg/encryption"
 	goalesceutils "github.com/k8ssandra/k8ssandra-operator/pkg/goalesce"
 	"github.com/k8ssandra/k8ssandra-operator/pkg/images"
+	"github.com/k8ssandra/k8ssandra-operator/pkg/meta"
 	corev1 "k8s.io/api/core/v1"
 	"k8s.io/apimachinery/pkg/api/resource"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -121,6 +122,10 @@ type StargateTemplate struct {
 	// +kubebuilder:validation:Enum=internal;external
 	// +kubebuilder:default=internal
 	SecretsProvider string `json:"secretsProvider,omitempty"`
+
+	// labels and annotations for Stargate resources
+	// +optional
+	ResourceMeta *meta.ResourceMeta `json:"metadata,omitempty"`
 }
 
 // UseExternalSecrets defines whether the user has specified if credentials and
diff --git a/apis/stargate/v1alpha1/zz_generated.deepcopy.go b/apis/stargate/v1alpha1/zz_generated.deepcopy.go
index 5d6dd9ca..b76a8f7e 100644
--- a/apis/stargate/v1alpha1/zz_generated.deepcopy.go
+++ b/apis/stargate/v1alpha1/zz_generated.deepcopy.go
@@ -25,6 +25,7 @@ import (
 	telemetryv1alpha1 "github.com/k8ssandra/k8ssandra-operator/apis/telemetry/v1alpha1"
 	"github.com/k8ssandra/k8ssandra-operator/pkg/encryption"
 	"github.com/k8ssandra/k8ssandra-operator/pkg/images"
+	"github.com/k8ssandra/k8ssandra-operator/pkg/meta"
 	"k8s.io/api/core/v1"
 	runtime "k8s.io/apimachinery/pkg/runtime"
 )
@@ -333,6 +334,11 @@ func (in *StargateTemplate) DeepCopyInto(out *StargateTemplate) {
 		*out = new(AuthOptions)
 		**out = **in
 	}
+	if in.ResourceMeta != nil {
+		in, out := &in.ResourceMeta, &out.ResourceMeta
+		*out = new(meta.ResourceMeta)
+		(*in).DeepCopyInto(*out)
+	}
 }
 
 // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new StargateTemplate.
diff --git a/config/crd/bases/k8ssandra.io_k8ssandraclusters.yaml b/config/crd/bases/k8ssandra.io_k8ssandraclusters.yaml
index a4792b44..1cbda64c 100644
--- a/config/crd/bases/k8ssandra.io_k8ssandraclusters.yaml
+++ b/config/crd/bases/k8ssandra.io_k8ssandraclusters.yaml
@@ -7363,6 +7363,12 @@ spec:
                               additionalProperties:
                                 type: string
                               type: object
+                            commonLabels:
+                              additionalProperties:
+                                type: string
+                              description: labels/annotations that will be applied
+                                to all components created by the CRD
+                              type: object
                             labels:
                               additionalProperties:
                                 type: string
@@ -7371,6 +7377,78 @@ spec:
                               type: string
                             namespace:
                               type: string
+                            pods:
+                              description: labels/annotations for the pod components
+                              properties:
+                                annotations:
+                                  additionalProperties:
+                                    type: string
+                                  type: object
+                                labels:
+                                  additionalProperties:
+                                    type: string
+                                  type: object
+                              type: object
+                            services:
+                              description: labels/annotations for all of the CassandraDatacenter
+                                service components
+                              properties:
+                                additionalSeedService:
+                                  properties:
+                                    annotations:
+                                      additionalProperties:
+                                        type: string
+                                      type: object
+                                    labels:
+                                      additionalProperties:
+                                        type: string
+                                      type: object
+                                  type: object
+                                allPodsService:
+                                  properties:
+                                    annotations:
+                                      additionalProperties:
+                                        type: string
+                                      type: object
+                                    labels:
+                                      additionalProperties:
+                                        type: string
+                                      type: object
+                                  type: object
+                                dcService:
+                                  properties:
+                                    annotations:
+                                      additionalProperties:
+                                        type: string
+                                      type: object
+                                    labels:
+                                      additionalProperties:
+                                        type: string
+                                      type: object
+                                  type: object
+                                nodePortService:
+                                  properties:
+                                    annotations:
+                                      additionalProperties:
+                                        type: string
+                                      type: object
+                                    labels:
+                                      additionalProperties:
+                                        type: string
+                                      type: object
+                                  type: object
+                                seedService:
+                                  properties:
+                                    annotations:
+                                      additionalProperties:
+                                        type: string
+                                      type: object
+                                    labels:
+                                      additionalProperties:
+                                        type: string
+                                      type: object
+                                  type: object
+                              type: object
                           required:
                           - name
                           type: object
@@ -7668,7 +7746,7 @@ spec:
                           description: 'ServerVersion is the Cassandra or DSE version.
                             The following versions are supported: - Cassandra: 3.11.X
                             and 4.0.X - DSE: 6.8.X'
-                          pattern: (6\.8\.\d+)|(3\.11\.\d+)|(4\.0\.\d+)
+                          pattern: (6\.8\.\d+)|(3\.11\.\d+)|(4\.\d+\.\d+)
                           type: string
                         size:
                           description: Size is the number Cassandra pods to deploy
@@ -8953,6 +9031,49 @@ spec:
                                   format: int32
                                   type: integer
                               type: object
+                            metadata:
+                              description: labels and annotations for Stargate resources
+                              properties:
+                                annotations:
+                                  additionalProperties:
+                                    type: string
+                                  type: object
+                                commonLabels:
+                                  additionalProperties:
+                                    type: string
+                                  description: labels/annotations that will be applied
+                                    to all components created by the CRD
+                                  type: object
+                                labels:
+                                  additionalProperties:
+                                    type: string
+                                  type: object
+                                pods:
+                                  description: labels/annotations for the pod components
+                                  properties:
+                                    annotations:
+                                      additionalProperties:
+                                        type: string
+                                      type: object
+                                    labels:
+                                      additionalProperties:
+                                        type: string
+                                      type: object
+                                  type: object
+                                service:
+                                  description: labels/annotations for the service
+                                    component
+                                  properties:
+                                    annotations:
+                                      additionalProperties:
+                                        type: string
+                                      type: object
+                                    labels:
+                                      additionalProperties:
+                                        type: string
+                                      type: object
+                                  type: object
+                              type: object
                             nodeSelector:
                               additionalProperties:
                                 type: string
@@ -10391,6 +10512,52 @@ spec:
                                         format: int32
                                         type: integer
                                     type: object
+                                  metadata:
+                                    description: labels and annotations for Stargate
+                                      resources
+                                    properties:
+                                      annotations:
+                                        additionalProperties:
+                                          type: string
+                                        type: object
+                                      commonLabels:
+                                        additionalProperties:
+                                          type: string
+                                        description: labels/annotations that will
+                                          be applied to all components created by
+                                          the CRD
+                                        type: object
+                                      labels:
+                                        additionalProperties:
+                                          type: string
+                                        type: object
+                                      pods:
+                                        description: labels/annotations for the pod
+                                          components
+                                        properties:
+                                          annotations:
+                                            additionalProperties:
+                                              type: string
+                                            type: object
+                                          labels:
+                                            additionalProperties:
+                                              type: string
+                                            type: object
+                                        type: object
+                                      service:
+                                        description: labels/annotations for the service
+                                          component
+                                        properties:
+                                          annotations:
+                                            additionalProperties:
+                                              type: string
+                                            type: object
+                                          labels:
+                                            additionalProperties:
+                                              type: string
+                                            type: object
+                                        type: object
+                                    type: object
                                   name:
                                     description: Name is the rack name. It must correspond
                                       to an existing rack name in the CassandraDatacenter
@@ -14956,6 +15123,96 @@ spec:
                         - serverSecretName
                         type: object
                     type: object
+                  metadata:
+                    description: Struct to hold labels and annotations for a CassandraDatacenter
+                    properties:
+                      annotations:
+                        additionalProperties:
+                          type: string
+                        type: object
+                      commonLabels:
+                        additionalProperties:
+                          type: string
+                        description: labels/annotations that will be applied to all
+                          components created by the CRD
+                        type: object
+                      labels:
+                        additionalProperties:
+                          type: string
+                        type: object
+                      pods:
+                        description: labels/annotations for the pod components
+                        properties:
+                          annotations:
+                            additionalProperties:
+                              type: string
+                            type: object
+                          labels:
+                            additionalProperties:
+                              type: string
+                            type: object
+                        type: object
+                      services:
+                        description: labels/annotations for all of the CassandraDatacenter
+                          service components
+                        properties:
+                          additionalSeedService:
+                            properties:
+                              annotations:
+                                additionalProperties:
+                                  type: string
+                                type: object
+                              labels:
+                                additionalProperties:
+                                  type: string
+                                type: object
+                            type: object
+                          allPodsService:
+                            properties:
+                              annotations:
+                                additionalProperties:
+                                  type: string
+                                type: object
+                              labels:
+                                additionalProperties:
+                                  type: string
+                                type: object
+                            type: object
+                          dcService:
+                            properties:
+                              annotations:
+                                additionalProperties:
+                                  type: string
+                                type: object
+                              labels:
+                                additionalProperties:
+                                  type: string
+                                type: object
+                            type: object
+                          nodePortService:
+                            properties:
+                              annotations:
+                                additionalProperties:
+                                  type: string
+                                type: object
+                              labels:
+                                additionalProperties:
+                                  type: string
+                                type: object
+                            type: object
+                          seedService:
+                            properties:
+                              annotations:
+                                additionalProperties:
+                                  type: string
+                                type: object
+                              labels:
+                                additionalProperties:
+                                  type: string
+                                type: object
+                            type: object
+                        type: object
+                    type: object
                   mgmtAPIHeap:
                     anyOf:
                     - type: integer
@@ -15301,7 +15558,7 @@ spec:
                     description: 'ServerVersion is the Cassandra or DSE version. The
                       following versions are supported: - Cassandra: 3.11.X and 4.0.X
                       - DSE: 6.8.X'
-                    pattern: (6\.8\.\d+)|(3\.11\.\d+)|(4\.0\.\d+)
+                    pattern: (6\.8\.\d+)|(3\.11\.\d+)|(4\.\d+\.\d+)
                     type: string
                   softPodAntiAffinity:
                     description: SoftPodAntiAffinity sets whether multiple Cassandra
@@ -17695,6 +17952,48 @@ spec:
                         format: int32
                         type: integer
                     type: object
+                  metadata:
+                    description: labels and annotations for Reaper resources
+                    properties:
+                      annotations:
+                        additionalProperties:
+                          type: string
+                        type: object
+                      commonLabels:
+                        additionalProperties:
+                          type: string
+                        description: labels/annotations that will be applied to all
+                          components created by the CRD
+                        type: object
+                      labels:
+                        additionalProperties:
+                          type: string
+                        type: object
+                      pods:
+                        description: labels/annotations for the pod components
+                        properties:
+                          annotations:
+                            additionalProperties:
+                              type: string
+                            type: object
+                          labels:
+                            additionalProperties:
+                              type: string
+                            type: object
+                        type: object
+                      service:
+                        description: labels/annotations for the service component
+                        properties:
+                          annotations:
+                            additionalProperties:
+                              type: string
+                            type: object
+                          labels:
+                            additionalProperties:
+                              type: string
+                            type: object
+                        type: object
+                    type: object
                   podSecurityContext:
                     description: PodSecurityContext contains a pod-level SecurityContext
                       to apply to Reaper pods.
@@ -19520,6 +19819,48 @@ spec:
                         format: int32
                         type: integer
                     type: object
+                  metadata:
+                    description: labels and annotations for Stargate resources
+                    properties:
+                      annotations:
+                        additionalProperties:
+                          type: string
+                        type: object
+                      commonLabels:
+                        additionalProperties:
+                          type: string
+                        description: labels/annotations that will be applied to all
+                          components created by the CRD
+                        type: object
+                      labels:
+                        additionalProperties:
+                          type: string
+                        type: object
+                      pods:
+                        description: labels/annotations for the pod components
+                        properties:
+                          annotations:
+                            additionalProperties:
+                              type: string
+                            type: object
+                          labels:
+                            additionalProperties:
+                              type: string
+                            type: object
+                        type: object
+                      service:
+                        description: labels/annotations for the service component
+                        properties:
+                          annotations:
+                            additionalProperties:
+                              type: string
+                            type: object
+                          labels:
+                            additionalProperties:
+                              type: string
+                            type: object
+                        type: object
+                    type: object
                   nodeSelector:
                     additionalProperties:
                       type: string
diff --git a/config/crd/bases/reaper.k8ssandra.io_reapers.yaml b/config/crd/bases/reaper.k8ssandra.io_reapers.yaml
index 7798b404..5303ee58 100644
--- a/config/crd/bases/reaper.k8ssandra.io_reapers.yaml
+++ b/config/crd/bases/reaper.k8ssandra.io_reapers.yaml
@@ -1519,6 +1519,48 @@ spec:
                     format: int32
                     type: integer
                 type: object
+              metadata:
+                description: labels and annotations for Reaper resources
+                properties:
+                  annotations:
+                    additionalProperties:
+                      type: string
+                    type: object
+                  commonLabels:
+                    additionalProperties:
+                      type: string
+                    description: labels/annotations that will be applied to all components
+                      created by the CRD
+                    type: object
+                  labels:
+                    additionalProperties:
+                      type: string
+                    type: object
+                  pods:
+                    description: labels/annotations for the pod components
+                    properties:
+                      annotations:
+                        additionalProperties:
+                          type: string
+                        type: object
+                      labels:
+                        additionalProperties:
+                          type: string
+                        type: object
+                    type: object
+                  service:
+                    description: labels/annotations for the service component
+                    properties:
+                      annotations:
+                        additionalProperties:
+                          type: string
+                        type: object
+                      labels:
+                        additionalProperties:
+                          type: string
+                        type: object
+                    type: object
+                type: object
               podSecurityContext:
                 description: PodSecurityContext contains a pod-level SecurityContext
                   to apply to Reaper pods.
diff --git a/config/crd/bases/stargate.k8ssandra.io_stargates.yaml b/config/crd/bases/stargate.k8ssandra.io_stargates.yaml
index bf4cd3b0..19f787c0 100644
--- a/config/crd/bases/stargate.k8ssandra.io_stargates.yaml
+++ b/config/crd/bases/stargate.k8ssandra.io_stargates.yaml
@@ -1309,6 +1309,48 @@ spec:
                     format: int32
                     type: integer
                 type: object
+              metadata:
+                description: labels and annotations for Stargate resources
+                properties:
+                  annotations:
+                    additionalProperties:
+                      type: string
+                    type: object
+                  commonLabels:
+                    additionalProperties:
+                      type: string
+                    description: labels/annotations that will be applied to all components
+                      created by the CRD
+                    type: object
+                  labels:
+                    additionalProperties:
+                      type: string
+                    type: object
+                  pods:
+                    description: labels/annotations for the pod components
+                    properties:
+                      annotations:
+                        additionalProperties:
+                          type: string
+                        type: object
+                      labels:
+                        additionalProperties:
+                          type: string
+                        type: object
+                    type: object
+                  service:
+                    description: labels/annotations for the service component
+                    properties:
+                      annotations:
+                        additionalProperties:
+                          type: string
+                        type: object
+                      labels:
+                        additionalProperties:
+                          type: string
+                        type: object
+                    type: object
+                type: object
               nodeSelector:
                 additionalProperties:
                   type: string
@@ -2467,6 +2509,48 @@ spec:
                           format: int32
                           type: integer
                       type: object
+                    metadata:
+                      description: labels and annotations for Stargate resources
+                      properties:
+                        annotations:
+                          additionalProperties:
+                            type: string
+                          type: object
+                        commonLabels:
+                          additionalProperties:
+                            type: string
+                          description: labels/annotations that will be applied to
+                            all components created by the CRD
+                          type: object
+                        labels:
+                          additionalProperties:
+                            type: string
+                          type: object
+                        pods:
+                          description: labels/annotations for the pod components
+                          properties:
+                            annotations:
+                              additionalProperties:
+                                type: string
+                              type: object
+                            labels:
+                              additionalProperties:
+                                type: string
+                              type: object
+                          type: object
+                        service:
+                          description: labels/annotations for the service component
+                          properties:
+                            annotations:
+                              additionalProperties:
+                                type: string
+                              type: object
+                            labels:
+                              additionalProperties:
+                                type: string
+                              type: object
+                          type: object
+                      type: object
                     name:
                       description: Name is the rack name. It must correspond to an
                         existing rack name in the CassandraDatacenter resource where
diff --git a/controllers/k8ssandra/dcconfigs.go b/controllers/k8ssandra/dcconfigs.go
index 14a297fc..0b7a08d1 100644
--- a/controllers/k8ssandra/dcconfigs.go
+++ b/controllers/k8ssandra/dcconfigs.go
@@ -83,6 +83,7 @@ func (r *K8ssandraClusterReconciler) createDatacenterConfigs(
 		cassandra.AddNumTokens(dcConfig)
 		cassandra.AddStartRpc(dcConfig)
 		cassandra.HandleDeprecatedJvmOptions(&dcConfig.CassandraConfig.JvmOptions)
+		cassandra.EnableSmartTokenAllocation(dcConfig)
 
 		if err := cassandra.ValidateDatacenterConfig(dcConfig); err != nil {
 			return nil, err
diff --git a/pkg/cassandra/config.go b/pkg/cassandra/config.go
index ed3705d6..bbe8d6f4 100644
--- a/pkg/cassandra/config.go
+++ b/pkg/cassandra/config.go
@@ -125,3 +125,14 @@ func ApplySystemReplication(dcConfig *DatacenterConfig, replication SystemReplic
 func AllowAlterRfDuringRangeMovement(dcConfig *DatacenterConfig) {
 	addOptionIfMissing(dcConfig, allowAlterRf)
 }
+
+// EnableSmartTokenAllocation adds the allocate_tokens_for_local_replication_factor option to
+// cassandra.yaml if it is not already present when running DSE.
+// This option is enabled by default in Cassandra but not DSE.
+func EnableSmartTokenAllocation(template *DatacenterConfig) {
+	// Note: we put int64 values because even if int values can be marshaled just fine,
+	// Unstructured.DeepCopy() would reject them since int is not a supported json type.
+	if template.ServerType == api.ServerDistributionDse {
+		template.CassandraConfig.CassandraYaml.PutIfAbsent("allocate_tokens_for_local_replication_factor", int64(3))
+	}
+}
diff --git a/pkg/cassandra/datacenter.go b/pkg/cassandra/datacenter.go
index b4d34842..4f0e4dea 100644
--- a/pkg/cassandra/datacenter.go
+++ b/pkg/cassandra/datacenter.go
@@ -12,6 +12,7 @@ import (
 	"github.com/k8ssandra/k8ssandra-operator/pkg/encryption"
 	goalesceutils "github.com/k8ssandra/k8ssandra-operator/pkg/goalesce"
 	"github.com/k8ssandra/k8ssandra-operator/pkg/images"
+	"github.com/k8ssandra/k8ssandra-operator/pkg/meta"
 	"github.com/k8ssandra/k8ssandra-operator/pkg/utils"
 	corev1 "k8s.io/api/core/v1"
 	"k8s.io/apimachinery/pkg/api/resource"
@@ -196,6 +197,16 @@ func NewDatacenter(klusterKey types.NamespacedName, template *DatacenterConfig)
 		dc.Spec.ManagementApiAuth = *template.ManagementApiAuth
 	}
 
+	m := template.Meta.Metadata
+	dc.ObjectMeta.Labels = utils.MergeMap(dc.ObjectMeta.Labels, m.Labels)
+	dc.ObjectMeta.Annotations = utils.MergeMap(dc.ObjectMeta.Annotations, m.Annotations)
+
+	if m.CommonLabels != nil {
+		dc.Spec.AdditionalLabels = m.CommonLabels
+	}
+
+	dc.Spec.AdditionalServiceConfig = m.ServiceConfig.ToCassAdditionalServiceConfig()
+
 	dc.Spec.Tolerations = template.Tolerations
 
 	return dc, nil
@@ -314,6 +325,10 @@ func Coalesce(clusterName string, clusterTemplate *api.CassandraClusterTemplate,
 	dcConfig.PodTemplateSpec.Spec.SecurityContext = mergedOptions.PodSecurityContext
 	dcConfig.PerNodeInitContainerImage = mergedOptions.PerNodeConfigInitContainerImage
 
+	dcConfig.Meta.Metadata = goalesceutils.MergeCRs(clusterTemplate.Meta, dcTemplate.Meta.Metadata)
+
+	AddPodTemplateSpecMeta(dcConfig, dcConfig.Meta.Metadata)
+
 	if len(mergedOptions.Containers) > 0 {
 		AddContainersToPodTemplateSpec(dcConfig, mergedOptions.Containers...)
 	}
@@ -380,6 +395,15 @@ func AddVolumesToPodTemplateSpec(dcConfig *DatacenterConfig, volume corev1.Volum
 	dcConfig.PodTemplateSpec.Spec.Volumes = append(dcConfig.PodTemplateSpec.Spec.Volumes, volume)
 }
 
+func AddPodTemplateSpecMeta(dcConfig *DatacenterConfig, m meta.CassandraDatacenterMeta) {
+	// We don't need to overlay m.CommonLabels as this will be done by cass-operator itself
+	dcConfig.PodTemplateSpec.ObjectMeta = metav1.ObjectMeta{
+		Annotations: m.Pods.Annotations,
+		Labels:      m.Pods.Labels,
+	}
+
+}
+
 func FindContainer(dcPodTemplateSpec *corev1.PodTemplateSpec, containerName string) (int, bool) {
 	if dcPodTemplateSpec != nil {
 		for i, container := range dcPodTemplateSpec.Spec.Containers {
diff --git a/pkg/meta/meta.go b/pkg/meta/meta.go
new file mode 100644
index 00000000..7233b39e
--- /dev/null
+++ b/pkg/meta/meta.go
@@ -0,0 +1,88 @@
+package meta
+
+import cassdcapi "github.com/k8ssandra/cass-operator/apis/cassandra/v1beta1"
+
+// +kubebuilder:object:generate=true
+type Tags struct {
+	// +optional
+	Labels map[string]string `json:"labels,omitempty"`
+
+	// +optional
+	Annotations map[string]string `json:"annotations,omitempty"`
+}
+
+// Struct to hold labels and annotations for a resource
+// +kubebuilder:object:generate=true
+type ResourceMeta struct {
+	// labels/annotations for the top-level CRD component
+	// +optional
+	Tags `json:",inline"`
+
+	// labels/annotations that will be applied to all components
+	// created by the CRD
+	// +optional
+	CommonLabels map[string]string `json:"commonLabels,omitempty"`
+
+	// labels/annotations for the pod components
+	// +optional
+	Pods Tags `json:"pods,omitempty"`
+
+	// labels/annotations for the service component
+	Service Tags `json:"service,omitempty"`
+}
+
+// Struct to hold labels and annotations for a CassandraDatacenter
+// +kubebuilder:object:generate=true
+type CassandraDatacenterMeta struct {
+	// labels/annotations for the CassandraDatacenter component
+	// +optional
+	Tags `json:",inline"`
+
+	// labels/annotations that will be applied to all components
+	// created by the CRD
+	// +optional
+	CommonLabels map[string]string `json:"commonLabels,omitempty"`
+
+	// labels/annotations for the pod components
+	// +optional
+	Pods Tags `json:"pods,omitempty"`
+
+	// labels/annotations for all of the CassandraDatacenter service components
+	ServiceConfig CassandraDatacenterServicesMeta `json:"services,omitempty"`
+}
+
+// CassandraDatacenterServicesMeta is very similar to cassdcapi.ServiceConfig and is passed to
+// cass-operator in the AdditionalServiceConfig field of the CassandraDatacenter spec.
+// +kubebuilder:object:generate=true
+type CassandraDatacenterServicesMeta struct {
+	DatacenterService     Tags `json:"dcService,omitempty"`
+	SeedService           Tags `json:"seedService,omitempty"`
+	AllPodsService        Tags `json:"allPodsService,omitempty"`
+	AdditionalSeedService Tags `json:"additionalSeedService,omitempty"`
+	NodePortService       Tags `json:"nodePortService,omitempty"`
+}
+
+func (in CassandraDatacenterServicesMeta) ToCassAdditionalServiceConfig() cassdcapi.ServiceConfig {
+	return cassdcapi.ServiceConfig{
+		DatacenterService: cassdcapi.ServiceConfigAdditions{
+			Annotations: in.DatacenterService.Annotations,
+			Labels:      in.DatacenterService.Labels,
+		},
+		SeedService: cassdcapi.ServiceConfigAdditions{
+			Annotations: in.SeedService.Annotations,
+			Labels:      in.SeedService.Labels,
+		},
+		AdditionalSeedService: cassdcapi.ServiceConfigAdditions{
+			Annotations: in.AdditionalSeedService.Annotations,
+			Labels:      in.AdditionalSeedService.Labels,
+		},
+		AllPodsService: cassdcapi.ServiceConfigAdditions{
+			Annotations: in.AllPodsService.Annotations,
+			Labels:      in.AllPodsService.Labels,
+		},
+		NodePortService: cassdcapi.ServiceConfigAdditions{
+			Annotations: in.NodePortService.Annotations,
+			Labels:      in.NodePortService.Labels,
+		},
+	}
+}
diff --git a/pkg/meta/zz_generated.deepcopy.go b/pkg/meta/zz_generated.deepcopy.go
new file mode 100644
index 00000000..06d824f9
--- /dev/null
+++ b/pkg/meta/zz_generated.deepcopy.go
@@ -0,0 +1,123 @@
+//go:build !ignore_autogenerated
+// +build !ignore_autogenerated
+
+/*
+Copyright 2022.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+// Code generated by controller-gen. DO NOT EDIT.
+
+package meta
+
+import ()
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *CassandraDatacenterMeta) DeepCopyInto(out *CassandraDatacenterMeta) {
+	*out = *in
+	in.Tags.DeepCopyInto(&out.Tags)
+	if in.CommonLabels != nil {
+		in, out := &in.CommonLabels, &out.CommonLabels
+		*out = make(map[string]string, len(*in))
+		for key, val := range *in {
+			(*out)[key] = val
+		}
+	}
+	in.Pods.DeepCopyInto(&out.Pods)
+	in.ServiceConfig.DeepCopyInto(&out.ServiceConfig)
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CassandraDatacenterMeta.
+func (in *CassandraDatacenterMeta) DeepCopy() *CassandraDatacenterMeta {
+	if in == nil {
+		return nil
+	}
+	out := new(CassandraDatacenterMeta)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *CassandraDatacenterServicesMeta) DeepCopyInto(out *CassandraDatacenterServicesMeta) {
+	*out = *in
+	in.DatacenterService.DeepCopyInto(&out.DatacenterService)
+	in.SeedService.DeepCopyInto(&out.SeedService)
+	in.AllPodsService.DeepCopyInto(&out.AllPodsService)
+	in.AdditionalSeedService.DeepCopyInto(&out.AdditionalSeedService)
+	in.NodePortService.DeepCopyInto(&out.NodePortService)
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CassandraDatacenterServicesMeta.
+func (in *CassandraDatacenterServicesMeta) DeepCopy() *CassandraDatacenterServicesMeta {
+	if in == nil {
+		return nil
+	}
+	out := new(CassandraDatacenterServicesMeta)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ResourceMeta) DeepCopyInto(out *ResourceMeta) {
+	*out = *in
+	in.Tags.DeepCopyInto(&out.Tags)
+	if in.CommonLabels != nil {
+		in, out := &in.CommonLabels, &out.CommonLabels
+		*out = make(map[string]string, len(*in))
+		for key, val := range *in {
+			(*out)[key] = val
+		}
+	}
+	in.Pods.DeepCopyInto(&out.Pods)
+	in.Service.DeepCopyInto(&out.Service)
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ResourceMeta.
+func (in *ResourceMeta) DeepCopy() *ResourceMeta {
+	if in == nil {
+		return nil
+	}
+	out := new(ResourceMeta)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *Tags) DeepCopyInto(out *Tags) {
+	*out = *in
+	if in.Labels != nil {
+		in, out := &in.Labels, &out.Labels
+		*out = make(map[string]string, len(*in))
+		for key, val := range *in {
+			(*out)[key] = val
+		}
+	}
+	if in.Annotations != nil {
+		in, out := &in.Annotations, &out.Annotations
+		*out = make(map[string]string, len(*in))
+		for key, val := range *in {
+			(*out)[key] = val
+		}
+	}
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Tags.
+func (in *Tags) DeepCopy() *Tags {
+	if in == nil {
+		return nil
+	}
+	out := new(Tags)
+	in.DeepCopyInto(out)
+	return out
+}
diff --git a/pkg/reaper/deployment.go b/pkg/reaper/deployment.go
index 7d028374..cd2633a4 100644
--- a/pkg/reaper/deployment.go
+++ b/pkg/reaper/deployment.go
@@ -12,6 +12,7 @@ import (
 	"github.com/k8ssandra/k8ssandra-operator/pkg/cassandra"
 	"github.com/k8ssandra/k8ssandra-operator/pkg/encryption"
 	"github.com/k8ssandra/k8ssandra-operator/pkg/images"
+	"github.com/k8ssandra/k8ssandra-operator/pkg/meta"
 	appsv1 "k8s.io/api/apps/v1"
 	corev1 "k8s.io/api/core/v1"
 	"k8s.io/apimachinery/pkg/api/resource"
@@ -42,8 +43,6 @@ var defaultImage = images.Image{
 }
 
 func NewDeployment(reaper *api.Reaper, dc *cassdcapi.CassandraDatacenter, keystorePassword *string, truststorePassword *string, authVars ...*corev1.EnvVar) *appsv1.Deployment {
-	labels := createServiceAndDeploymentLabels(reaper)
-
 	selector := metav1.LabelSelector{
 		MatchExpressions: []metav1.LabelSelectorRequirement{
 			{
@@ -184,17 +183,21 @@ func NewDeployment(reaper *api.Reaper, dc *cassdcapi.CassandraDatacenter, keysto
 	initContainerResources := computeInitContainerResources(reaper.Spec.InitContainerResources)
 	mainContainerResources := computeMainContainerResources(reaper.Spec.Resources)
 
+	podMeta := getPodMeta(reaper)
+
 	deployment := &appsv1.Deployment{
 		ObjectMeta: metav1.ObjectMeta{
-			Namespace: reaper.Namespace,
-			Name:      reaper.Name,
-			Labels:    labels,
+			Namespace:   reaper.Namespace,
+			Name:        reaper.Name,
+			Labels:      createServiceAndDeploymentLabels(reaper),
+			Annotations: map[string]string{},
 		},
 		Spec: appsv1.DeploymentSpec{
 			Selector: &selector,
 			Template: corev1.PodTemplateSpec{
 				ObjectMeta: metav1.ObjectMeta{
-					Labels: labels,
+					Labels:      podMeta.Labels,
+					Annotations: podMeta.Annotations,
 				},
 				Spec: corev1.PodSpec{
 					Affinity:       reaper.Spec.Affinity,
@@ -351,3 +354,18 @@ func getAdaptiveIncremental(reaper *api.Reaper, dc *cassdcapi.CassandraDatacente
 	}
 	return
 }
+
+func getPodMeta(reaper *api.Reaper) meta.Tags {
+	labels := createPodLabels(reaper)
+
+	var podAnnotations map[string]string
+	if meta := reaper.Spec.ResourceMeta; meta != nil {
+		podAnnotations = meta.Pods.Annotations
+
+	}
+
+	return meta.Tags{
+		Labels:      labels,
+		Annotations: podAnnotations,
+	}
+}
diff --git a/pkg/reaper/labels.go b/pkg/reaper/labels.go
index 14cae0d2..9b67d062 100644
--- a/pkg/reaper/labels.go
+++ b/pkg/reaper/labels.go
@@ -19,10 +19,10 @@ func createResourceLabels(kc *k8ssandraapi.K8ssandraCluster) map[string]string {
 		k8ssandraapi.K8ssandraClusterNamespaceLabel: kc.Namespace,
 		k8ssandraapi.CreatedByLabel:                 k8ssandraapi.CreatedByLabelValueK8ssandraClusterController,
 	}
-	return utils.MergeMap(labels, commonLabels)
+	return utils.MergeMap(commonLabels, labels)
 }
 
-func createServiceAndDeploymentLabels(r *reaperapi.Reaper) map[string]string {
+func getConstantLabels(r *reaperapi.Reaper) map[string]string {
 	labels := map[string]string{
 		reaperapi.ReaperLabel:       r.Name,
 		k8ssandraapi.CreatedByLabel: k8ssandraapi.CreatedByLabelValueReaperController,
@@ -36,5 +36,23 @@ func createServiceAndDeploymentLabels(r *reaperapi.Reaper) map[string]string {
 		labels[k8ssandraapi.K8ssandraClusterNamespaceLabel] = kcNamespace
 	}
 
-	return utils.MergeMap(labels, commonLabels)
+	return utils.MergeMap(commonLabels, labels)
+}
+
+func createServiceAndDeploymentLabels(r *reaperapi.Reaper) map[string]string {
+	labels := getConstantLabels(r)
+
+	if meta := r.Spec.ResourceMeta; meta != nil {
+		return utils.MergeMap(meta.CommonLabels, labels)
+	}
+
+	return labels
+}
+
+func createPodLabels(r *reaperapi.Reaper) map[string]string {
+	labels := createServiceAndDeploymentLabels(r)
+	if meta := r.Spec.ResourceMeta; meta != nil {
+		return utils.MergeMap(labels, meta.Pods.Labels)
+	}
+	return labels
 }
diff --git a/pkg/reaper/resource.go b/pkg/reaper/resource.go
index 8b546281..5adcd4a0 100644
--- a/pkg/reaper/resource.go
+++ b/pkg/reaper/resource.go
@@ -5,6 +5,7 @@ import (
 	k8ssandraapi "github.com/k8ssandra/k8ssandra-operator/apis/k8ssandra/v1alpha1"
 	reaperapi "github.com/k8ssandra/k8ssandra-operator/apis/reaper/v1alpha1"
 	"github.com/k8ssandra/k8ssandra-operator/pkg/annotations"
+	"github.com/k8ssandra/k8ssandra-operator/pkg/utils"
 	corev1 "k8s.io/api/core/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/types"
@@ -31,11 +32,17 @@ func NewReaper(
 	reaperTemplate *reaperapi.ReaperClusterTemplate,
 ) *reaperapi.Reaper {
 	labels := createResourceLabels(kc)
+	var anns map[string]string
+	if m := reaperTemplate.ResourceMeta; m != nil {
+		labels = utils.MergeMap(labels, m.Labels)
+		anns = m.Annotations
+	}
+
 	desiredReaper := &reaperapi.Reaper{
 		ObjectMeta: metav1.ObjectMeta{
 			Namespace:   reaperKey.Namespace,
 			Name:        reaperKey.Name,
-			Annotations: map[string]string{},
+			Annotations: anns,
 			Labels:      labels,
 		},
 		Spec: reaperapi.ReaperSpec{
diff --git a/pkg/reaper/service.go b/pkg/reaper/service.go
index d7439369..cd72fc72 100644
--- a/pkg/reaper/service.go
+++ b/pkg/reaper/service.go
@@ -3,6 +3,7 @@ package reaper
 import (
 	api "github.com/k8ssandra/k8ssandra-operator/apis/reaper/v1alpha1"
 	"github.com/k8ssandra/k8ssandra-operator/pkg/annotations"
+	"github.com/k8ssandra/k8ssandra-operator/pkg/utils"
 	corev1 "k8s.io/api/core/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/types"
@@ -14,12 +15,20 @@ func GetServiceName(reaperName string) string {
 }
 
 func NewService(key types.NamespacedName, reaper *api.Reaper) *corev1.Service {
-	labels := createServiceAndDeploymentLabels(reaper)
+	commonLabels := createServiceAndDeploymentLabels(reaper)
+
+	var serviceLabels, serviceAnnotations map[string]string
+	if meta := reaper.Spec.ResourceMeta; meta != nil {
+		serviceLabels = utils.MergeMap(commonLabels, meta.Service.Labels)
+		serviceAnnotations = meta.Service.Annotations
+	}
+
 	service := &corev1.Service{
 		ObjectMeta: metav1.ObjectMeta{
-			Name:      key.Name,
-			Namespace: key.Namespace,
-			Labels:    labels,
+			Name:        key.Name,
+			Namespace:   key.Namespace,
+			Labels:      serviceLabels,
+			Annotations: serviceAnnotations,
 		},
 		Spec: corev1.ServiceSpec{
 			Type: corev1.ServiceTypeClusterIP,
@@ -40,7 +49,7 @@ func NewService(key types.NamespacedName, reaper *api.Reaper) *corev1.Service {
 					StrVal: "admin",
 				},
 			}},
-			Selector: labels,
+			Selector: getConstantLabels(reaper),
 		},
 	}
 	annotations.AddHashAnnotation(service)
diff --git a/pkg/stargate/deployments.go b/pkg/stargate/deployments.go
index 50b497d7..d5b9cf68 100644
--- a/pkg/stargate/deployments.go
+++ b/pkg/stargate/deployments.go
@@ -8,6 +8,8 @@ import (
 	"github.com/k8ssandra/k8ssandra-operator/pkg/annotations"
 	"github.com/k8ssandra/k8ssandra-operator/pkg/encryption"
 	"github.com/k8ssandra/k8ssandra-operator/pkg/images"
+	"github.com/k8ssandra/k8ssandra-operator/pkg/meta"
+	"github.com/k8ssandra/k8ssandra-operator/pkg/utils"
 
 	cassdcapi "github.com/k8ssandra/cass-operator/apis/cassandra/v1beta1"
 	coreapi "github.com/k8ssandra/k8ssandra-operator/apis/k8ssandra/v1alpha1"
@@ -94,18 +96,14 @@ func NewDeployments(stargate *api.Stargate, dc *cassdcapi.CassandraDatacenter) m
 		tolerations := template.Tolerations
 		affinity := computeAffinity(template, dc, &rack)
 
+		podMeta := createPodMeta(stargate, deploymentName)
+
 		deployment := &appsv1.Deployment{
 			ObjectMeta: metav1.ObjectMeta{
 				Name:        deploymentName,
 				Namespace:   stargate.Namespace,
 				Annotations: map[string]string{},
-				Labels: map[string]string{
-					coreapi.NameLabel:      coreapi.NameLabelValue,
-					coreapi.PartOfLabel:    coreapi.PartOfLabelValue,
-					coreapi.ComponentLabel: coreapi.ComponentLabelValueStargate,
-					coreapi.CreatedByLabel: coreapi.CreatedByLabelValueStargateController,
-					api.StargateLabel:      stargate.Name,
-				},
+				Labels:      createDeploymentLabels(stargate),
 			},
 
 			Spec: appsv1.DeploymentSpec{
@@ -121,14 +119,8 @@ func NewDeployments(stargate *api.Stargate, dc *cassdcapi.CassandraDatacenter) m
 				Template: corev1.PodTemplateSpec{
 
 					ObjectMeta: metav1.ObjectMeta{
-						Labels: map[string]string{
-							coreapi.NameLabel:           coreapi.NameLabelValue,
-							coreapi.PartOfLabel:         coreapi.PartOfLabelValue,
-							coreapi.ComponentLabel:      coreapi.ComponentLabelValueStargate,
-							coreapi.CreatedByLabel:      coreapi.CreatedByLabelValueStargateController,
-							api.StargateLabel:           stargate.Name,
-							api.StargateDeploymentLabel: deploymentName,
-						},
+						Labels:      podMeta.Labels,
+						Annotations: podMeta.Annotations,
 					},
 
 					Spec: corev1.PodSpec{
@@ -468,6 +460,40 @@ func configureAuth(stargate *api.Stargate, deployment *appsv1.Deployment) {
 	}
 }
 
+func createDeploymentLabels(stargate *api.Stargate) map[string]string {
+	commonLabels := map[string]string{
+		coreapi.NameLabel:      coreapi.NameLabelValue,
+		coreapi.PartOfLabel:    coreapi.PartOfLabelValue,
+		coreapi.ComponentLabel: coreapi.ComponentLabelValueStargate,
+		coreapi.CreatedByLabel: coreapi.CreatedByLabelValueStargateController,
+		api.StargateLabel:      stargate.Name,
+	}
+
+	if m := stargate.Spec.ResourceMeta; m != nil && m.CommonLabels != nil {
+		return utils.MergeMap(commonLabels, m.CommonLabels)
+	}
+	return commonLabels
+}
+
+func createPodMeta(stargate *api.Stargate, deploymentName string) meta.Tags {
+	labels := map[string]string{
+		coreapi.NameLabel:           coreapi.NameLabelValue,
+		coreapi.PartOfLabel:         coreapi.PartOfLabelValue,
+		coreapi.ComponentLabel:      coreapi.ComponentLabelValueStargate,
+		coreapi.CreatedByLabel:      coreapi.CreatedByLabelValueStargateController,
+		api.StargateLabel:           stargate.Name,
+		api.StargateDeploymentLabel: deploymentName,
+	}
+
+	var annotations map[string]string
+	if m := stargate.Spec.ResourceMeta; m != nil {
+		labels = utils.MergeMap(labels, m.CommonLabels, m.Pods.Labels)
+		annotations = m.Pods.Annotations
+	}
+
+	return meta.Tags{Labels: labels, Annotations: annotations}
+}
+
 func GeneratedConfigMapName(clusterName, dcName string) string {
 	return fmt.Sprintf("%s-%s-%s", cassdcapi.CleanupForKubernetes(clusterName), dcName, cassandraConfigMap)
 }
diff --git a/pkg/stargate/service.go b/pkg/stargate/service.go
index 4c01c737..8b666184 100644
--- a/pkg/stargate/service.go
+++ b/pkg/stargate/service.go
@@ -5,6 +5,8 @@ import (
 	coreapi "github.com/k8ssandra/k8ssandra-operator/apis/k8ssandra/v1alpha1"
 	api "github.com/k8ssandra/k8ssandra-operator/apis/stargate/v1alpha1"
 	"github.com/k8ssandra/k8ssandra-operator/pkg/annotations"
+	"github.com/k8ssandra/k8ssandra-operator/pkg/meta"
+	"github.com/k8ssandra/k8ssandra-operator/pkg/utils"
 	corev1 "k8s.io/api/core/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 )
@@ -13,18 +15,13 @@ import (
 // resources.
 func NewService(stargate *api.Stargate, dc *cassdcapi.CassandraDatacenter) *corev1.Service {
 	serviceName := ServiceName(dc)
+	meta := createServiceMeta(stargate)
 	service := &corev1.Service{
 		ObjectMeta: metav1.ObjectMeta{
 			Name:        serviceName,
 			Namespace:   stargate.Namespace,
-			Annotations: map[string]string{},
-			Labels: map[string]string{
-				coreapi.NameLabel:      coreapi.NameLabelValue,
-				coreapi.PartOfLabel:    coreapi.PartOfLabelValue,
-				coreapi.ComponentLabel: coreapi.ComponentLabelValueStargate,
-				coreapi.CreatedByLabel: coreapi.CreatedByLabelValueStargateController,
-				api.StargateLabel:      stargate.Name,
-			},
+			Annotations: meta.Annotations,
+			Labels:      meta.Labels,
 		},
 		Spec: corev1.ServiceSpec{
 			Type: corev1.ServiceTypeClusterIP,
@@ -53,3 +50,26 @@ func NewService(stargate *api.Stargate, dc *cassdcapi.CassandraDatacenter) *core
 	annotations.AddHashAnnotation(service)
 	return service
 }
+
+func createServiceMeta(stargate *api.Stargate) meta.Tags {
+	labels := map[string]string{
+		coreapi.NameLabel:      coreapi.NameLabelValue,
+		coreapi.PartOfLabel:    coreapi.PartOfLabelValue,
+		coreapi.ComponentLabel: coreapi.ComponentLabelValueStargate,
+		coreapi.CreatedByLabel: coreapi.CreatedByLabelValueStargateController,
+		api.StargateLabel:      stargate.Name,
+	}
+
+	var annotations map[string]string
+	if meta := stargate.Spec.ResourceMeta; meta != nil {
+		labels = utils.MergeMap(labels, meta.CommonLabels, meta.Service.Labels)
+		annotations = meta.Service.Annotations
+
+	}
+
+	return meta.Tags{
+		Labels:      labels,
+		Annotations: annotations,
+	}
+
+}
diff --git a/pkg/stargate/stargate.go b/pkg/stargate/stargate.go
index 33a2b827..79f6c927 100644
--- a/pkg/stargate/stargate.go
+++ b/pkg/stargate/stargate.go
@@ -6,6 +6,8 @@ import (
 	api "github.com/k8ssandra/k8ssandra-operator/apis/k8ssandra/v1alpha1"
 	stargateapi "github.com/k8ssandra/k8ssandra-operator/apis/stargate/v1alpha1"
 	"github.com/k8ssandra/k8ssandra-operator/pkg/cassandra"
+	"github.com/k8ssandra/k8ssandra-operator/pkg/meta"
+	"github.com/k8ssandra/k8ssandra-operator/pkg/utils"
 	corev1 "k8s.io/api/core/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/types"
@@ -45,19 +47,14 @@ func NewStargate(
 		cassandraEncryption.ServerEncryptionStores = kc.Spec.Cassandra.ServerEncryptionStores
 	}
 
+	tags := createResourceMeta(stargateTemplate, kc)
+
 	desiredStargate := &stargateapi.Stargate{
 		ObjectMeta: metav1.ObjectMeta{
 			Namespace:   stargateKey.Namespace,
 			Name:        stargateKey.Name,
-			Annotations: map[string]string{},
-			Labels: map[string]string{
-				api.NameLabel:                      api.NameLabelValue,
-				api.PartOfLabel:                    api.PartOfLabelValue,
-				api.ComponentLabel:                 api.ComponentLabelValueStargate,
-				api.CreatedByLabel:                 api.CreatedByLabelValueK8ssandraClusterController,
-				api.K8ssandraClusterNameLabel:      kc.Name,
-				api.K8ssandraClusterNamespaceLabel: kc.Namespace,
-			},
+			Annotations: tags.Annotations,
+			Labels:      tags.Labels,
 		},
 		Spec: stargateapi.StargateSpec{
 			StargateDatacenterTemplate: *stargateTemplate,
@@ -69,3 +66,25 @@ func NewStargate(
 
 	return desiredStargate
 }
+
+func createResourceMeta(stargateTemplate *stargateapi.StargateDatacenterTemplate, kc *api.K8ssandraCluster) meta.Tags {
+	labels := map[string]string{
+		api.NameLabel:                      api.NameLabelValue,
+		api.PartOfLabel:                    api.PartOfLabelValue,
+		api.ComponentLabel:                 api.ComponentLabelValueStargate,
+		api.CreatedByLabel:                 api.CreatedByLabelValueK8ssandraClusterController,
+		api.K8ssandraClusterNameLabel:      kc.Name,
+		api.K8ssandraClusterNamespaceLabel: kc.Namespace,
+	}
+
+	var annotations map[string]string
+	if m := stargateTemplate.ResourceMeta; m != nil {
+		labels = utils.MergeMap(labels, m.Labels)
+		annotations = m.Annotations
+	}
+
+	return meta.Tags{
+		Annotations: annotations,
+		Labels:      labels,
+	}
+}


Test patch:
diff --git a/pkg/cassandra/config_test.go b/pkg/cassandra/config_test.go
index 4b67d654..c16215cd 100644
--- a/pkg/cassandra/config_test.go
+++ b/pkg/cassandra/config_test.go
@@ -272,3 +272,36 @@ func parseQuantity(quantity string) *resource.Quantity {
 	parsed := resource.MustParse(quantity)
 	return &parsed
 }
+
+func TestEnableSmartTokenAllocDse(t *testing.T) {
+	dcConfig := &DatacenterConfig{
+		ServerType: api.ServerDistributionDse,
+	}
+
+	EnableSmartTokenAllocation(dcConfig)
+	assert.Equal(t, int64(3), dcConfig.CassandraConfig.CassandraYaml["allocate_tokens_for_local_replication_factor"].(int64), "allocate_tokens_for_local_replication_factor should be set to 3 by default for DSE")
+}
+
+func TestOverrideSmartTokenAllocDse(t *testing.T) {
+	dcConfig := &DatacenterConfig{
+		ServerType: api.ServerDistributionDse,
+		CassandraConfig: api.CassandraConfig{
+			CassandraYaml: unstructured.Unstructured{
+				"allocate_tokens_for_local_replication_factor": int64(5),
+			},
+		},
+	}
+
+	EnableSmartTokenAllocation(dcConfig)
+	assert.Equal(t, int64(5), dcConfig.CassandraConfig.CassandraYaml["allocate_tokens_for_local_replication_factor"].(int64), "allocate_tokens_for_local_replication_factor should retain configured value")
+}
+
+func TestSmartTokenAllocCassandra(t *testing.T) {
+	dcConfig := &DatacenterConfig{
+		ServerType: api.ServerDistributionCassandra,
+	}
+
+	EnableSmartTokenAllocation(dcConfig)
+	_, exists := dcConfig.CassandraConfig.CassandraYaml["allocate_tokens_for_local_replication_factor"]
+	assert.False(t, exists, "allocate_tokens_for_local_replication_factor should not be set for Cassandra")
+}
diff --git a/pkg/cassandra/datacenter_test.go b/pkg/cassandra/datacenter_test.go
index 5cebdf79..117892c3 100644
--- a/pkg/cassandra/datacenter_test.go
+++ b/pkg/cassandra/datacenter_test.go
@@ -5,6 +5,7 @@ import (
 	"testing"
 
 	"github.com/k8ssandra/k8ssandra-operator/pkg/images"
+	"github.com/k8ssandra/k8ssandra-operator/pkg/meta"
 	"github.com/k8ssandra/k8ssandra-operator/pkg/unstructured"
 	"k8s.io/utils/pointer"
 
@@ -16,6 +17,7 @@ import (
 	api "github.com/k8ssandra/k8ssandra-operator/apis/k8ssandra/v1alpha1"
 	corev1 "k8s.io/api/core/v1"
 	"k8s.io/apimachinery/pkg/api/resource"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/types"
 )
 
@@ -47,8 +49,12 @@ func TestCoalesce(t *testing.T) {
 				Meta: api.EmbeddedObjectMeta{
 					Namespace: "k8ssandra",
 					Name:      "dc1",
-					Labels: map[string]string{
-						"env": "dev",
+					Metadata: meta.CassandraDatacenterMeta{
+						Tags: meta.Tags{
+							Labels: map[string]string{
+								"env": "dev",
+							},
+						},
 					},
 				},
 				Size: 3,
@@ -58,8 +64,12 @@ func TestCoalesce(t *testing.T) {
 				Meta: api.EmbeddedObjectMeta{
 					Namespace: "k8ssandra",
 					Name:      "dc1",
-					Labels: map[string]string{
-						"env": "dev",
+					Metadata: meta.CassandraDatacenterMeta{
+						Tags: meta.Tags{
+							Labels: map[string]string{
+								"env": "dev",
+							},
+						},
 					},
 				},
 				SuperuserSecretRef: corev1.LocalObjectReference{Name: "test-superuser"},
@@ -324,8 +334,12 @@ func TestCoalesce(t *testing.T) {
 				Meta: api.EmbeddedObjectMeta{
 					Namespace: "k8ssandra",
 					Name:      "dc1",
-					Labels: map[string]string{
-						"env": "dev",
+					Metadata: meta.CassandraDatacenterMeta{
+						Tags: meta.Tags{
+							Labels: map[string]string{
+								"env": "dev",
+							},
+						},
 					},
 				},
 				Size: 3,
@@ -338,8 +352,12 @@ func TestCoalesce(t *testing.T) {
 				Meta: api.EmbeddedObjectMeta{
 					Namespace: "k8ssandra",
 					Name:      "dc1",
-					Labels: map[string]string{
-						"env": "dev",
+					Metadata: meta.CassandraDatacenterMeta{
+						Tags: meta.Tags{
+							Labels: map[string]string{
+								"env": "dev",
+							},
+						},
 					},
 				},
 				SuperuserSecretRef: corev1.LocalObjectReference{Name: "test-superuser"},
@@ -365,8 +383,12 @@ func TestCoalesce(t *testing.T) {
 				Meta: api.EmbeddedObjectMeta{
 					Namespace: "k8ssandra",
 					Name:      "dc1",
-					Labels: map[string]string{
-						"env": "dev",
+					Metadata: meta.CassandraDatacenterMeta{
+						Tags: meta.Tags{
+							Labels: map[string]string{
+								"env": "dev",
+							},
+						},
 					},
 				},
 				Size: 3,
@@ -376,8 +398,12 @@ func TestCoalesce(t *testing.T) {
 				Meta: api.EmbeddedObjectMeta{
 					Namespace: "k8ssandra",
 					Name:      "dc1",
-					Labels: map[string]string{
-						"env": "dev",
+					Metadata: meta.CassandraDatacenterMeta{
+						Tags: meta.Tags{
+							Labels: map[string]string{
+								"env": "dev",
+							},
+						},
 					},
 				},
 				SuperuserSecretRef: corev1.LocalObjectReference{Name: "test-superuser"},
@@ -878,6 +904,373 @@ func TestCoalesce(t *testing.T) {
 				},
 			},
 		},
+		{
+			name: "Set Cluster Pod Tags",
+			clusterTemplate: &api.CassandraClusterTemplate{
+				DatacenterOptions: api.DatacenterOptions{},
+				Meta: meta.CassandraDatacenterMeta{
+					CommonLabels: map[string]string{
+						"common": "label",
+					},
+					Pods: meta.Tags{
+						Labels:      map[string]string{"label": "lvalue"},
+						Annotations: map[string]string{"annotation:": "avalue"},
+					},
+				},
+			},
+			dcTemplate: &api.CassandraDatacenterTemplate{
+				DatacenterOptions: api.DatacenterOptions{},
+			},
+			want: &DatacenterConfig{
+				Meta: api.EmbeddedObjectMeta{
+					Name: "",
+					Metadata: meta.CassandraDatacenterMeta{
+						CommonLabels: map[string]string{
+							"common": "label",
+						},
+						Pods: meta.Tags{
+							Labels:      map[string]string{"label": "lvalue"},
+							Annotations: map[string]string{"annotation:": "avalue"},
+						},
+					},
+				},
+				PodTemplateSpec: corev1.PodTemplateSpec{
+					ObjectMeta: metav1.ObjectMeta{
+						Labels:      map[string]string{"label": "lvalue"},
+						Annotations: map[string]string{"annotation:": "avalue"},
+					},
+					Spec: corev1.PodSpec{
+						Containers: []corev1.Container{{Name: "cassandra"}},
+					},
+				},
+			},
+		},
+		{
+			name: "Set DC Pod Tags",
+			clusterTemplate: &api.CassandraClusterTemplate{
+				DatacenterOptions: api.DatacenterOptions{},
+			},
+			dcTemplate: &api.CassandraDatacenterTemplate{
+				DatacenterOptions: api.DatacenterOptions{},
+				Meta: api.EmbeddedObjectMeta{
+					Name: "",
+					Metadata: meta.CassandraDatacenterMeta{
+						CommonLabels: map[string]string{
+							"common": "label",
+						},
+						Pods: meta.Tags{
+							Labels:      map[string]string{"label": "lvalue"},
+							Annotations: map[string]string{"annotation:": "avalue"},
+						},
+					},
+				},
+			},
+			want: &DatacenterConfig{
+				Meta: api.EmbeddedObjectMeta{
+					Name: "",
+					Metadata: meta.CassandraDatacenterMeta{
+						CommonLabels: map[string]string{
+							"common": "label",
+						},
+						Pods: meta.Tags{
+							Labels:      map[string]string{"label": "lvalue"},
+							Annotations: map[string]string{"annotation:": "avalue"},
+						},
+					},
+				},
+				PodTemplateSpec: corev1.PodTemplateSpec{
+					ObjectMeta: metav1.ObjectMeta{
+						Labels:      map[string]string{"label": "lvalue"},
+						Annotations: map[string]string{"annotation:": "avalue"},
+					},
+					Spec: corev1.PodSpec{
+						Containers: []corev1.Container{{Name: "cassandra"}},
+					},
+				},
+			},
+		},
+		{
+			name: "Set Cluster & DC Pod Tags",
+			clusterTemplate: &api.CassandraClusterTemplate{
+				DatacenterOptions: api.DatacenterOptions{},
+				Meta: meta.CassandraDatacenterMeta{
+					Pods: meta.Tags{
+						Labels:      map[string]string{"label": "lvalue", "cluster": "cluster"},
+						Annotations: map[string]string{"annotation:": "avalue", "cluster": "cluster"},
+					},
+				},
+			},
+			dcTemplate: &api.CassandraDatacenterTemplate{
+				DatacenterOptions: api.DatacenterOptions{},
+				Meta: api.EmbeddedObjectMeta{
+					Name: "",
+					Metadata: meta.CassandraDatacenterMeta{
+						Pods: meta.Tags{
+							Labels:      map[string]string{"label": "dcvalue", "dc": "dc"},
+							Annotations: map[string]string{"annotation:": "dcvalue", "dc": "dc"},
+						},
+					},
+				},
+			},
+			want: &DatacenterConfig{
+				Meta: api.EmbeddedObjectMeta{
+					Name: "",
+					Metadata: meta.CassandraDatacenterMeta{
+						Pods: meta.Tags{
+							Labels:      map[string]string{"label": "dcvalue", "dc": "dc", "cluster": "cluster"},
+							Annotations: map[string]string{"annotation:": "dcvalue", "dc": "dc", "cluster": "cluster"},
+						},
+					},
+				},
+				PodTemplateSpec: corev1.PodTemplateSpec{
+					ObjectMeta: metav1.ObjectMeta{
+						Labels:      map[string]string{"label": "dcvalue", "cluster": "cluster", "dc": "dc"},
+						Annotations: map[string]string{"annotation:": "dcvalue", "cluster": "cluster", "dc": "dc"},
+					},
+					Spec: corev1.PodSpec{
+						Containers: []corev1.Container{{Name: "cassandra"}},
+					},
+				},
+			},
+		},
+		{
+			name: "Set Cluster Service Tags",
+			clusterTemplate: &api.CassandraClusterTemplate{
+				DatacenterOptions: api.DatacenterOptions{},
+				Meta: meta.CassandraDatacenterMeta{
+					CommonLabels: map[string]string{
+						"common": "label",
+					},
+					ServiceConfig: meta.CassandraDatacenterServicesMeta{
+						DatacenterService: meta.Tags{
+							Labels:      map[string]string{"dclabel": "dcvalue"},
+							Annotations: map[string]string{"dcannotation:": "dcvalue"},
+						},
+						SeedService: meta.Tags{
+							Labels:      map[string]string{"seedlabel": "seedvalue"},
+							Annotations: map[string]string{"seedannotation:": "seedvalue"},
+						},
+						AdditionalSeedService: meta.Tags{
+							Labels:      map[string]string{"aslabel": "asvalue"},
+							Annotations: map[string]string{"asannotation:": "asvalue"},
+						},
+						AllPodsService: meta.Tags{
+							Labels:      map[string]string{"aplabel": "apvalue"},
+							Annotations: map[string]string{"apannotation:": "apvalue"},
+						},
+						NodePortService: meta.Tags{
+							Labels:      map[string]string{"nodeportlabel": "nodeportval"},
+							Annotations: map[string]string{"nodeportann:": "nodeportvalue"},
+						},
+					},
+				},
+			},
+			dcTemplate: &api.CassandraDatacenterTemplate{
+				DatacenterOptions: api.DatacenterOptions{},
+			},
+			want: &DatacenterConfig{
+				Meta: api.EmbeddedObjectMeta{
+					Metadata: meta.CassandraDatacenterMeta{
+						CommonLabels: map[string]string{
+							"common": "label",
+						},
+						ServiceConfig: meta.CassandraDatacenterServicesMeta{
+							DatacenterService: meta.Tags{
+								Labels:      map[string]string{"dclabel": "dcvalue"},
+								Annotations: map[string]string{"dcannotation:": "dcvalue"},
+							},
+							SeedService: meta.Tags{
+								Labels:      map[string]string{"seedlabel": "seedvalue"},
+								Annotations: map[string]string{"seedannotation:": "seedvalue"},
+							},
+							AdditionalSeedService: meta.Tags{
+								Labels:      map[string]string{"aslabel": "asvalue"},
+								Annotations: map[string]string{"asannotation:": "asvalue"},
+							},
+							AllPodsService: meta.Tags{
+								Labels:      map[string]string{"aplabel": "apvalue"},
+								Annotations: map[string]string{"apannotation:": "apvalue"},
+							},
+							NodePortService: meta.Tags{
+								Labels:      map[string]string{"nodeportlabel": "nodeportval"},
+								Annotations: map[string]string{"nodeportann:": "nodeportvalue"},
+							},
+						},
+					},
+				},
+				PodTemplateSpec: corev1.PodTemplateSpec{
+					Spec: corev1.PodSpec{
+						Containers: []corev1.Container{{Name: "cassandra"}},
+					},
+				},
+			},
+		},
+		{
+			name: "Set DC Service Tags",
+			clusterTemplate: &api.CassandraClusterTemplate{
+				DatacenterOptions: api.DatacenterOptions{},
+			},
+			dcTemplate: &api.CassandraDatacenterTemplate{
+				DatacenterOptions: api.DatacenterOptions{},
+				Meta: api.EmbeddedObjectMeta{
+					Metadata: meta.CassandraDatacenterMeta{
+						CommonLabels: map[string]string{
+							"common": "label",
+						},
+						ServiceConfig: meta.CassandraDatacenterServicesMeta{
+							DatacenterService: meta.Tags{
+								Labels:      map[string]string{"dclabel": "dcvalue"},
+								Annotations: map[string]string{"dcannotation:": "dcvalue"},
+							},
+							SeedService: meta.Tags{
+								Labels:      map[string]string{"seedlabel": "seedvalue"},
+								Annotations: map[string]string{"seedannotation:": "seedvalue"},
+							},
+							AdditionalSeedService: meta.Tags{
+								Labels:      map[string]string{"aslabel": "asvalue"},
+								Annotations: map[string]string{"asannotation:": "asvalue"},
+							},
+							AllPodsService: meta.Tags{
+								Labels:      map[string]string{"aplabel": "apvalue"},
+								Annotations: map[string]string{"apannotation:": "apvalue"},
+							},
+							NodePortService: meta.Tags{
+								Labels:      map[string]string{"nodeportlabel": "nodeportval"},
+								Annotations: map[string]string{"nodeportann:": "nodeportvalue"},
+							},
+						},
+					},
+				},
+			},
+			want: &DatacenterConfig{
+				Meta: api.EmbeddedObjectMeta{
+					Metadata: meta.CassandraDatacenterMeta{
+						CommonLabels: map[string]string{
+							"common": "label",
+						},
+						ServiceConfig: meta.CassandraDatacenterServicesMeta{
+							DatacenterService: meta.Tags{
+								Labels:      map[string]string{"dclabel": "dcvalue"},
+								Annotations: map[string]string{"dcannotation:": "dcvalue"},
+							},
+							SeedService: meta.Tags{
+								Labels:      map[string]string{"seedlabel": "seedvalue"},
+								Annotations: map[string]string{"seedannotation:": "seedvalue"},
+							},
+							AdditionalSeedService: meta.Tags{
+								Labels:      map[string]string{"aslabel": "asvalue"},
+								Annotations: map[string]string{"asannotation:": "asvalue"},
+							},
+							AllPodsService: meta.Tags{
+								Labels:      map[string]string{"aplabel": "apvalue"},
+								Annotations: map[string]string{"apannotation:": "apvalue"},
+							},
+							NodePortService: meta.Tags{
+								Labels:      map[string]string{"nodeportlabel": "nodeportval"},
+								Annotations: map[string]string{"nodeportann:": "nodeportvalue"},
+							},
+						},
+					},
+				},
+				PodTemplateSpec: corev1.PodTemplateSpec{
+					Spec: corev1.PodSpec{
+						Containers: []corev1.Container{{Name: "cassandra"}},
+					},
+				},
+			},
+		},
+		{
+			name: "Set Cluster & DC Service Tags",
+			clusterTemplate: &api.CassandraClusterTemplate{
+				DatacenterOptions: api.DatacenterOptions{},
+				Meta: meta.CassandraDatacenterMeta{
+					ServiceConfig: meta.CassandraDatacenterServicesMeta{
+						DatacenterService: meta.Tags{
+							Labels:      map[string]string{"dclabel": "cl_value"},
+							Annotations: map[string]string{"dcannotation:": "cl_value"},
+						},
+						SeedService: meta.Tags{
+							Labels:      map[string]string{"seedlabel": "cl_seedvalue"},
+							Annotations: map[string]string{"seedannotation:": "cl_seedvalue"},
+						},
+						AdditionalSeedService: meta.Tags{
+							Labels:      map[string]string{"aslabel": "cl_asvalue"},
+							Annotations: map[string]string{"asannotation:": "cl_asvalue"},
+						},
+						AllPodsService: meta.Tags{
+							Labels:      map[string]string{"aplabel": "cl_apvalue"},
+							Annotations: map[string]string{"apannotation:": "cl_apvalue"},
+						},
+						NodePortService: meta.Tags{
+							Labels:      map[string]string{"cl_nodeportlabel": "nodeportval"},
+							Annotations: map[string]string{"cl_nodeportann:": "nodeportvalue"},
+						},
+					},
+				},
+			},
+			dcTemplate: &api.CassandraDatacenterTemplate{
+				DatacenterOptions: api.DatacenterOptions{},
+				Meta: api.EmbeddedObjectMeta{
+					Metadata: meta.CassandraDatacenterMeta{
+						ServiceConfig: meta.CassandraDatacenterServicesMeta{
+							DatacenterService: meta.Tags{
+								Labels:      map[string]string{"dclabel": "dcvalue"},
+								Annotations: map[string]string{"dcannotation:": "dcvalue"},
+							},
+							SeedService: meta.Tags{
+								Labels:      map[string]string{"seedlabel": "seedvalue"},
+								Annotations: map[string]string{"seedannotation:": "seedvalue"},
+							},
+							AdditionalSeedService: meta.Tags{
+								Labels:      map[string]string{"aslabel": "asvalue"},
+								Annotations: map[string]string{"asannotation:": "asvalue"},
+							},
+							AllPodsService: meta.Tags{
+								Labels:      map[string]string{"aplabel": "apvalue"},
+								Annotations: map[string]string{"apannotation:": "apvalue"},
+							},
+							NodePortService: meta.Tags{
+								Labels:      map[string]string{"nodeportlabel": "nodeportval"},
+								Annotations: map[string]string{"nodeportann:": "nodeportvalue"},
+							},
+						},
+					},
+				},
+			},
+			want: &DatacenterConfig{
+				Meta: api.EmbeddedObjectMeta{
+					Metadata: meta.CassandraDatacenterMeta{
+						ServiceConfig: meta.CassandraDatacenterServicesMeta{
+							DatacenterService: meta.Tags{
+								Labels:      map[string]string{"dclabel": "dcvalue"},
+								Annotations: map[string]string{"dcannotation:": "dcvalue"},
+							},
+							SeedService: meta.Tags{
+								Labels:      map[string]string{"seedlabel": "seedvalue"},
+								Annotations: map[string]string{"seedannotation:": "seedvalue"},
+							},
+							AdditionalSeedService: meta.Tags{
+								Labels:      map[string]string{"aslabel": "asvalue"},
+								Annotations: map[string]string{"asannotation:": "asvalue"},
+							},
+							AllPodsService: meta.Tags{
+								Labels:      map[string]string{"aplabel": "apvalue"},
+								Annotations: map[string]string{"apannotation:": "apvalue"},
+							},
+							NodePortService: meta.Tags{
+								Labels:      map[string]string{"nodeportlabel": "nodeportval", "cl_nodeportlabel": "nodeportval"},
+								Annotations: map[string]string{"nodeportann:": "nodeportvalue", "cl_nodeportann:": "nodeportvalue"},
+							},
+						},
+					},
+				},
+				PodTemplateSpec: corev1.PodTemplateSpec{
+					Spec: corev1.PodSpec{
+						Containers: []corev1.Container{{Name: "cassandra"}},
+					},
+				},
+			},
+		},
 	}
 
 	for _, tc := range tests {
@@ -1028,8 +1421,12 @@ func GetDatacenterConfig() DatacenterConfig {
 		Meta: api.EmbeddedObjectMeta{
 			Namespace: "k8ssandra",
 			Name:      "dc1",
-			Labels: map[string]string{
-				"env": "dev",
+			Metadata: meta.CassandraDatacenterMeta{
+				Tags: meta.Tags{
+					Labels: map[string]string{
+						"env": "dev",
+					},
+				},
 			},
 		},
 		SuperuserSecretRef: corev1.LocalObjectReference{Name: "test-superuser"},
diff --git a/pkg/reaper/deployment_test.go b/pkg/reaper/deployment_test.go
index 1d0d8cea..1eeb9b39 100644
--- a/pkg/reaper/deployment_test.go
+++ b/pkg/reaper/deployment_test.go
@@ -8,6 +8,8 @@ import (
 	reaperapi "github.com/k8ssandra/k8ssandra-operator/apis/reaper/v1alpha1"
 	"github.com/k8ssandra/k8ssandra-operator/pkg/encryption"
 	"github.com/k8ssandra/k8ssandra-operator/pkg/images"
+	"github.com/k8ssandra/k8ssandra-operator/pkg/meta"
+	"github.com/k8ssandra/k8ssandra-operator/pkg/utils"
 	"github.com/stretchr/testify/assert"
 	corev1 "k8s.io/api/core/v1"
 	"k8s.io/apimachinery/pkg/api/resource"
@@ -33,8 +35,21 @@ func TestNewDeployment(t *testing.T) {
 			Name: "truststore-secret",
 		}},
 	}
+	reaper.Spec.ResourceMeta = &meta.ResourceMeta{
+		CommonLabels: map[string]string{"common": "everywhere", "override": "commonLevel"},
+		Pods: meta.Tags{
+			Labels:      map[string]string{"pod-label": "pod-label-value", "override": "podLevel"},
+			Annotations: map[string]string{"pod-annotation": "pod-annotation-value"},
+		},
+		Service: meta.Tags{
+			Labels:      map[string]string{"service-label": "service-label-value"},
+			Annotations: map[string]string{"service-annotation": "service-annotation-value"},
+		},
+	}
 
 	labels := createServiceAndDeploymentLabels(reaper)
+	podLabels := utils.MergeMap(labels, reaper.Spec.ResourceMeta.Pods.Labels)
+
 	deployment := NewDeployment(reaper, newTestDatacenter(), pointer.String("keystore-password"), pointer.String("truststore-password"))
 
 	assert.Equal(t, reaper.Namespace, deployment.Namespace)
@@ -57,7 +72,8 @@ func TestNewDeployment(t *testing.T) {
 		},
 	})
 
-	assert.Equal(t, labels, deployment.Spec.Template.Labels)
+	assert.Equal(t, podLabels, deployment.Spec.Template.Labels)
+	assert.Equal(t, reaper.Spec.ResourceMeta.Pods.Annotations, deployment.Spec.Template.Annotations)
 
 	podSpec := deployment.Spec.Template.Spec
 	assert.Len(t, podSpec.Containers, 1)
@@ -445,6 +461,17 @@ func newTestReaper() *reaperapi.Reaper {
 			},
 			ReaperTemplate: reaperapi.ReaperTemplate{
 				Keyspace: "reaper_db",
+				ResourceMeta: &meta.ResourceMeta{
+					CommonLabels: map[string]string{"common": "everywhere", "override": "commonLevel"},
+					Pods: meta.Tags{
+						Labels:      map[string]string{"pod-label": "pod-label-value", "override": "podLevel"},
+						Annotations: map[string]string{"pod-annotation": "pod-annotation-value"},
+					},
+					Service: meta.Tags{
+						Labels:      map[string]string{"service-label": "service-label-value", "override": "serviceLevel"},
+						Annotations: map[string]string{"service-annotation": "service-annotation-value"},
+					},
+				},
 			},
 		},
 	}
@@ -515,3 +542,34 @@ func TestCustomResources(t *testing.T) {
 	assert.Equal(t, resource.MustParse("4"), *deployment.Spec.Template.Spec.Containers[0].Resources.Requests.Cpu(), "expected main container cpu request to be set")
 	assert.Equal(t, resource.MustParse("20Gi"), *deployment.Spec.Template.Spec.Containers[0].Resources.Limits.Memory(), "expected main container memory limit to be set")
 }
+
+func TestLabelsAnnotations(t *testing.T) {
+	reaper := newTestReaper()
+	deployment := NewDeployment(reaper, newTestDatacenter(), nil, nil)
+
+	deploymentLabels := map[string]string{
+		k8ssandraapi.NameLabel:      k8ssandraapi.NameLabelValue,
+		k8ssandraapi.PartOfLabel:    k8ssandraapi.PartOfLabelValue,
+		k8ssandraapi.ComponentLabel: k8ssandraapi.ComponentLabelValueReaper,
+		k8ssandraapi.ManagedByLabel: k8ssandraapi.NameLabelValue,
+		reaperapi.ReaperLabel:       reaper.Name,
+		k8ssandraapi.CreatedByLabel: k8ssandraapi.CreatedByLabelValueReaperController,
+		"common":                    "everywhere",
+		"override":                  "commonLevel",
+	}
+
+	podLabels := map[string]string{
+		k8ssandraapi.NameLabel:      k8ssandraapi.NameLabelValue,
+		k8ssandraapi.PartOfLabel:    k8ssandraapi.PartOfLabelValue,
+		k8ssandraapi.ComponentLabel: k8ssandraapi.ComponentLabelValueReaper,
+		k8ssandraapi.ManagedByLabel: k8ssandraapi.NameLabelValue,
+		reaperapi.ReaperLabel:       reaper.Name,
+		k8ssandraapi.CreatedByLabel: k8ssandraapi.CreatedByLabelValueReaperController,
+		"common":                    "everywhere",
+		"override":                  "podLevel",
+		"pod-label":                 "pod-label-value",
+	}
+
+	assert.Equal(t, deploymentLabels, deployment.Labels)
+	assert.Equal(t, podLabels, deployment.Spec.Template.Labels)
+}
diff --git a/pkg/reaper/service_test.go b/pkg/reaper/service_test.go
index 78ea7f09..e8e442ee 100644
--- a/pkg/reaper/service_test.go
+++ b/pkg/reaper/service_test.go
@@ -3,6 +3,8 @@ package reaper
 import (
 	"testing"
 
+	k8ssandraapi "github.com/k8ssandra/k8ssandra-operator/apis/k8ssandra/v1alpha1"
+	reaperapi "github.com/k8ssandra/k8ssandra-operator/apis/reaper/v1alpha1"
 	"github.com/stretchr/testify/assert"
 	corev1 "k8s.io/api/core/v1"
 	"k8s.io/apimachinery/pkg/types"
@@ -17,9 +19,31 @@ func TestNewService(t *testing.T) {
 
 	assert.Equal(t, key.Name, service.Name)
 	assert.Equal(t, key.Namespace, service.Namespace)
-	assert.Equal(t, createServiceAndDeploymentLabels(reaper), service.Labels)
 
-	assert.Equal(t, createServiceAndDeploymentLabels(reaper), service.Spec.Selector)
+	selectorLabels := map[string]string{
+		k8ssandraapi.NameLabel:      k8ssandraapi.NameLabelValue,
+		k8ssandraapi.PartOfLabel:    k8ssandraapi.PartOfLabelValue,
+		k8ssandraapi.ComponentLabel: k8ssandraapi.ComponentLabelValueReaper,
+		k8ssandraapi.ManagedByLabel: k8ssandraapi.NameLabelValue,
+		reaperapi.ReaperLabel:       reaper.Name,
+		k8ssandraapi.CreatedByLabel: k8ssandraapi.CreatedByLabelValueReaperController,
+	}
+
+	serviceLabels := map[string]string{
+		k8ssandraapi.NameLabel:      k8ssandraapi.NameLabelValue,
+		k8ssandraapi.PartOfLabel:    k8ssandraapi.PartOfLabelValue,
+		k8ssandraapi.ComponentLabel: k8ssandraapi.ComponentLabelValueReaper,
+		k8ssandraapi.ManagedByLabel: k8ssandraapi.NameLabelValue,
+		reaperapi.ReaperLabel:       reaper.Name,
+		k8ssandraapi.CreatedByLabel: k8ssandraapi.CreatedByLabelValueReaperController,
+		"common":                    "everywhere",
+		"service-label":             "service-label-value",
+		"override":                  "serviceLevel",
+	}
+
+	assert.Equal(t, serviceLabels, service.Labels)
+
+	assert.Equal(t, selectorLabels, service.Spec.Selector)
 	assert.Len(t, service.Spec.Ports, 2)
 
 	appPort := corev1.ServicePort{
diff --git a/pkg/stargate/deployments_test.go b/pkg/stargate/deployments_test.go
index 17737c80..13f4d616 100644
--- a/pkg/stargate/deployments_test.go
+++ b/pkg/stargate/deployments_test.go
@@ -11,6 +11,7 @@ import (
 	cassdcapi "github.com/k8ssandra/cass-operator/apis/cassandra/v1beta1"
 	api "github.com/k8ssandra/k8ssandra-operator/apis/stargate/v1alpha1"
 	"github.com/k8ssandra/k8ssandra-operator/pkg/encryption"
+	"github.com/k8ssandra/k8ssandra-operator/pkg/meta"
 	"github.com/k8ssandra/k8ssandra-operator/pkg/utils"
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
@@ -43,7 +44,22 @@ var (
 		Spec: api.StargateSpec{
 			DatacenterRef: corev1.LocalObjectReference{Name: dc.Name},
 			StargateDatacenterTemplate: api.StargateDatacenterTemplate{
-				StargateClusterTemplate: api.StargateClusterTemplate{Size: 1},
+				StargateClusterTemplate: api.StargateClusterTemplate{
+					StargateTemplate: api.StargateTemplate{
+						ResourceMeta: &meta.ResourceMeta{
+							CommonLabels: map[string]string{"common": "everywhere", "override": "commonLevel"},
+							Pods: meta.Tags{
+								Labels:      map[string]string{"pod-label": "pod-label-value", "override": "podLevel"},
+								Annotations: map[string]string{"pod-annotation": "pod-annotation-value"},
+							},
+							Service: meta.Tags{
+								Labels:      map[string]string{"service-label": "service-label-value", "override": "serviceLevel"},
+								Annotations: map[string]string{"service-annotation": "service-annotation-value"},
+							},
+						},
+					},
+					Size: 1,
+				},
 			},
 			CassandraEncryption: &api.CassandraEncryption{
 				ServerEncryptionStores: &encryption.Stores{
@@ -81,7 +97,6 @@ func TestNewDeployments(t *testing.T) {
 }
 
 func testNewDeploymentsDefaultRackSingleReplica(t *testing.T) {
-
 	deployments := NewDeployments(stargate, dc)
 	require.Len(t, deployments, 1)
 	require.Contains(t, deployments, "cluster1-dc1-default-stargate-deployment")
@@ -106,6 +121,11 @@ func testNewDeploymentsDefaultRackSingleReplica(t *testing.T) {
 	assert.Equal(t, affinityForRack(dc, "default"), deployment.Spec.Template.Spec.Affinity)
 	assert.Nil(t, deployment.Spec.Template.Spec.Tolerations)
 
+	assert.Equal(t, "pod-label-value", deployment.Spec.Template.Labels["pod-label"])
+	assert.Equal(t, "podLevel", deployment.Spec.Template.Labels["override"])
+	assert.Equal(t, "everywhere", deployment.Spec.Template.Labels["common"])
+	assert.Equal(t, "pod-annotation-value", deployment.Spec.Template.Annotations["pod-annotation"])
+
 	container := findContainer(&deployment, deployment.Name)
 	require.NotNil(t, container, "failed to find stargate container")
 
@@ -191,6 +211,10 @@ func testNewDeploymentsSingleRackManyReplicas(t *testing.T) {
 	assert.Equal(t, "s1", deployment.Spec.Template.Labels[api.StargateLabel])
 	assert.Contains(t, deployment.Spec.Template.Labels, api.StargateDeploymentLabel)
 	assert.Equal(t, "cluster1-dc1-rack1-stargate-deployment", deployment.Spec.Template.Labels[api.StargateDeploymentLabel])
+	assert.Equal(t, "pod-label-value", deployment.Spec.Template.Labels["pod-label"])
+	assert.Equal(t, "podLevel", deployment.Spec.Template.Labels["override"])
+	assert.Equal(t, "everywhere", deployment.Spec.Template.Labels["common"])
+	assert.Equal(t, "pod-annotation-value", deployment.Spec.Template.Annotations["pod-annotation"])
 
 	assert.Equal(t, affinityForRack(dc, "rack1"), deployment.Spec.Template.Spec.Affinity)
 	assert.Nil(t, deployment.Spec.Template.Spec.Tolerations)
@@ -236,6 +260,10 @@ func testNewDeploymentsManyRacksManyReplicas(t *testing.T) {
 	assert.Equal(t, "s1", deployment1.Spec.Template.Labels[api.StargateLabel])
 	assert.Contains(t, deployment1.Spec.Template.Labels, api.StargateDeploymentLabel)
 	assert.Equal(t, "cluster1-dc1-rack1-stargate-deployment", deployment1.Spec.Template.Labels[api.StargateDeploymentLabel])
+	assert.Equal(t, "pod-label-value", deployment1.Spec.Template.Labels["pod-label"])
+	assert.Equal(t, "podLevel", deployment1.Spec.Template.Labels["override"])
+	assert.Equal(t, "everywhere", deployment1.Spec.Template.Labels["common"])
+	assert.Equal(t, "pod-annotation-value", deployment1.Spec.Template.Annotations["pod-annotation"])
 	assert.Equal(t, affinityForRack(dc, "rack1"), deployment1.Spec.Template.Spec.Affinity)
 	assert.Nil(t, deployment1.Spec.Template.Spec.NodeSelector)
 	assert.Nil(t, deployment1.Spec.Template.Spec.Tolerations)
@@ -253,7 +281,12 @@ func testNewDeploymentsManyRacksManyReplicas(t *testing.T) {
 	assert.Contains(t, deployment2.Spec.Template.Labels, api.StargateLabel)
 	assert.Equal(t, "s1", deployment2.Spec.Template.Labels[api.StargateLabel])
 	assert.Contains(t, deployment2.Spec.Template.Labels, api.StargateDeploymentLabel)
+
 	assert.Equal(t, "cluster1-dc1-rack2-stargate-deployment", deployment2.Spec.Template.Labels[api.StargateDeploymentLabel])
+	assert.Equal(t, "pod-label-value", deployment2.Spec.Template.Labels["pod-label"])
+	assert.Equal(t, "podLevel", deployment2.Spec.Template.Labels["override"])
+	assert.Equal(t, "everywhere", deployment2.Spec.Template.Labels["common"])
+	assert.Equal(t, "pod-annotation-value", deployment2.Spec.Template.Annotations["pod-annotation"])
 	assert.Equal(t, affinityForRack(dc, "rack2"), deployment2.Spec.Template.Spec.Affinity)
 	assert.Nil(t, deployment1.Spec.Template.Spec.NodeSelector)
 	assert.Nil(t, deployment1.Spec.Template.Spec.Tolerations)
@@ -269,6 +302,10 @@ func testNewDeploymentsManyRacksManyReplicas(t *testing.T) {
 	assert.Contains(t, deployment3.Spec.Selector.MatchLabels, api.StargateDeploymentLabel)
 	assert.Equal(t, "cluster1-dc1-rack3-stargate-deployment", deployment3.Spec.Selector.MatchLabels[api.StargateDeploymentLabel])
 	assert.Contains(t, deployment3.Spec.Template.Labels, api.StargateLabel)
+	assert.Equal(t, "pod-label-value", deployment3.Spec.Template.Labels["pod-label"])
+	assert.Equal(t, "podLevel", deployment3.Spec.Template.Labels["override"])
+	assert.Equal(t, "everywhere", deployment3.Spec.Template.Labels["common"])
+	assert.Equal(t, "pod-annotation-value", deployment3.Spec.Template.Annotations["pod-annotation"])
 	assert.Equal(t, "s1", deployment3.Spec.Template.Labels[api.StargateLabel])
 	assert.Contains(t, deployment3.Spec.Template.Labels, api.StargateDeploymentLabel)
 	assert.Equal(t, "cluster1-dc1-rack3-stargate-deployment", deployment3.Spec.Template.Labels[api.StargateDeploymentLabel])
diff --git a/test/e2e/dse_test.go b/test/e2e/dse_test.go
index 0a4ee278..e1d08372 100644
--- a/test/e2e/dse_test.go
+++ b/test/e2e/dse_test.go
@@ -14,6 +14,7 @@ import (
 	gremlingo "github.com/apache/tinkerpop/gremlin-go/driver"
 	cassdcapi "github.com/k8ssandra/cass-operator/apis/cassandra/v1beta1"
 	api "github.com/k8ssandra/k8ssandra-operator/apis/k8ssandra/v1alpha1"
+	"github.com/k8ssandra/k8ssandra-operator/pkg/utils"
 	"github.com/k8ssandra/k8ssandra-operator/test/framework"
 	"github.com/stretchr/testify/require"
 	"k8s.io/apimachinery/pkg/types"
@@ -45,6 +46,16 @@ func createSingleDseDatacenterCluster(t *testing.T, ctx context.Context, namespa
 	err = f.Client.Patch(ctx, kc, patch)
 	require.NoError(t, err, "failed to patch K8ssandraCluster %v", kcKey)
 
+	// Check that the smart token allocation is enabled
+	t.Log("Check that the smart token allocation is enabled")
+	dc := &cassdcapi.CassandraDatacenter{}
+	err = f.Client.Get(ctx, dcKey.NamespacedName, dc)
+	require.NoError(t, err, "failed to get CassandraDatacenter %v", dcKey)
+	dcConfig, err := utils.UnmarshalToMap(dc.Spec.Config)
+	require.NoError(t, err, "failed to unmarshall CassandraDatacenter config")
+	allocateTokensSetting := dcConfig["cassandra-yaml"].(map[string]interface{})["allocate_tokens_for_local_replication_factor"].(float64)
+	require.Equal(t, float64(3), allocateTokensSetting, "expected smart token allocation to be enabled by default for DSE")
+
 	checkDatacenterReady(t, ctx, dcKey, f)
 	assertCassandraDatacenterK8cStatusReady(ctx, t, f, kcKey, dcKey.Name)