cdk8s-core icon indicating copy to clipboard operation
cdk8s-core copied to clipboard

cdk8s is not quoting strings automatically

Open achanda opened this issue 2 years ago • 2 comments

Description of the bug:

I am using cdk8s using Go to manage CloudnativePG clusters. The generated yaml has some config parameters without quotes.

Reproduction Steps:

package main

import (
	"fmt"
	"strconv"

	"code.cfops.it/k8s-db-clusters/pgclusters/imports/postgresqlcnpgio"
	"github.com/aws/constructs-go/constructs/v10"
	"github.com/aws/jsii-runtime-go"
	"github.com/cdk8s-team/cdk8s-core-go/cdk8s/v2"
)

type PGClusterProps struct {
	name                                 string
	namespace                            string
	instances                            int64
	storageSize                          string
	postgresCpuRequest                   int
	postgresMemoryRequest                int     // Gi
	postgresConfigSharedBuffers          int     // GB
	postgresConfigWorkMem                int     // kB
	postgresConfigMaintenanceWorkMem     int     // GB
	postgresConfigEffectiveIoConcurrency int     // no unit
	postgresConfigEffectiveCacheSize     int     // GB
	postgresConfigCpuTupleCost           float64 // no unit
}

func NewPGCluster(scope constructs.Construct, id string, props *PGClusterProps) cdk8s.Chart {
	chart := cdk8s.NewChart(scope, jsii.String(id), nil)
        postgresqlcnpgio.NewCluster(chart, jsii.String(id+"cluster"), &postgresqlcnpgio.ClusterProps{
		Metadata: &cdk8s.ApiObjectMetadata{
			Name:      jsii.String(props.name),
			Namespace: jsii.String(props.namespace),
		},
		Spec: &postgresqlcnpgio.ClusterSpec{
			Instances:             jsii.Number(props.instances),
			PrimaryUpdateStrategy: postgresqlcnpgio.ClusterSpecPrimaryUpdateStrategy_UNSUPERVISED,
			Storage: &postgresqlcnpgio.ClusterSpecStorage{
				Size: jsii.String(props.storageSize),
			},
			Bootstrap: &postgresqlcnpgio.ClusterSpecBootstrap{
				Initdb: &postgresqlcnpgio.ClusterSpecBootstrapInitdb{
					Database:      jsii.String("app"),
					Owner:         jsii.String("app"),
					DataChecksums: jsii.Bool(true),
				},
			},
			Postgresql: &postgresqlcnpgio.ClusterSpecPostgresql{
				Parameters: &map[string]*string{
					"cpu_tuple_cost":                   jsii.String(strconv.FormatFloat(props.postgresConfigCpuTupleCost, 'f', -1, 64)),
					"checkpoint_completion_target":     jsii.String("0.9"),
					"bgwriter_lru_maxpages":            jsii.String("1000"),
					"bgwriter_delay":                   jsii.String("10ms"),
					"shared_buffers":                   jsii.String(strconv.Itoa(props.postgresConfigSharedBuffers) + "GB"),
					"effective_cache_size":             jsii.String(strconv.Itoa(props.postgresConfigEffectiveCacheSize) + "GB"),
					"maintenance_work_mem":             jsii.String(strconv.Itoa(props.postgresConfigMaintenanceWorkMem) + "GB"),
					"wal_buffers":                      jsii.String("16MB"),
					"wal_log_hints":                    jsii.String("on"),
					"default_statistics_target":        jsii.String("100"),
					"random_page_cost":                 jsii.String("1.1"),
					"effective_io_concurrency":         jsii.String(strconv.Itoa(props.postgresConfigEffectiveIoConcurrency)),
					"work_mem":                         jsii.String(strconv.Itoa(props.postgresConfigWorkMem) + "kB"),
					"min_wal_size":                     jsii.String("1GB"),
					"max_wal_size":                     jsii.String("4GB"),
					"max_worker_processes":             jsii.String("10"),
					"max_parallel_workers_per_gather":  jsii.String("4"),
					"max_parallel_workers":             jsii.String("10"),
					"max_parallel_maintenance_workers": jsii.String("4"),
					"log_checkpoints":                  jsii.String("on"),
					"log_connections":                  jsii.String("on"),
					"log_disconnections":               jsii.String("on"),
					"log_lock_waits":                   jsii.String("on"),
					"log_temp_files":                   jsii.String("0"),
					"log_autovacuum_min_duration":      jsii.String("0"),
					"log_error_verbosity":              jsii.String("default"),
					"log_line_prefix":                  jsii.String(fmt.Sprintf("%s time=%%m,pid=%%p,user=%%u,db=%%d,client=%%r,appname=%%a,vid=%%v,xid=%%x ", props.name)),
				},
			},
		},
	})

    return chart
}

func main() {
	app := cdk8s.NewApp(nil)
	NewPGCluster(app, "mytestcluster", &PGClusterProps{
		name:                  "mytestcluster",
		namespace:             "cnpg-clusters",
		instances:             3,
		storageSize:           "10Gi",
		postgresCpuRequest:    5,
		postgresMemoryRequest: 32, // in Gi
	})
	app.Synth()
}

This produces the following yaml

apiVersion: postgresql.cnpg.io/v1
kind: Cluster
metadata:
  name: mytestcluster
  namespace: cnpg-clusters
spec:
  bootstrap:
    initdb:
      dataChecksums: true
      database: app
      owner: app
  instances: 3
  postgresql:
    parameters:
      bgwriter_delay: 10ms
      bgwriter_lru_maxpages: "1000"
      checkpoint_completion_target: "0.9"
      cpu_tuple_cost: "0.03"
      default_statistics_target: "100"
      effective_cache_size: 0GB
      effective_io_concurrency: "300"
      log_autovacuum_min_duration: "0"
      log_checkpoints: "on"
      log_connections: "on"
      log_disconnections: "on"
      log_error_verbosity: default
      log_line_prefix: "mytestcluster time=%m,pid=%p,user=%u,db=%d,client=%r,appname=%a,vid=%v,xid=%x "
      log_lock_waits: "on"
      log_temp_files: "0"
      maintenance_work_mem: 1GB
      max_parallel_maintenance_workers: "4"
      max_parallel_workers: "10"
      max_parallel_workers_per_gather: "4"
      max_wal_size: 4GB
      max_worker_processes: "10"
      min_wal_size: 1GB
      random_page_cost: "1.1"
      shared_buffers: 10GB
      wal_buffers: 16MB
      wal_log_hints: "on"
      work_mem: 0kB
  primaryUpdateStrategy: unsupervised
  storage:
    size: 10Gi

Some postgres params are quoted while some are not. This does not work since the cnpg operator expects all params to be strings.

Error Log:

There are no errors

Environment:

  • Framework Version: 2.32.0
  • OS: MacOS 13.5

This is :bug: Bug Report

achanda avatar Aug 11 '23 20:08 achanda