From e558240fdf2e5de022767e6601c7213b18fea689 Mon Sep 17 00:00:00 2001 From: Oleksii Kliukin Date: Wed, 13 Jun 2018 12:59:10 +0200 Subject: [PATCH] Apply the configuration from CRD. --- cmd/main.go | 20 +++++ pkg/controller/controller.go | 56 +++++++------ pkg/controller/operator_config.go | 85 +++++++++++++++++-- pkg/controller/util.go | 2 +- pkg/spec/types.go | 10 ++- pkg/util/config/config.go | 10 +-- pkg/util/config/crd_config.go | 132 ++++++++++++++---------------- pkg/util/constants/crd.go | 15 ++-- 8 files changed, 209 insertions(+), 121 deletions(-) diff --git a/cmd/main.go b/cmd/main.go index 5c8aadd8f..b400630f6 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -7,6 +7,7 @@ import ( "os/signal" "sync" "syscall" + "time" "github.com/zalando-incubator/postgres-operator/pkg/controller" "github.com/zalando-incubator/postgres-operator/pkg/spec" @@ -20,6 +21,14 @@ var ( config spec.ControllerConfig ) +func mustParseDuration(d string) time.Duration { + duration, err := time.ParseDuration(d) + if err != nil { + panic(err) + } + return duration +} + func init() { flag.StringVar(&kubeConfigFile, "kubeconfig", "", "Path to kubeconfig file with authorization and master location information.") flag.BoolVar(&outOfCluster, "outofcluster", false, "Whether the operator runs in- our outside of the Kubernetes cluster.") @@ -38,6 +47,17 @@ func init() { log.Printf("Fully qualified configmap name: %v", config.ConfigMapName) } + if crd_interval := os.Getenv("CRD_READY_WAIT_INTERVAL"); crd_interval != "" { + config.CRDReadyWaitInterval = mustParseDuration(crd_interval) + } else { + config.CRDReadyWaitInterval = 4 * time.Second + } + + if crd_timeout := os.Getenv("CRD_READY_WAIT_TIMEOUT"); crd_timeout != "" { + config.CRDReadyWaitTimeout = mustParseDuration(crd_timeout) + } else { + config.CRDReadyWaitTimeout = 30 * time.Second + } } func main() { diff --git a/pkg/controller/controller.go b/pkg/controller/controller.go index 930cf3f32..8633a3f5a 100644 --- a/pkg/controller/controller.go +++ b/pkg/controller/controller.go @@ -101,23 +101,24 @@ func (c *Controller) initOperatorConfig() { c.logger.Infoln("no ConfigMap specified. Loading default values") } - configMapData["watched_namespace"] = c.getEffectiveNamespace(os.Getenv("WATCHED_NAMESPACE"), configMapData["watched_namespace"]) - - if c.config.NoDatabaseAccess { - configMapData["enable_database_access"] = "false" - } - if c.config.NoTeamsAPI { - configMapData["enable_teams_api"] = "false" - } - c.opConfig = config.NewFromMap(configMapData) c.warnOnDeprecatedOperatorParameters() +} + +func (c *Controller) modifyConfigFromEnvironment() { + c.opConfig.WatchedNamespace = c.getEffectiveNamespace(os.Getenv("WATCHED_NAMESPACE"), c.opConfig.WatchedNamespace) + + if c.config.NoDatabaseAccess { + c.opConfig.EnableDBAccess = c.config.NoDatabaseAccess + } + if c.config.NoTeamsAPI { + c.opConfig.EnableTeamsAPI = c.config.NoTeamsAPI + } scalyrAPIKey := os.Getenv("SCALYR_API_KEY") if scalyrAPIKey != "" { c.opConfig.ScalyrAPIKey = scalyrAPIKey } - } // warningOnDeprecatedParameters emits warnings upon finding deprecated parmaters @@ -163,33 +164,34 @@ func (c *Controller) initPodServiceAccount() { func (c *Controller) initController() { c.initClients() - c.initOperatorConfig() - c.initPodServiceAccount() - c.initSharedInformers() - - c.logger.Infof("config: %s", c.opConfig.MustMarshal()) - - if c.opConfig.DebugLogging { - c.logger.Logger.Level = logrus.DebugLevel + if configObjectName := os.Getenv("POSTGRES_OPERATOR_CONFIGURATION_OBJECT"); configObjectName != "" { + if err := c.createOperatorCRD(); err != nil { + c.logger.Fatalf("could not register Operator Configuration CustomResourceDefinition: %v", err) + } + if cfg, err := c.readOperatorConfigurationFromCRD(configObjectName); err != nil { + c.logger.Fatalf("unable to read operator configuration: %v", err) + } else { + c.opConfig = c.importConfigurationFromCRD(&cfg.Configuration) + } + } else { + c.initOperatorConfig() } + c.modifyConfigFromEnvironment() if err := c.createPostgresCRD(); err != nil { c.logger.Fatalf("could not register Postgres CustomResourceDefinition: %v", err) } - if err := c.createOperatorCRD(); err != nil { - c.logger.Fatalf("could not register Operator Configuration CustomResourceDefinition: %v", err) + c.initPodServiceAccount() + c.initSharedInformers() + + if c.opConfig.DebugLogging { + c.logger.Logger.Level = logrus.DebugLevel } - if configObjectName := os.Getenv("POSTGRES_OPERATOR_CONFIGURATION_OBJECT"); configObjectName != "" { - if config, err := c.readOperatorConfigurationFromCRD(configObjectName); err != nil { - c.logger.Fatalf("unable to read operator configuration: %v", err) - } else { - c.logger.Fatalf("operator configuration: %#v", config) - } - } + c.logger.Infof("config: %s", c.opConfig.MustMarshal()) if infraRoles, err := c.getInfrastructureRoles(&c.opConfig.InfrastructureRolesSecretName); err != nil { c.logger.Warningf("could not get infrastructure roles: %v", err) diff --git a/pkg/controller/operator_config.go b/pkg/controller/operator_config.go index 8a38cd53d..b6d177c96 100644 --- a/pkg/controller/operator_config.go +++ b/pkg/controller/operator_config.go @@ -4,14 +4,12 @@ import ( "encoding/json" "fmt" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "github.com/zalando-incubator/postgres-operator/pkg/util/constants" - "github.com/zalando-incubator/postgres-operator/pkg/util/config" + "github.com/zalando-incubator/postgres-operator/pkg/util/constants" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) - -func (c *Controller) readOperatorConfigurationFromCRD(configObjectName string) (*config.OperatorConfiguration, error){ +func (c *Controller) readOperatorConfigurationFromCRD(configObjectName string) (*config.OperatorConfiguration, error) { var ( config config.OperatorConfiguration ) @@ -22,7 +20,7 @@ func (c *Controller) readOperatorConfigurationFromCRD(configObjectName string) ( Resource(constants.OperatorConfigCRDResource). VersionedParams(&metav1.ListOptions{ResourceVersion: "0"}, metav1.ParameterCodec) - data, err := req.DoRaw(); + data, err := req.DoRaw() if err != nil { return nil, fmt.Errorf("could not get operator configuration object %s: %v", configObjectName, err) } @@ -31,4 +29,77 @@ func (c *Controller) readOperatorConfigurationFromCRD(configObjectName string) ( } return &config, nil -} \ No newline at end of file +} + +// importConfigurationFromCRD is a transitional function that converts CRD configuration to the one based on the configmap +func (c *Controller) importConfigurationFromCRD(fromCRD *config.OperatorConfigurationData) *config.Config { + result := &config.Config{} + + result.EtcdHost = fromCRD.EtcdHost + result.DockerImage = fromCRD.DockerImage + result.Workers = fromCRD.Workers + result.MinInstances = fromCRD.MinInstances + result.MaxInstances = fromCRD.MaxInstances + result.ResyncPeriod = fromCRD.ResyncPeriod + + result.SuperUsername = fromCRD.PostgresUsersConfiguration.SuperUsername + result.ReplicationUsername = fromCRD.PostgresUsersConfiguration.ReplicationUsername + + result.PodServiceAccountName = fromCRD.Kubernetes.PodServiceAccountName + result.PodServiceAccountDefinition = fromCRD.Kubernetes.PodServiceAccountDefinition + result.PodTerminateGracePeriod = fromCRD.Kubernetes.PodTerminateGracePeriod + result.WatchedNamespace = fromCRD.Kubernetes.WatchedNamespace + result.PDBNameFormat = fromCRD.Kubernetes.PDBNameFormat + result.SecretNameTemplate = fromCRD.Kubernetes.SecretNameTemplate + result.OAuthTokenSecretName = fromCRD.Kubernetes.OAuthTokenSecretName + result.InfrastructureRolesSecretName = fromCRD.Kubernetes.InfrastructureRolesSecretName + result.PodRoleLabel = fromCRD.Kubernetes.PodRoleLabel + result.ClusterLabels = fromCRD.Kubernetes.ClusterLabels + result.ClusterNameLabel = fromCRD.Kubernetes.ClusterNameLabel + result.NodeReadinessLabel = fromCRD.Kubernetes.NodeReadinessLabel + + result.DefaultCPURequest = fromCRD.PostgresPodResources.DefaultCPURequest + result.DefaultMemoryRequest = fromCRD.PostgresPodResources.DefaultMemoryRequest + result.DefaultCPULimit = fromCRD.PostgresPodResources.DefaultCPULimit + result.DefaultMemoryLimit = fromCRD.PostgresPodResources.DefaultMemoryLimit + + result.ResourceCheckInterval = fromCRD.Timeouts.ResourceCheckInterval + result.ResourceCheckTimeout = fromCRD.Timeouts.ResourceCheckTimeout + result.PodLabelWaitTimeout = fromCRD.Timeouts.PodLabelWaitTimeout + result.PodDeletionWaitTimeout = fromCRD.Timeouts.PodDeletionWaitTimeout + result.ReadyWaitInterval = fromCRD.Timeouts.ReadyWaitInterval + result.ReadyWaitTimeout = fromCRD.Timeouts.ReadyWaitTimeout + + result.DbHostedZone = fromCRD.LoadBalancer.DbHostedZone + result.EnableMasterLoadBalancer = fromCRD.LoadBalancer.EnableMasterLoadBalancer + result.EnableReplicaLoadBalancer = fromCRD.LoadBalancer.EnableReplicaLoadBalancer + result.MasterDNSNameFormat = fromCRD.LoadBalancer.MasterDNSNameFormat + result.ReplicaDNSNameFormat = fromCRD.LoadBalancer.ReplicaDNSNameFormat + + result.WALES3Bucket = fromCRD.AWSGCP.WALES3Bucket + result.LogS3Bucket = fromCRD.AWSGCP.LogS3Bucket + result.KubeIAMRole = fromCRD.AWSGCP.KubeIAMRole + + result.DebugLogging = fromCRD.OperatorDebug.DebugLogging + result.EnableDBAccess = fromCRD.OperatorDebug.EnableDBAccess + result.EnableTeamsAPI = fromCRD.TeamsAPI.EnableTeamsAPI + result.TeamsAPIUrl = fromCRD.TeamsAPI.TeamsAPIUrl + result.TeamAPIRoleConfiguration = fromCRD.TeamsAPI.TeamAPIRoleConfiguration + result.EnableTeamSuperuser = fromCRD.TeamsAPI.EnableTeamSuperuser + result.TeamAdminRole = fromCRD.TeamsAPI.TeamAdminRole + result.PamRoleName = fromCRD.TeamsAPI.PamRoleName + + result.APIPort = fromCRD.LoggingRESTAPI.APIPort + result.RingLogLines = fromCRD.LoggingRESTAPI.RingLogLines + result.ClusterHistoryEntries = fromCRD.LoggingRESTAPI.ClusterHistoryEntries + + result.ScalyrAPIKey = fromCRD.Scalyr.ScalyrAPIKey + result.ScalyrImage = fromCRD.Scalyr.ScalyrImage + result.ScalyrServerURL = fromCRD.Scalyr.ScalyrServerURL + result.ScalyrCPURequest = fromCRD.Scalyr.ScalyrCPURequest + result.ScalyrMemoryRequest = fromCRD.Scalyr.ScalyrMemoryRequest + result.ScalyrCPULimit = fromCRD.Scalyr.ScalyrCPULimit + result.ScalyrMemoryLimit = fromCRD.Scalyr.ScalyrMemoryLimit + + return result +} diff --git a/pkg/controller/util.go b/pkg/controller/util.go index 11f6796b9..0da4e6799 100644 --- a/pkg/controller/util.go +++ b/pkg/controller/util.go @@ -75,7 +75,7 @@ func (c *Controller) createZalandoCRD(plural, singular, short string) error { c.logger.Infof("customResourceDefinition %q has been registered", crd.Name) } - return wait.Poll(c.opConfig.CRD.ReadyWaitInterval, c.opConfig.CRD.ReadyWaitTimeout, func() (bool, error) { + return wait.Poll(c.config.CRDReadyWaitInterval, c.config.CRDReadyWaitTimeout, func() (bool, error) { c, err := c.KubeClient.CustomResourceDefinitions().Get(crd.Name, metav1.GetOptions{}) if err != nil { return false, err diff --git a/pkg/spec/types.go b/pkg/spec/types.go index 204d16aa7..ec870251a 100644 --- a/pkg/spec/types.go +++ b/pkg/spec/types.go @@ -162,10 +162,12 @@ type ControllerConfig struct { RestConfig *rest.Config `json:"-"` InfrastructureRoles map[string]PgUser - NoDatabaseAccess bool - NoTeamsAPI bool - ConfigMapName NamespacedName - Namespace string + NoDatabaseAccess bool + NoTeamsAPI bool + CRDReadyWaitInterval time.Duration + CRDReadyWaitTimeout time.Duration + ConfigMapName NamespacedName + Namespace string } // cached value for the GetOperatorNamespace diff --git a/pkg/util/config/config.go b/pkg/util/config/config.go index c3f135557..380701ef7 100644 --- a/pkg/util/config/config.go +++ b/pkg/util/config/config.go @@ -40,11 +40,11 @@ type Resources struct { // Auth describes authentication specific configuration parameters type Auth struct { - SecretNameTemplate StringTemplate `name:"secret_name_template" default:"{username}.{cluster}.credentials.{tprkind}.{tprgroup}"` - PamRoleName string `name:"pam_role_name" default:"zalandos"` - PamConfiguration string `name:"pam_configuration" default:"https://info.example.com/oauth2/tokeninfo?access_token= uid realm=/employees"` - TeamsAPIUrl string `name:"teams_api_url" default:"https://teams.example.com/api/"` - OAuthTokenSecretName spec.NamespacedName `name:"oauth_token_secret_name" default:"postgresql-operator"` + SecretNameTemplate StringTemplate `name:"secret_name_template" default:"{username}.{cluster}.credentials.{tprkind}.{tprgroup}"` + PamRoleName string `name:"pam_role_name" default:"zalandos"` + PamConfiguration string `name:"pam_configuration" default:"https://info.example.com/oauth2/tokeninfo?access_token= uid realm=/employees"` + TeamsAPIUrl string `name:"teams_api_url" default:"https://teams.example.com/api/"` + OAuthTokenSecretName spec.NamespacedName `name:"oauth_token_secret_name" default:"postgresql-operator"` InfrastructureRolesSecretName spec.NamespacedName `name:"infrastructure_roles_secret_name"` SuperUsername string `name:"super_username" default:"postgres"` ReplicationUsername string `name:"replication_username" default:"standby"` diff --git a/pkg/util/config/crd_config.go b/pkg/util/config/crd_config.go index a2ea6e7c9..a957164e0 100644 --- a/pkg/util/config/crd_config.go +++ b/pkg/util/config/crd_config.go @@ -1,7 +1,6 @@ package config import ( - "encoding/json" "time" @@ -15,93 +14,91 @@ type OperatorConfiguration struct { metav1.ObjectMeta `json:"metadata"` Configuration OperatorConfigurationData `json:"configuration"` - Error error `json:"-"` + Error error `json:"-"` } - type OperatorConfigurationList struct { - metav1.TypeMeta `json:",inline"` + metav1.TypeMeta `json:",inline"` metav1.ListMeta `json:"metadata"` Items []OperatorConfiguration `json:"items"` } type PostgresUsersConfiguration struct { - SuperUsername string `json:"super_username,omitempty"` - ReplicationUsername string `json:"replication_username,omitempty"` + SuperUsername string `json:"super_username,omitempty"` + ReplicationUsername string `json:"replication_username,omitempty"` } type KubernetesMetaConfiguration struct { PodServiceAccountName string `json:"pod_service_account_name,omitempty"` // TODO: change it to the proper json - PodServiceAccountDefinition string `json:"pod_service_account_definition,omitempty"` - PodTerminateGracePeriod time.Duration `json:"pod_terminate_grace_period,omitempty"` - WatchedNamespace string `json:"watched_namespace,omitempty"` - PDBNameFormat StringTemplate `json:"pdb_name_format,omitempty"` - SecretNameTemplate StringTemplate `json:"secret_name_template,omitempty"` - OAuthTokenSecretName spec.NamespacedName `json:"oauth_token_secret_name,omitempty"` - InfrastructureRolesSecretName spec.NamespacedName `json:"infrastructure_roles_secret_name,omitempty"` - PodRoleLabel string `json:"pod_role_label,omitempty"` - ClusterLabels map[string]string `json:"cluster_labels,omitempty"` - ClusterNameLabel string `json:"cluster_name_label,omitempty"` - NodeReadinessLabel map[string]string `json:"node_readiness_label,omitempty"` + PodServiceAccountDefinition string `json:"pod_service_account_definition,omitempty"` + PodTerminateGracePeriod time.Duration `json:"pod_terminate_grace_period,omitempty"` + WatchedNamespace string `json:"watched_namespace,omitempty"` + PDBNameFormat StringTemplate `json:"pdb_name_format,omitempty"` + SecretNameTemplate StringTemplate `json:"secret_name_template,omitempty"` + OAuthTokenSecretName spec.NamespacedName `json:"oauth_token_secret_name,omitempty"` + InfrastructureRolesSecretName spec.NamespacedName `json:"infrastructure_roles_secret_name,omitempty"` + PodRoleLabel string `json:"pod_role_label,omitempty"` + ClusterLabels map[string]string `json:"cluster_labels,omitempty"` + ClusterNameLabel string `json:"cluster_name_label,omitempty"` + NodeReadinessLabel map[string]string `json:"node_readiness_label,omitempty"` // TODO: use a proper toleration structure? PodToleration map[string]string `json:"toleration,omitempty"` // TODO: use namespacedname PodEnvironmentConfigMap string `json:"pod_environment_configmap,omitempty"` - } type PostgresPodResourcesDefaults struct { - DefaultCPURequest string `json:"default_cpu_request,omitempty"` - DefaultMemoryRequest string `json:"default_memory_request,omitempty"` - DefaultCPULimit string `json:"default_cpu_limit,omitempty"` - DefaultMemoryLimit string `json:"default_memory_limit,omitempty"` + DefaultCPURequest string `json:"default_cpu_request,omitempty"` + DefaultMemoryRequest string `json:"default_memory_request,omitempty"` + DefaultCPULimit string `json:"default_cpu_limit,omitempty"` + DefaultMemoryLimit string `json:"default_memory_limit,omitempty"` } type OperatorTimeouts struct { - ResourceCheckInterval time.Duration `json:"resource_check_interval,omitempty"` - ResourceCheckTimeout time.Duration `json:"resource_check_timeout,omitempty"` - PodLabelWaitTimeout time.Duration `json:"pod_label_wait_timeout,omitempty"` - PodDeletionWaitTimeout time.Duration `json:"pod_deletion_wait_timeout,omitempty"` - ReadyWaitInterval time.Duration `json:"ready_wait_interval,omitempty"` - ReadyWaitTimeout time.Duration `json:"ready_wait_timeout,omitempty"` + ResourceCheckInterval time.Duration `json:"resource_check_interval,omitempty"` + ResourceCheckTimeout time.Duration `json:"resource_check_timeout,omitempty"` + PodLabelWaitTimeout time.Duration `json:"pod_label_wait_timeout,omitempty"` + PodDeletionWaitTimeout time.Duration `json:"pod_deletion_wait_timeout,omitempty"` + ReadyWaitInterval time.Duration `json:"ready_wait_interval,omitempty"` + ReadyWaitTimeout time.Duration `json:"ready_wait_timeout,omitempty"` } type LoadBalancerConfiguration struct { - DbHostedZone string `json:"db_hosted_zone,omitempty"` - EnableMasterLoadBalancer bool `json:"enable_master_load_balancer,omitempty"` - EnableReplicaLoadBalancer bool `json:"enable_replica_load_balancer,omitempty"` - MasterDNSNameFormat StringTemplate `json:"master_dns_name_format,omitempty"` - ReplicaDNSNameFormat StringTemplate `json:"replica_dns_name_format,omitempty"` + DbHostedZone string `json:"db_hosted_zone,omitempty"` + EnableMasterLoadBalancer bool `json:"enable_master_load_balancer,omitempty"` + EnableReplicaLoadBalancer bool `json:"enable_replica_load_balancer,omitempty"` + MasterDNSNameFormat StringTemplate `json:"master_dns_name_format,omitempty"` + ReplicaDNSNameFormat StringTemplate `json:"replica_dns_name_format,omitempty"` } type AWSGCPConfiguration struct { - WALES3Bucket string `json:"wal_s3_bucket,omitempty"` - LogS3Bucket string `json:"log_s3_bucket,omitempty"` - KubeIAMRole string `json:"kube_iam_role,omitempty"` + WALES3Bucket string `json:"wal_s3_bucket,omitempty"` + LogS3Bucket string `json:"log_s3_bucket,omitempty"` + KubeIAMRole string `json:"kube_iam_role,omitempty"` } type OperatorDebugConfiguration struct { - DebugLogging bool `json:"debug_logging,omitempty"` - EnableDBAccess bool `json:"enable_database_access,omitempty"` + DebugLogging bool `json:"debug_logging,omitempty"` + EnableDBAccess bool `json:"enable_database_access,omitempty"` } type TeamsAPIConfiguration struct { - EnableTeamsAPI bool `json:"enable_teams_api,omitempty"` - TeamsAPIUrl string `json:"teams_api_url,omitempty"` + EnableTeamsAPI bool `json:"enable_teams_api,omitempty"` + TeamsAPIUrl string `json:"teams_api_url,omitempty"` TeamAPIRoleConfiguration map[string]string `json:"team_api_role_configuration,omitempty"` - EnableTeamSuperuser bool `json:"enable_team_superuser,omitempty"` - TeamAdminRole string `json:"team_admin_role,omitempty"` - PamRoleName string `json:"pam_role_name,omitempty"` - PamConfiguration string `json:"pam_configuration,omitempty"` + EnableTeamSuperuser bool `json:"enable_team_superuser,omitempty"` + TeamAdminRole string `json:"team_admin_role,omitempty"` + PamRoleName string `json:"pam_role_name,omitempty"` + PamConfiguration string `json:"pam_configuration,omitempty"` ProtectedRoles []string `json:"protected_role_names,omitempty"` } type LoggingRESTAPIConfiguration struct { - APIPort int `json:"api_port,omitempty"` - RingLogLines int `json:"ring_log_lines,omitempty"` - ClusterHistoryEntries int `json:"cluster_history_entries,omitempty"` + APIPort int `json:"api_port,omitempty"` + RingLogLines int `json:"ring_log_lines,omitempty"` + ClusterHistoryEntries int `json:"cluster_history_entries,omitempty"` } type ScalyrConfiguration struct { @@ -115,36 +112,34 @@ type ScalyrConfiguration struct { } type OperatorConfigurationData struct { - EtcdHost string `json:"etcd_host,omitempty"` - DockerImage string `json:"docker_image,omitempty"` - Workers int `json:"workers,omitempty"` - MinInstances int32 `json:"min_instances,omitempty"` - MaxInstances int32 `json:"max_instances,omitempty"` - ResyncPeriod time.Duration `json:"resync_period,omitempty"` - PostgresUsersConfiguration PostgresUsersConfiguration `json:"users"` - Kubernetes KubernetesMetaConfiguration `json:"kubernetes"` - PostgresPodResources PostgresPodResourcesDefaults `json:"postgres_pod_resources"` - Timeouts OperatorTimeouts `json:"timeouts"` - LoadBalancer LoadBalancerConfiguration `json:"load_balancer"` - AWSGCP AWSGCPConfiguration `json:"aws_or_gcp"` - OperatorDebug OperatorDebugConfiguration `json:"debug"` - TeamsAPI TeamsAPIConfiguration `json:"teams_api"` - LoggingRESTAPI LoggingRESTAPIConfiguration `json:"logging_rest_api"` - Scalyr ScalyrConfiguration `json:"scalyr"` + EtcdHost string `json:"etcd_host,omitempty"` + DockerImage string `json:"docker_image,omitempty"` + Workers uint32 `json:"workers,omitempty"` + MinInstances int32 `json:"min_instances,omitempty"` + MaxInstances int32 `json:"max_instances,omitempty"` + ResyncPeriod time.Duration `json:"resync_period,omitempty"` + PostgresUsersConfiguration PostgresUsersConfiguration `json:"users"` + Kubernetes KubernetesMetaConfiguration `json:"kubernetes"` + PostgresPodResources PostgresPodResourcesDefaults `json:"postgres_pod_resources"` + Timeouts OperatorTimeouts `json:"timeouts"` + LoadBalancer LoadBalancerConfiguration `json:"load_balancer"` + AWSGCP AWSGCPConfiguration `json:"aws_or_gcp"` + OperatorDebug OperatorDebugConfiguration `json:"debug"` + TeamsAPI TeamsAPIConfiguration `json:"teams_api"` + LoggingRESTAPI LoggingRESTAPIConfiguration `json:"logging_rest_api"` + Scalyr ScalyrConfiguration `json:"scalyr"` } - type OperatorConfigurationUsers struct { - SuperUserName string `json:"superuser_name,omitempty"` - Replication string `json:"replication_user_name,omitempty"` - ProtectedRoles []string `json:"protected_roles,omitempty"` + SuperUserName string `json:"superuser_name,omitempty"` + Replication string `json:"replication_user_name,omitempty"` + ProtectedRoles []string `json:"protected_roles,omitempty"` TeamAPIRoleConfiguration map[string]string `json:"team_api_role_configuration,omitempty"` } type OperatorConfigurationCopy OperatorConfiguration type OperatorConfigurationListCopy OperatorConfigurationList - func (opc *OperatorConfiguration) UnmarshalJSON(data []byte) error { var ref OperatorConfigurationCopy if err := json.Unmarshal(data, &ref); err != nil { @@ -162,4 +157,3 @@ func (opcl *OperatorConfigurationList) UnmarshalJSON(data []byte) error { *opcl = OperatorConfigurationList(ref) return nil } - diff --git a/pkg/util/constants/crd.go b/pkg/util/constants/crd.go index f3522ba61..113264f01 100644 --- a/pkg/util/constants/crd.go +++ b/pkg/util/constants/crd.go @@ -2,13 +2,12 @@ package constants // Different properties of the PostgreSQL Custom Resource Definition const ( - PostgresCRDKind = "postgresql" - PostgresCRDResource = "postgresqls" - PostgresCRDShort = "pg" - CRDGroup = "acid.zalan.do" - CRDApiVersion = "v1" - OperatorConfigCRDKind = "postgresql-operator-configuration" + PostgresCRDKind = "postgresql" + PostgresCRDResource = "postgresqls" + PostgresCRDShort = "pg" + CRDGroup = "acid.zalan.do" + CRDApiVersion = "v1" + OperatorConfigCRDKind = "postgresql-operator-configuration" OperatorConfigCRDResource = "postgresql-operator-configurations" - OperatorConfigCRDShort = "pgopconfig" - + OperatorConfigCRDShort = "pgopconfig" )