Skip to content
This repository has been archived by the owner on May 6, 2022. It is now read-only.

Commit

Permalink
Changing Class and Plans labels to sha224 (#2741)
Browse files Browse the repository at this point in the history
* Changing Class and Plans labels to sha224

* Fix after CR#1
  • Loading branch information
Piotr Jasiak authored and k8s-ci-robot committed Nov 5, 2019
1 parent 0b5180b commit f5f69f5
Show file tree
Hide file tree
Showing 51 changed files with 292 additions and 206 deletions.
2 changes: 1 addition & 1 deletion charts/catalog/templates/crds/serviceplan.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ spec:
JSONPath: .spec.serviceBrokerName
- name: Class
type: string
JSONPath: .spec.serviceClassRef.Name
JSONPath: .spec.serviceClassRef.name
- name: Age
type: date
JSONPath: .metadata.creationTimestamp
Expand Down
5 changes: 3 additions & 2 deletions cmd/svcat/svcat_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ import (
svcatfake "github.com/kubernetes-sigs/service-catalog/pkg/client/clientset_generated/clientset/fake"
"github.com/kubernetes-sigs/service-catalog/pkg/svcat"
"github.com/kubernetes-sigs/service-catalog/pkg/svcat/service-catalog"
"github.com/kubernetes-sigs/service-catalog/pkg/util"
"github.com/pkg/errors"
"github.com/spf13/cobra"
"github.com/spf13/pflag"
Expand Down Expand Up @@ -91,7 +92,7 @@ func TestGetSvcatWithNamespacedBrokerFeatureDisabled(t *testing.T) {
ObjectMeta: metav1.ObjectMeta{
Name: "my-cluster-class",
Labels: map[string]string{
v1beta1.GroupName + "/" + v1beta1.FilterSpecExternalName: "my-cluster-class",
v1beta1.GroupName + "/" + v1beta1.FilterSpecExternalName: util.GenerateSHA("my-cluster-class"),
},
},
Spec: v1beta1.ClusterServiceClassSpec{
Expand All @@ -104,7 +105,7 @@ func TestGetSvcatWithNamespacedBrokerFeatureDisabled(t *testing.T) {
ObjectMeta: metav1.ObjectMeta{
Name: "my-cluster-plan",
Labels: map[string]string{
v1beta1.GroupName + "/" + v1beta1.FilterSpecExternalName: "my-cluster-plan",
v1beta1.GroupName + "/" + v1beta1.FilterSpecExternalName: util.GenerateSHA("my-cluster-plan"),
},
},
Spec: v1beta1.ClusterServicePlanSpec{
Expand Down
7 changes: 4 additions & 3 deletions pkg/controller/controller_clusterservicebroker.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ import (
"github.com/kubernetes-sigs/service-catalog/pkg/apis/servicecatalog/v1beta1"
"github.com/kubernetes-sigs/service-catalog/pkg/metrics"
"github.com/kubernetes-sigs/service-catalog/pkg/pretty"
"github.com/kubernetes-sigs/service-catalog/pkg/util"
)

// the Message strings have a terminating period and space so they can
Expand Down Expand Up @@ -722,7 +723,7 @@ func (c *controller) getCurrentServiceClassesAndPlansForBroker(broker *v1beta1.C
pcb := pretty.NewClusterServiceBrokerContextBuilder(broker)

labelSelector := labels.SelectorFromSet(labels.Set{
v1beta1.GroupName + "/" + v1beta1.FilterSpecClusterServiceBrokerName: broker.Name,
v1beta1.GroupName + "/" + v1beta1.FilterSpecClusterServiceBrokerName: util.GenerateSHA(broker.Name),
}).String()

listOpts := metav1.ListOptions{
Expand All @@ -744,7 +745,7 @@ func (c *controller) getCurrentServiceClassesAndPlansForBroker(broker *v1beta1.C

return nil, nil, err
}
klog.Info(pcb.Messagef("Found %d ServiceClasses", len(existingServiceClasses.Items)))
klog.Info(pcb.Messagef("Found %d ClusterServiceClasses", len(existingServiceClasses.Items)))

existingServicePlans, err := c.serviceCatalogClient.ClusterServicePlans().List(listOpts)
if err != nil {
Expand All @@ -761,7 +762,7 @@ func (c *controller) getCurrentServiceClassesAndPlansForBroker(broker *v1beta1.C

return nil, nil, err
}
klog.Info(pcb.Messagef("Found %d ServicePlans", len(existingServicePlans.Items)))
klog.Info(pcb.Messagef("Found %d ClusterServicePlans", len(existingServicePlans.Items)))

return existingServiceClasses.Items, existingServicePlans.Items, nil
}
Expand Down
23 changes: 12 additions & 11 deletions pkg/controller/controller_clusterservicebroker_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import (
fakeosb "github.com/kubernetes-sigs/go-open-service-broker-client/v2/fake"

"github.com/kubernetes-sigs/service-catalog/pkg/apis/servicecatalog/v1beta1"
"github.com/kubernetes-sigs/service-catalog/pkg/util"
"github.com/kubernetes-sigs/service-catalog/test/fake"

metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
Expand Down Expand Up @@ -281,7 +282,7 @@ func TestReconcileClusterServiceBrokerExistingServiceClassAndServicePlan(t *test

listRestrictions := clientgotesting.ListRestrictions{
Labels: labels.SelectorFromSet(labels.Set{
v1beta1.GroupName + "/" + v1beta1.FilterSpecClusterServiceBrokerName: "test-clusterservicebroker",
v1beta1.GroupName + "/" + v1beta1.FilterSpecClusterServiceBrokerName: util.GenerateSHA("test-clusterservicebroker"),
}),
Fields: fields.Everything(),
}
Expand Down Expand Up @@ -341,7 +342,7 @@ func TestReconcileClusterServiceBrokerRemovedClusterServiceClass(t *testing.T) {

listRestrictions := clientgotesting.ListRestrictions{
Labels: labels.SelectorFromSet(labels.Set{
v1beta1.GroupName + "/" + v1beta1.FilterSpecClusterServiceBrokerName: "test-clusterservicebroker",
v1beta1.GroupName + "/" + v1beta1.FilterSpecClusterServiceBrokerName: util.GenerateSHA("test-clusterservicebroker"),
}),
Fields: fields.Everything(),
}
Expand Down Expand Up @@ -411,7 +412,7 @@ func TestReconcileClusterServiceBrokerRemovedAndRestoredClusterServiceClass(t *t

listRestrictions := clientgotesting.ListRestrictions{
Labels: labels.SelectorFromSet(labels.Set{
v1beta1.GroupName + "/" + v1beta1.FilterSpecClusterServiceBrokerName: "test-clusterservicebroker",
v1beta1.GroupName + "/" + v1beta1.FilterSpecClusterServiceBrokerName: util.GenerateSHA("test-clusterservicebroker"),
}),
Fields: fields.Everything(),
}
Expand Down Expand Up @@ -470,7 +471,7 @@ func TestReconcileClusterServiceBrokerRemovedClusterServicePlan(t *testing.T) {

listRestrictions := clientgotesting.ListRestrictions{
Labels: labels.SelectorFromSet(labels.Set{
v1beta1.GroupName + "/" + v1beta1.FilterSpecClusterServiceBrokerName: "test-clusterservicebroker",
v1beta1.GroupName + "/" + v1beta1.FilterSpecClusterServiceBrokerName: util.GenerateSHA("test-clusterservicebroker"),
}),
Fields: fields.Everything(),
}
Expand Down Expand Up @@ -516,7 +517,7 @@ func TestReconcileClusterServiceBrokerExistingClusterServiceClassDifferentBroker

listRestrictions := clientgotesting.ListRestrictions{
Labels: labels.SelectorFromSet(labels.Set{
v1beta1.GroupName + "/" + v1beta1.FilterSpecClusterServiceBrokerName: "test-clusterservicebroker",
v1beta1.GroupName + "/" + v1beta1.FilterSpecClusterServiceBrokerName: util.GenerateSHA("test-clusterservicebroker"),
}),
Fields: fields.Everything(),
}
Expand Down Expand Up @@ -570,7 +571,7 @@ func TestReconcileClusterServiceBrokerExistingClusterServicePlanDifferentClass(t

listRestrictions := clientgotesting.ListRestrictions{
Labels: labels.SelectorFromSet(labels.Set{
v1beta1.GroupName + "/" + v1beta1.FilterSpecClusterServiceBrokerName: "test-clusterservicebroker",
v1beta1.GroupName + "/" + v1beta1.FilterSpecClusterServiceBrokerName: util.GenerateSHA("test-clusterservicebroker"),
}),
Fields: fields.Everything(),
}
Expand Down Expand Up @@ -699,7 +700,7 @@ func TestReconcileClusterServiceBrokerDelete(t *testing.T) {

listRestrictions := clientgotesting.ListRestrictions{
Labels: labels.SelectorFromSet(labels.Set{
v1beta1.GroupName + "/" + v1beta1.FilterSpecClusterServiceBrokerName: "test-clusterservicebroker",
v1beta1.GroupName + "/" + v1beta1.FilterSpecClusterServiceBrokerName: util.GenerateSHA("test-clusterservicebroker"),
}),
Fields: fields.Everything(),
}
Expand Down Expand Up @@ -813,7 +814,7 @@ func TestReconcileClusterServiceBrokerZeroServices(t *testing.T) {

listRestrictions := clientgotesting.ListRestrictions{
Labels: labels.SelectorFromSet(labels.Set{
v1beta1.GroupName + "/" + v1beta1.FilterSpecClusterServiceBrokerName: "test-clusterservicebroker",
v1beta1.GroupName + "/" + v1beta1.FilterSpecClusterServiceBrokerName: util.GenerateSHA("test-clusterservicebroker"),
}),
Fields: fields.Everything(),
}
Expand Down Expand Up @@ -973,7 +974,7 @@ func TestReconcileClusterServiceBrokerWithReconcileError(t *testing.T) {

listRestrictions := clientgotesting.ListRestrictions{
Labels: labels.SelectorFromSet(labels.Set{
v1beta1.GroupName + "/" + v1beta1.FilterSpecClusterServiceBrokerName: "test-clusterservicebroker",
v1beta1.GroupName + "/" + v1beta1.FilterSpecClusterServiceBrokerName: util.GenerateSHA("test-clusterservicebroker"),
}),
Fields: fields.Everything(),
}
Expand Down Expand Up @@ -1039,7 +1040,7 @@ func TestReconcileClusterServiceBrokerSuccessOnFinalRetry(t *testing.T) {

listRestrictions := clientgotesting.ListRestrictions{
Labels: labels.SelectorFromSet(labels.Set{
v1beta1.GroupName + "/" + v1beta1.FilterSpecClusterServiceBrokerName: "test-clusterservicebroker",
v1beta1.GroupName + "/" + v1beta1.FilterSpecClusterServiceBrokerName: util.GenerateSHA("test-clusterservicebroker"),
}),
Fields: fields.Everything(),
}
Expand Down Expand Up @@ -1139,7 +1140,7 @@ func TestReconcileClusterServiceBrokerWithStatusUpdateError(t *testing.T) {

listRestrictions := clientgotesting.ListRestrictions{
Labels: labels.SelectorFromSet(labels.Set{
v1beta1.GroupName + "/" + v1beta1.FilterSpecClusterServiceBrokerName: "test-clusterservicebroker",
v1beta1.GroupName + "/" + v1beta1.FilterSpecClusterServiceBrokerName: util.GenerateSHA("test-clusterservicebroker"),
}),
Fields: fields.Everything(),
}
Expand Down
3 changes: 2 additions & 1 deletion pkg/controller/controller_clusterserviceclass.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import (
"k8s.io/klog"

"github.com/kubernetes-sigs/service-catalog/pkg/apis/servicecatalog/v1beta1"
"github.com/kubernetes-sigs/service-catalog/pkg/util"
)

// Service class handlers and control-loop
Expand Down Expand Up @@ -93,7 +94,7 @@ func (c *controller) reconcileClusterServiceClass(serviceClass *v1beta1.ClusterS

func (c *controller) findServiceInstancesOnClusterServiceClass(serviceClass *v1beta1.ClusterServiceClass) (*v1beta1.ServiceInstanceList, error) {
labelSelector := labels.SelectorFromSet(labels.Set{
v1beta1.GroupName + "/" + v1beta1.FilterSpecClusterServiceClassRefName: serviceClass.Name,
v1beta1.GroupName + "/" + v1beta1.FilterSpecClusterServiceClassRefName: util.GenerateSHA(serviceClass.Name),
}).String()

listOpts := metav1.ListOptions{
Expand Down
7 changes: 4 additions & 3 deletions pkg/controller/controller_clusterserviceclass_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ import (
clientgotesting "k8s.io/client-go/testing"

"github.com/kubernetes-sigs/service-catalog/pkg/apis/servicecatalog/v1beta1"
"github.com/kubernetes-sigs/service-catalog/pkg/util"
"github.com/kubernetes-sigs/service-catalog/test/fake"
)

Expand Down Expand Up @@ -59,7 +60,7 @@ func TestReconcileClusterServiceClassRemovedFromCatalog(t *testing.T) {
catalogActionsCheckFunc: func(t *testing.T, actions []clientgotesting.Action) {
listRestrictions := clientgotesting.ListRestrictions{
Labels: labels.SelectorFromSet(labels.Set{
v1beta1.GroupName + "/" + v1beta1.FilterSpecClusterServiceClassRefName: "cscguid",
v1beta1.GroupName + "/" + v1beta1.FilterSpecClusterServiceClassRefName: util.GenerateSHA("cscguid"),
}),
Fields: fields.Everything(),
}
Expand All @@ -76,7 +77,7 @@ func TestReconcileClusterServiceClassRemovedFromCatalog(t *testing.T) {
catalogActionsCheckFunc: func(t *testing.T, actions []clientgotesting.Action) {
listRestrictions := clientgotesting.ListRestrictions{
Labels: labels.SelectorFromSet(labels.Set{
v1beta1.GroupName + "/" + v1beta1.FilterSpecClusterServiceClassRefName: "cscguid",
v1beta1.GroupName + "/" + v1beta1.FilterSpecClusterServiceClassRefName: util.GenerateSHA("cscguid"),
}),
Fields: fields.Everything(),
}
Expand All @@ -100,7 +101,7 @@ func TestReconcileClusterServiceClassRemovedFromCatalog(t *testing.T) {
catalogActionsCheckFunc: func(t *testing.T, actions []clientgotesting.Action) {
listRestrictions := clientgotesting.ListRestrictions{
Labels: labels.SelectorFromSet(labels.Set{
v1beta1.GroupName + "/" + v1beta1.FilterSpecClusterServiceClassRefName: "cscguid",
v1beta1.GroupName + "/" + v1beta1.FilterSpecClusterServiceClassRefName: util.GenerateSHA("cscguid"),
}),
Fields: fields.Everything(),
}
Expand Down
3 changes: 2 additions & 1 deletion pkg/controller/controller_clusterserviceplan.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import (
"k8s.io/klog"

"github.com/kubernetes-sigs/service-catalog/pkg/apis/servicecatalog/v1beta1"
"github.com/kubernetes-sigs/service-catalog/pkg/util"
)

// Cluster service plan handlers and control-loop
Expand Down Expand Up @@ -94,7 +95,7 @@ func (c *controller) reconcileClusterServicePlan(clusterServicePlan *v1beta1.Clu

func (c *controller) findServiceInstancesOnClusterServicePlan(clusterServicePlan *v1beta1.ClusterServicePlan) (*v1beta1.ServiceInstanceList, error) {
labelSelector := labels.SelectorFromSet(labels.Set{
v1beta1.GroupName + "/" + v1beta1.FilterSpecClusterServicePlanRefName: clusterServicePlan.Name,
v1beta1.GroupName + "/" + v1beta1.FilterSpecClusterServicePlanRefName: util.GenerateSHA(clusterServicePlan.Name),
}).String()

listOpts := metav1.ListOptions{
Expand Down
7 changes: 4 additions & 3 deletions pkg/controller/controller_clusterserviceplan_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import (
"testing"

"github.com/kubernetes-sigs/service-catalog/pkg/apis/servicecatalog/v1beta1"
"github.com/kubernetes-sigs/service-catalog/pkg/util"
"github.com/kubernetes-sigs/service-catalog/test/fake"
"k8s.io/apimachinery/pkg/runtime"

Expand Down Expand Up @@ -60,7 +61,7 @@ func TestReconcileClusterServicePlanRemovedFromCatalog(t *testing.T) {
catalogActionsCheckFunc: func(t *testing.T, actions []clientgotesting.Action) {
listRestrictions := clientgotesting.ListRestrictions{
Labels: labels.SelectorFromSet(labels.Set{
v1beta1.GroupName + "/" + v1beta1.FilterSpecClusterServicePlanRefName: "cspguid",
v1beta1.GroupName + "/" + v1beta1.FilterSpecClusterServicePlanRefName: util.GenerateSHA("cspguid"),
}),
Fields: fields.Everything(),
}
Expand All @@ -77,7 +78,7 @@ func TestReconcileClusterServicePlanRemovedFromCatalog(t *testing.T) {
catalogActionsCheckFunc: func(t *testing.T, actions []clientgotesting.Action) {
listRestrictions := clientgotesting.ListRestrictions{
Labels: labels.SelectorFromSet(labels.Set{
v1beta1.GroupName + "/" + v1beta1.FilterSpecClusterServicePlanRefName: "cspguid",
v1beta1.GroupName + "/" + v1beta1.FilterSpecClusterServicePlanRefName: util.GenerateSHA("cspguid"),
}),
Fields: fields.Everything(),
}
Expand All @@ -101,7 +102,7 @@ func TestReconcileClusterServicePlanRemovedFromCatalog(t *testing.T) {
catalogActionsCheckFunc: func(t *testing.T, actions []clientgotesting.Action) {
listRestrictions := clientgotesting.ListRestrictions{
Labels: labels.SelectorFromSet(labels.Set{
v1beta1.GroupName + "/" + v1beta1.FilterSpecClusterServicePlanRefName: "cspguid",
v1beta1.GroupName + "/" + v1beta1.FilterSpecClusterServicePlanRefName: util.GenerateSHA("cspguid"),
}),
Fields: fields.Everything(),
}
Expand Down
17 changes: 9 additions & 8 deletions pkg/controller/controller_instance.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ import (
"github.com/kubernetes-sigs/service-catalog/pkg/apis/servicecatalog/v1beta1"
scfeatures "github.com/kubernetes-sigs/service-catalog/pkg/features"
"github.com/kubernetes-sigs/service-catalog/pkg/pretty"
"github.com/kubernetes-sigs/service-catalog/pkg/util"

corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/errors"
Expand Down Expand Up @@ -1388,7 +1389,7 @@ func (c *controller) resolveClusterServiceClassRef(instance *v1beta1.ServiceInst
filterValue := instance.Spec.GetSpecifiedClusterServiceClass()
klog.V(4).Info(pcb.Messagef("looking up a ClusterServiceClass from %s: %q", filterLabel, filterValue))
labelSelector := labels.SelectorFromSet(labels.Set{
filterLabel: filterValue,
filterLabel: util.GenerateSHA(filterValue),
}).String()

listOpts := metav1.ListOptions{
Expand Down Expand Up @@ -1462,7 +1463,7 @@ func (c *controller) resolveServiceClassRef(instance *v1beta1.ServiceInstance) (
klog.V(4).Info(pcb.Messagef("looking up a ServiceClass from %s: %q", filterLabel, filterValue))

labelSelector := labels.SelectorFromSet(labels.Set{
filterLabel: filterValue,
filterLabel: util.GenerateSHA(filterValue),
}).String()

listOpts := metav1.ListOptions{
Expand Down Expand Up @@ -1522,9 +1523,9 @@ func (c *controller) resolveClusterServicePlanRef(instance *v1beta1.ServiceInsta
}
} else {
labelSelector := labels.SelectorFromSet(labels.Set{
instance.Spec.GetClusterServicePlanFilterLabelName(): instance.Spec.GetSpecifiedClusterServicePlan(),
v1beta1.GroupName + "/" + v1beta1.FilterSpecClusterServiceClassRefName: instance.Spec.ClusterServiceClassRef.Name,
v1beta1.GroupName + "/" + v1beta1.FilterSpecClusterServiceBrokerName: brokerName,
instance.Spec.GetClusterServicePlanFilterLabelName(): util.GenerateSHA(instance.Spec.GetSpecifiedClusterServicePlan()),
v1beta1.GroupName + "/" + v1beta1.FilterSpecClusterServiceClassRefName: util.GenerateSHA(instance.Spec.ClusterServiceClassRef.Name),
v1beta1.GroupName + "/" + v1beta1.FilterSpecClusterServiceBrokerName: util.GenerateSHA(brokerName),
}).String()

listOpts := metav1.ListOptions{
Expand Down Expand Up @@ -1582,9 +1583,9 @@ func (c *controller) resolveServicePlanRef(instance *v1beta1.ServiceInstance, br
}
} else {
labelSelector := labels.SelectorFromSet(labels.Set{
instance.Spec.GetServicePlanFilterLabelName(): instance.Spec.GetSpecifiedServicePlan(),
v1beta1.GroupName + "/" + v1beta1.FilterSpecServiceClassRefName: instance.Spec.ServiceClassRef.Name,
v1beta1.GroupName + "/" + v1beta1.FilterSpecServiceBrokerName: brokerName,
instance.Spec.GetServicePlanFilterLabelName(): util.GenerateSHA(instance.Spec.GetSpecifiedServicePlan()),
v1beta1.GroupName + "/" + v1beta1.FilterSpecServiceClassRefName: util.GenerateSHA(instance.Spec.ServiceClassRef.Name),
v1beta1.GroupName + "/" + v1beta1.FilterSpecServiceBrokerName: util.GenerateSHA(brokerName),
}).String()

listOpts := metav1.ListOptions{
Expand Down
9 changes: 5 additions & 4 deletions pkg/controller/controller_instance_ns_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import (
fakeosb "github.com/kubernetes-sigs/go-open-service-broker-client/v2/fake"

"github.com/kubernetes-sigs/service-catalog/pkg/apis/servicecatalog/v1beta1"
"github.com/kubernetes-sigs/service-catalog/pkg/util"

utilfeature "k8s.io/apiserver/pkg/util/feature"

Expand Down Expand Up @@ -833,17 +834,17 @@ func TestResolveNamespacedReferencesWorks(t *testing.T) {

listRestrictions := clientgotesting.ListRestrictions{
Labels: labels.SelectorFromSet(labels.Set{
v1beta1.GroupName + "/" + v1beta1.FilterSpecExternalName: instance.Spec.ServiceClassExternalName,
v1beta1.GroupName + "/" + v1beta1.FilterSpecExternalName: util.GenerateSHA(instance.Spec.ServiceClassExternalName),
}),
Fields: fields.Everything(),
}
assertList(t, actions[0], &v1beta1.ServiceClass{}, listRestrictions)

listRestrictions = clientgotesting.ListRestrictions{
Labels: labels.SelectorFromSet(labels.Set{
v1beta1.GroupName + "/" + v1beta1.FilterSpecExternalName: "test-serviceplan",
v1beta1.GroupName + "/" + v1beta1.FilterSpecServiceBrokerName: "test-servicebroker",
v1beta1.GroupName + "/" + v1beta1.FilterSpecServiceClassRefName: "scguid",
v1beta1.GroupName + "/" + v1beta1.FilterSpecExternalName: util.GenerateSHA("test-serviceplan"),
v1beta1.GroupName + "/" + v1beta1.FilterSpecServiceBrokerName: util.GenerateSHA("test-servicebroker"),
v1beta1.GroupName + "/" + v1beta1.FilterSpecServiceClassRefName: util.GenerateSHA("scguid"),
}),
Fields: fields.Everything(),
}
Expand Down
Loading

0 comments on commit f5f69f5

Please sign in to comment.