Skip to content

Commit

Permalink
Remove usages of deprecated created-by label (fixes #842) (#997)
Browse files Browse the repository at this point in the history
  • Loading branch information
olim7t authored Jun 12, 2023
1 parent 1d304e5 commit e486960
Show file tree
Hide file tree
Showing 28 changed files with 138 additions and 115 deletions.
3 changes: 2 additions & 1 deletion CHANGELOG/CHANGELOG-1.8.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,5 @@ When cutting a new release, update the `unreleased` heading to the tag being gen

## unreleased

* [CHANGE] [#985](https://github.com/k8ssandra/k8ssandra-operator/issues/985) CI/CD does not produce images for some commits
* [CHANGE] [#985](https://github.com/k8ssandra/k8ssandra-operator/issues/985) CI/CD does not produce images for some commits
* [ENHANCEMENT] [#842](https://github.com/k8ssandra/k8ssandra-operator/issues/842) Remove usages of deprecated created-by label
13 changes: 3 additions & 10 deletions apis/k8ssandra/v1alpha1/constants.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,13 +34,9 @@ const (

RebuildDcAnnotation = "k8ssandra.io/rebuild-dc"

RebuildLabel = "k8ssandra.io/rebuild"

NameLabel = "app.kubernetes.io/name"
NameLabelValue = "k8ssandra-operator"

InstanceLabel = "app.kubernetes.io/instance"
VersionLabel = "app.kubernetes.io/version"
ManagedByLabel = "app.kubernetes.io/managed-by"

ComponentLabel = "app.kubernetes.io/component"
Expand All @@ -49,19 +45,16 @@ const (
ComponentLabelValueReaper = "reaper"
ComponentLabelTelemetry = "telemetry"

CreatedByLabel = "app.kubernetes.io/created-by"
CreatedByLabelValueK8ssandraClusterController = "k8ssandracluster-controller"
CreatedByLabelValueStargateController = "stargate-controller"
CreatedByLabelValueReaperController = "reaper-controller"
CreatedByLabelValueK8ssandraTaskController = "k8ssandratask-controller"

PartOfLabel = "app.kubernetes.io/part-of"
PartOfLabelValue = "k8ssandra"

// ReplicatedByLabel is used to label secrets that should be selected for replication by a ReplicatedSecret.
ReplicatedByLabel = "k8ssandra.io/replicated-by"
ReplicatedByLabelValue = "k8ssandracluster-controller"

CleanedUpByLabel = "k8ssandra.io/cleaned-up-by"
CleanedUpByLabelValue = "k8ssandracluster-controller"

K8ssandraClusterNameLabel = "k8ssandra.io/cluster-name"
K8ssandraClusterNamespaceLabel = "k8ssandra.io/cluster-namespace"

Expand Down
1 change: 0 additions & 1 deletion controllers/control/k8ssandratask_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -293,7 +293,6 @@ func newCassandraTask(kTask *api.K8ssandraTask, namespace string, dcName string)
k8capi.NameLabel: k8capi.NameLabelValue,
k8capi.PartOfLabel: k8capi.PartOfLabelValue,
k8capi.ComponentLabel: k8capi.ComponentLabelValueCassandra,
k8capi.CreatedByLabel: k8capi.CreatedByLabelValueK8ssandraTaskController,
api.K8ssandraTaskNameLabel: kTask.Name,
api.K8ssandraTaskNamespaceLabel: kTask.Namespace,
},
Expand Down
1 change: 0 additions & 1 deletion controllers/k8ssandra/cassandra_telemetry_reconciler.go
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,6 @@ func mustLabels(klusterName string, klusterNamespace string, dcName string, addi
additionalLabels[k8ssandraapi.DatacenterLabel] = dcName
additionalLabels[k8ssandraapi.K8ssandraClusterNamespaceLabel] = klusterNamespace
additionalLabels[k8ssandraapi.ComponentLabel] = k8ssandraapi.ComponentLabelTelemetry
additionalLabels[k8ssandraapi.CreatedByLabel] = k8ssandraapi.CreatedByLabelValueK8ssandraClusterController
return additionalLabels
}

Expand Down
10 changes: 5 additions & 5 deletions controllers/k8ssandra/cleanup.go
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ func (r *K8ssandraClusterReconciler) checkDeletion(ctx context.Context, kc *api.
hasErrors = true
}

selector := k8ssandralabels.PartOfLabels(kcKey)
selector := k8ssandralabels.CleanedUpByLabels(kcKey)
stargateList := &stargateapi.StargateList{}
options := client.ListOptions{
Namespace: namespace,
Expand Down Expand Up @@ -218,7 +218,7 @@ func (r *K8ssandraClusterReconciler) findStargateForDeletion(
dcName string,
remoteClient client.Client) (*stargateapi.Stargate, client.Client, error) {

selector := k8ssandralabels.PartOfLabels(kcKey)
selector := k8ssandralabels.CleanedUpByLabels(kcKey)
options := &client.ListOptions{LabelSelector: labels.SelectorFromSet(selector)}
stargateList := &stargateapi.StargateList{}
stargateName := kcKey.Name + "-" + dcName + "-stargate"
Expand Down Expand Up @@ -257,7 +257,7 @@ func (r *K8ssandraClusterReconciler) findReaperForDeletion(
dcName string,
remoteClient client.Client) (*reaperapi.Reaper, client.Client, error) {

selector := k8ssandralabels.PartOfLabels(kcKey)
selector := k8ssandralabels.CleanedUpByLabels(kcKey)
options := &client.ListOptions{LabelSelector: labels.SelectorFromSet(selector)}
reaperList := &reaperapi.ReaperList{}
reaperName := kcKey.Name + "-" + dcName + "-reaper"
Expand Down Expand Up @@ -295,7 +295,7 @@ func (r *K8ssandraClusterReconciler) findDcForDeletion(
kcKey client.ObjectKey,
dcName string,
remoteClient client.Client) (*cassdcapi.CassandraDatacenter, client.Client, error) {
selector := k8ssandralabels.PartOfLabels(kcKey)
selector := k8ssandralabels.CleanedUpByLabels(kcKey)
options := &client.ListOptions{LabelSelector: labels.SelectorFromSet(selector)}
dcList := &cassdcapi.CassandraDatacenterList{}

Expand Down Expand Up @@ -335,7 +335,7 @@ func (r *K8ssandraClusterReconciler) deleteK8ssandraConfigMaps(
remoteClient client.Client,
kcLogger logr.Logger,
) (hasErrors bool) {
selector := k8ssandralabels.PartOfLabels(client.ObjectKey{Namespace: kc.Namespace, Name: kc.SanitizedName()})
selector := k8ssandralabels.CleanedUpByLabels(client.ObjectKey{Namespace: kc.Namespace, Name: kc.SanitizedName()})
configMaps := &corev1.ConfigMapList{}
options := client.ListOptions{
Namespace: namespace,
Expand Down
4 changes: 2 additions & 2 deletions controllers/k8ssandra/reaper.go
Original file line number Diff line number Diff line change
Expand Up @@ -164,7 +164,7 @@ func (r *K8ssandraClusterReconciler) reconcileReaper(
logger.Error(err, "Failed to get Reaper resource")
return result.Error(err)
}
} else if k8ssandralabels.IsPartOf(actualReaper, kcKey) {
} else if k8ssandralabels.IsCleanedUpBy(actualReaper, kcKey) {
if err = remoteClient.Delete(ctx, actualReaper); err != nil {
logger.Error(err, "Failed to delete Reaper resource")
return result.Error(err)
Expand All @@ -187,7 +187,7 @@ func (r *K8ssandraClusterReconciler) deleteReapers(
remoteClient client.Client,
kcLogger logr.Logger,
) (hasErrors bool) {
selector := k8ssandralabels.PartOfLabels(client.ObjectKey{Namespace: kc.Namespace, Name: kc.Name})
selector := k8ssandralabels.CleanedUpByLabels(client.ObjectKey{Namespace: kc.Namespace, Name: kc.Name})
reaperList := &reaperapi.ReaperList{}
options := client.ListOptions{
Namespace: namespace,
Expand Down
2 changes: 1 addition & 1 deletion controllers/k8ssandra/stargate.go
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ func (r *K8ssandraClusterReconciler) reconcileStargate(
logger.Error(err, "Failed to get Stargate")
return result.Error(err)
}
} else if labels.IsPartOf(actualStargate, kcKey) {
} else if labels.IsCleanedUpBy(actualStargate, kcKey) {
if err := remoteClient.Delete(ctx, actualStargate); err != nil {
logger.Error(err, "Failed to delete Stargate")
return result.Error(err)
Expand Down
1 change: 0 additions & 1 deletion controllers/reaper/reaper_telemetry_reconciler.go
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,6 @@ func mustLabels(reaperName string, additionalLabels map[string]string) map[strin
additionalLabels[k8ssandraapi.PartOfLabel] = k8ssandraapi.PartOfLabelValue
additionalLabels[reaperapi.ReaperLabel] = reaperName
additionalLabels[k8ssandraapi.ComponentLabel] = k8ssandraapi.ComponentLabelTelemetry
additionalLabels[k8ssandraapi.CreatedByLabel] = k8ssandraapi.CreatedByLabelValueK8ssandraClusterController
return additionalLabels
}

Expand Down
1 change: 0 additions & 1 deletion controllers/stargate/stargate_telemetry_reconciler.go
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,6 @@ func mustLabels(stargateName string, additionalLabels map[string]string) map[str
additionalLabels[k8ssandraapi.PartOfLabel] = k8ssandraapi.PartOfLabelValue
additionalLabels[stargateapi.StargateLabel] = stargateName
additionalLabels[k8ssandraapi.ComponentLabel] = k8ssandraapi.ComponentLabelTelemetry
additionalLabels[k8ssandraapi.CreatedByLabel] = k8ssandraapi.CreatedByLabelValueK8ssandraClusterController
return additionalLabels

}
Expand Down
39 changes: 39 additions & 0 deletions docs/content/en/contribute/labels/_index.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
---
title: "Kubernetes labels"
linkTitle: "Kubernetes labels"
toc_hide: false
weight: 10
description: How Kubernetes labels are used on K8ssandra objects.
---

The operator places the following labels on the objects it creates:

## Standard Kubernetes labels

From [recommended labels](https://kubernetes.io/docs/concepts/overview/working-with-objects/common-labels/):

| Label | Value |
|-------------------------------|----------------------------------------------------------|
| `app.kubernetes.io/name` | `k8ssandra-operator` |
| `app.kubernetes.io/part-of` | `k8ssandra` |
| `app.kubernetes.io/component` | One of: `cassandra`, `stargate`, `reaper` or `telemetry` |

These labels are purely informational.

The keys and values are defined in [constants.go](https://github.com/k8ssandra/k8ssandra-operator/blob/main/apis/k8ssandra/v1alpha1/constants.go).

## Labels specific to the operator

Objects associated with a `K8ssandraCluster` are labelled with `k8ssandra.io/cluster-namespace` and
`k8ssandra.io/cluster-name`. This is used:

* to establish watches. See the `SetupWithManager()` function in
[k8ssandracluster_controller.go](https://github.com/k8ssandra/k8ssandra-operator/blob/main/controllers/k8ssandra/k8ssandracluster_controller.go).
* in conjunction with `k8ssandra.io/cleaned-up-by`, to mark objects that should get cleaned up when the
`K8ssandraCluster` is deleted, see
[cleanup.go](https://github.com/k8ssandra/k8ssandra-operator/blob/main/controllers/k8ssandra/cleanup.go).
Note that we only use this mechanism for relationships that cross Kubernetes contexts; when the objects are in the same
Kubernetes cluster, we rely on standard owner references instead.

[labels.go](https://github.com/k8ssandra/k8ssandra-operator/blob/main/pkg/labels/labels.go) provides functions to
manipulate those sets of labels.
15 changes: 6 additions & 9 deletions pkg/cassandra/datacenter.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,14 @@ package cassandra
import (
"fmt"
"github.com/Masterminds/semver/v3"

"github.com/k8ssandra/cass-operator/apis/cassandra/v1beta1"
cassdcapi "github.com/k8ssandra/cass-operator/apis/cassandra/v1beta1"
"github.com/k8ssandra/cass-operator/pkg/reconciliation"
api "github.com/k8ssandra/k8ssandra-operator/apis/k8ssandra/v1alpha1"
"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/labels"
"github.com/k8ssandra/k8ssandra-operator/pkg/utils"
corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/resource"
Expand Down Expand Up @@ -153,14 +153,11 @@ func NewDatacenter(klusterKey types.NamespacedName, template *DatacenterConfig)
Namespace: namespace,
Name: template.Meta.Name,
Annotations: map[string]string{},
Labels: map[string]string{
api.NameLabel: api.NameLabelValue,
api.PartOfLabel: api.PartOfLabelValue,
api.ComponentLabel: api.ComponentLabelValueCassandra,
api.CreatedByLabel: api.CreatedByLabelValueK8ssandraClusterController,
api.K8ssandraClusterNameLabel: klusterKey.Name,
api.K8ssandraClusterNamespaceLabel: klusterKey.Namespace,
},
Labels: utils.MergeMap(map[string]string{
api.NameLabel: api.NameLabelValue,
api.PartOfLabel: api.PartOfLabelValue,
api.ComponentLabel: api.ComponentLabelValueCassandra,
}, labels.CleanedUpByLabels(klusterKey)),
},
Spec: cassdcapi.CassandraDatacenterSpec{
Size: template.Size,
Expand Down
22 changes: 10 additions & 12 deletions pkg/labels/labels.go
Original file line number Diff line number Diff line change
Expand Up @@ -85,30 +85,28 @@ func ReplicatedByLabels(klusterKey client.ObjectKey) map[string]string {
}
}

// IsPartOf returns true if this component was created by the k8ssandra-cluster controller, and belongs to the
// K8ssandraCluster resource specified by klusterKey. klusterKey refers to the namespace and name of the
// K8ssandraCluster.
func IsPartOf(component Labeled, klusterKey client.ObjectKey) bool {
return HasLabelWithValue(component, k8ssandraapi.CreatedByLabel, k8ssandraapi.CreatedByLabelValueK8ssandraClusterController) &&
// IsCleanedUpBy returns whether this component is labelled to be cleaned up by the k8ssandra-cluster controller when
// the given K8ssandraCluster is deleted.
func IsCleanedUpBy(component Labeled, klusterKey client.ObjectKey) bool {
return HasLabelWithValue(component, k8ssandraapi.CleanedUpByLabel, k8ssandraapi.CleanedUpByLabelValue) &&
HasLabelWithValue(component, k8ssandraapi.K8ssandraClusterNameLabel, klusterKey.Name) &&
HasLabelWithValue(component, k8ssandraapi.K8ssandraClusterNamespaceLabel, klusterKey.Namespace)
}

// PartOfLabels returns the labels used to identify a component created by the k8ssandra-cluster controller, and
// belonging to the K8ssandraCluster resource specified by klusterKey, which is namespace and name of the
// K8ssandraCluster.
func PartOfLabels(klusterKey client.ObjectKey) map[string]string {
// TODO add k8ssandraapi.PartOfLabel entry here, already done for telemetry objects elsewhere
// CleanedUpByLabels returns the labels used to indicate that a component should be cleaned up by the k8ssandra-cluster
// controller when the given K8ssandraCluster is deleted.
// (This is only used for cross-context references, when ownerReferences cannot be used).
func CleanedUpByLabels(klusterKey client.ObjectKey) map[string]string {
return map[string]string{
k8ssandraapi.CreatedByLabel: k8ssandraapi.CreatedByLabelValueK8ssandraClusterController,
k8ssandraapi.CleanedUpByLabel: k8ssandraapi.CleanedUpByLabelValue,
k8ssandraapi.K8ssandraClusterNameLabel: klusterKey.Name,
k8ssandraapi.K8ssandraClusterNamespaceLabel: klusterKey.Namespace,
}
}

// IsOwnedByK8ssandraController returns true if this component was created by the k8ssandra-cluster controller.
func IsOwnedByK8ssandraController(component Labeled) bool {
return HasLabelWithValue(component, k8ssandraapi.CreatedByLabel, k8ssandraapi.CreatedByLabelValueK8ssandraClusterController) &&
return HasLabelWithValue(component, k8ssandraapi.CleanedUpByLabel, k8ssandraapi.CleanedUpByLabelValue) &&
HasLabel(component, k8ssandraapi.K8ssandraClusterNameLabel) &&
HasLabel(component, k8ssandraapi.K8ssandraClusterNamespaceLabel)
}
16 changes: 8 additions & 8 deletions pkg/nodeconfig/generate.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package nodeconfig

import (
"fmt"
"github.com/k8ssandra/k8ssandra-operator/pkg/labels"
"strings"

k8ssandraapi "github.com/k8ssandra/k8ssandra-operator/apis/k8ssandra/v1alpha1"
Expand Down Expand Up @@ -46,14 +47,13 @@ func newPerNodeConfigMap(kcKey, configKey types.NamespacedName) *corev1.ConfigMa
ObjectMeta: metav1.ObjectMeta{
Name: configKey.Name,
Namespace: configKey.Namespace,
Labels: map[string]string{
k8ssandraapi.NameLabel: k8ssandraapi.NameLabelValue,
k8ssandraapi.PartOfLabel: k8ssandraapi.PartOfLabelValue,
k8ssandraapi.ComponentLabel: k8ssandraapi.ComponentLabelValueCassandra,
k8ssandraapi.CreatedByLabel: k8ssandraapi.CreatedByLabelValueK8ssandraClusterController,
k8ssandraapi.K8ssandraClusterNameLabel: kcKey.Name,
k8ssandraapi.K8ssandraClusterNamespaceLabel: kcKey.Namespace,
},
Labels: utils.MergeMap(
map[string]string{
k8ssandraapi.NameLabel: k8ssandraapi.NameLabelValue,
k8ssandraapi.PartOfLabel: k8ssandraapi.PartOfLabelValue,
k8ssandraapi.ComponentLabel: k8ssandraapi.ComponentLabelValueCassandra,
},
labels.CleanedUpByLabels(kcKey)),
},
}
}
Expand Down
2 changes: 1 addition & 1 deletion pkg/nodeconfig/generate_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -52,10 +52,10 @@ func TestNewDefaultPerNodeConfigMap(t *testing.T) {
Namespace: "ns1",
Name: "kc1-dc1-per-node-config",
Labels: map[string]string{
"app.kubernetes.io/created-by": "k8ssandracluster-controller",
"app.kubernetes.io/name": "k8ssandra-operator",
"app.kubernetes.io/component": "cassandra",
"app.kubernetes.io/part-of": "k8ssandra",
"k8ssandra.io/cleaned-up-by": "k8ssandracluster-controller",
"k8ssandra.io/cluster-name": "kc1",
"k8ssandra.io/cluster-namespace": "ns1",
},
Expand Down
2 changes: 2 additions & 0 deletions pkg/reaper/deployment.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,8 @@ var defaultImage = images.Image{
func NewDeployment(reaper *api.Reaper, dc *cassdcapi.CassandraDatacenter, keystorePassword *string, truststorePassword *string, logger logr.Logger, authVars ...*corev1.EnvVar) *appsv1.Deployment {
selector := metav1.LabelSelector{
MatchExpressions: []metav1.LabelSelectorRequirement{
// Note: managed-by shouldn't be used here, but we're keeping it for backwards compatibility, since changing
// a deployment's selector is a breaking change.
{
Key: v1alpha1.ManagedByLabel,
Operator: metav1.LabelSelectorOpIn,
Expand Down
2 changes: 0 additions & 2 deletions pkg/reaper/deployment_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -562,7 +562,6 @@ func TestLabelsAnnotations(t *testing.T) {
k8ssandraapi.ComponentLabel: k8ssandraapi.ComponentLabelValueReaper,
k8ssandraapi.ManagedByLabel: k8ssandraapi.NameLabelValue,
reaperapi.ReaperLabel: reaper.Name,
k8ssandraapi.CreatedByLabel: k8ssandraapi.CreatedByLabelValueReaperController,
"common": "everywhere",
"override": "commonLevel",
}
Expand All @@ -573,7 +572,6 @@ func TestLabelsAnnotations(t *testing.T) {
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",
Expand Down
14 changes: 6 additions & 8 deletions pkg/reaper/labels.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,9 @@ package reaper
import (
k8ssandraapi "github.com/k8ssandra/k8ssandra-operator/apis/k8ssandra/v1alpha1"
reaperapi "github.com/k8ssandra/k8ssandra-operator/apis/reaper/v1alpha1"
k8ssandralabels "github.com/k8ssandra/k8ssandra-operator/pkg/labels"
"github.com/k8ssandra/k8ssandra-operator/pkg/utils"
"sigs.k8s.io/controller-runtime/pkg/client"
)

var commonLabels = map[string]string{
Expand All @@ -14,18 +16,14 @@ var commonLabels = map[string]string{
}

func createResourceLabels(kc *k8ssandraapi.K8ssandraCluster) map[string]string {
labels := map[string]string{
k8ssandraapi.K8ssandraClusterNameLabel: kc.Name,
k8ssandraapi.K8ssandraClusterNamespaceLabel: kc.Namespace,
k8ssandraapi.CreatedByLabel: k8ssandraapi.CreatedByLabelValueK8ssandraClusterController,
}
return utils.MergeMap(commonLabels, labels)
return utils.MergeMap(
commonLabels,
k8ssandralabels.CleanedUpByLabels(client.ObjectKey{Namespace: kc.Namespace, Name: kc.Name}))
}

func getConstantLabels(r *reaperapi.Reaper) map[string]string {
labels := map[string]string{
reaperapi.ReaperLabel: r.Name,
k8ssandraapi.CreatedByLabel: k8ssandraapi.CreatedByLabelValueReaperController,
reaperapi.ReaperLabel: r.Name,
}

kcName, nameFound := r.Labels[k8ssandraapi.K8ssandraClusterNameLabel]
Expand Down
2 changes: 0 additions & 2 deletions pkg/reaper/service_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@ func TestNewService(t *testing.T) {
k8ssandraapi.ComponentLabel: k8ssandraapi.ComponentLabelValueReaper,
k8ssandraapi.ManagedByLabel: k8ssandraapi.NameLabelValue,
reaperapi.ReaperLabel: reaper.Name,
k8ssandraapi.CreatedByLabel: k8ssandraapi.CreatedByLabelValueReaperController,
}

serviceLabels := map[string]string{
Expand All @@ -35,7 +34,6 @@ func TestNewService(t *testing.T) {
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",
Expand Down
Loading

0 comments on commit e486960

Please sign in to comment.