diff --git a/.github/workflows/e2e-deploy.yml b/.github/workflows/e2e-deploy.yml index 6cfb570993e..a213d1188d1 100644 --- a/.github/workflows/e2e-deploy.yml +++ b/.github/workflows/e2e-deploy.yml @@ -133,7 +133,7 @@ jobs: go test \ -v tests/e2e/crud_test.go \ -tags "e2e" \ - -timeout 15m \ + -timeout 30m \ -host=localhost \ -port=8081 \ -dataset=`pwd`/hack/benchmark/assets/dataset/${DATASET} \ @@ -143,7 +143,7 @@ jobs: -get-object-num=5 \ -update-num=2 \ -remove-num=2 \ - -wait-after-insert=3m \ + -wait-after-insert=10m \ -portforward \ -portforward-ns=default \ -portforward-pod-name=${podname} \ @@ -255,7 +255,7 @@ jobs: go test \ -v tests/e2e/crud_test.go \ -tags "e2e" \ - -timeout 15m \ + -timeout 30m \ -host=localhost \ -port=8081 \ -dataset=`pwd`/hack/benchmark/assets/dataset/${DATASET} \ @@ -265,7 +265,7 @@ jobs: -get-object-num=10 \ -update-num=3 \ -remove-num=2 \ - -wait-after-insert=3m \ + -wait-after-insert=10m \ -portforward \ -portforward-ns=default \ -portforward-pod-name=${podname} \ diff --git a/Makefile b/Makefile index e5d16c04569..88734d8e27c 100644 --- a/Makefile +++ b/Makefile @@ -233,15 +233,15 @@ SHELL = bash E2E_BIND_HOST ?= 127.0.0.1 E2E_BIND_PORT ?= 8082 -E2E_TIMEOUT ?= 15m +E2E_TIMEOUT ?= 30m E2E_DATASET_NAME ?= fashion-mnist-784-euclidean -E2E_INSERT_COUNT ?= 1000 +E2E_INSERT_COUNT ?= 10000 E2E_SEARCH_COUNT ?= 1000 -E2E_SEARCH_BY_ID_COUNT ?= 10 +E2E_SEARCH_BY_ID_COUNT ?= 100 E2E_GET_OBJECT_COUNT ?= 10 -E2E_UPDATE_COUNT ?= 3 +E2E_UPDATE_COUNT ?= 10 E2E_REMOVE_COUNT ?= 3 -E2E_WAIT_FOR_CREATE_INDEX_DURATION ?= 3m +E2E_WAIT_FOR_CREATE_INDEX_DURATION ?= 8m E2E_TARGET_NAME ?= vald-meta-gateway E2E_TARGET_POD_NAME ?= $(eval E2E_TARGET_POD_NAME := $(shell kubectl get pods --selector=app=$(E2E_TARGET_NAME) | tail -1 | cut -f1 -d " "))$(E2E_TARGET_POD_NAME) E2E_TARGET_NAMESPACE ?= default diff --git a/charts/vald/templates/_helpers.tpl b/charts/vald/templates/_helpers.tpl index ecfe92ecb50..670e7b20320 100755 --- a/charts/vald/templates/_helpers.tpl +++ b/charts/vald/templates/_helpers.tpl @@ -456,6 +456,7 @@ tls: cert: {{ default .default.tls.cert .Values.tls.cert | quote }} key: {{ default .default.tls.key .Values.tls.key | quote }} ca: {{ default .default.tls.ca .Values.tls.ca | quote }} + insecure_skip_verify: {{ default .default.tls.insecure_skip_verify .Values.tls.insecure_skip_verify }} {{- else }} {{- toYaml .default.tls | nindent 2 }} {{- end }} @@ -551,6 +552,7 @@ dial_option: cert: {{ default .default.dial_option.tcp.tls.cert .Values.dial_option.tcp.tls.cert | quote }} key: {{ default .default.dial_option.tcp.tls.key .Values.dial_option.tcp.tls.key | quote }} ca: {{ default .default.dial_option.tcp.tls.ca .Values.dial_option.tcp.tls.ca | quote }} + insecure_skip_verify: {{ default .default.dial_option.tcp.tls.insecure_skip_verify .Values.dial_option.tcp.tls.insecure_skip_verify }} {{- else }} {{- toYaml .default.dial_option.tcp.tls | nindent 6 }} {{- end }} @@ -574,6 +576,7 @@ tls: cert: {{ default .default.tls.cert .Values.tls.cert | quote }} key: {{ default .default.tls.key .Values.tls.key | quote }} ca: {{ default .default.tls.ca .Values.tls.ca | quote }} + insecure_skip_verify: {{ default .default.tls.insecure_skip_verify .Values.tls.insecure_skip_verify }} {{- else }} {{- toYaml .default.tls | nindent 2 }} {{- end }} diff --git a/charts/vald/templates/gateway/backup/daemonset.yaml b/charts/vald/templates/gateway/backup/daemonset.yaml index 80743be0110..074a381e62a 100644 --- a/charts/vald/templates/gateway/backup/daemonset.yaml +++ b/charts/vald/templates/gateway/backup/daemonset.yaml @@ -118,7 +118,7 @@ spec: {{- end }} {{- if $gateway.podPriority }} {{- if $gateway.podPriority.enabled }} - priorityClassName: {{ $gateway.name }}-priority + priorityClassName: {{ .Release.Namespace }}-{{ $gateway.name }}-priority {{- end }} {{- end }} status: diff --git a/charts/vald/templates/gateway/backup/deployment.yaml b/charts/vald/templates/gateway/backup/deployment.yaml index bf975667225..eb3ef131658 100644 --- a/charts/vald/templates/gateway/backup/deployment.yaml +++ b/charts/vald/templates/gateway/backup/deployment.yaml @@ -123,7 +123,7 @@ spec: {{- end }} {{- if $gateway.podPriority }} {{- if $gateway.podPriority.enabled }} - priorityClassName: {{ $gateway.name }}-priority + priorityClassName: {{ .Release.Namespace }}-{{ $gateway.name }}-priority {{- end }} {{- end }} status: diff --git a/charts/vald/templates/gateway/filter/daemonset.yaml b/charts/vald/templates/gateway/filter/daemonset.yaml index a1308cf67eb..4cf6607d40b 100644 --- a/charts/vald/templates/gateway/filter/daemonset.yaml +++ b/charts/vald/templates/gateway/filter/daemonset.yaml @@ -118,7 +118,7 @@ spec: {{- end }} {{- if $gateway.podPriority }} {{- if $gateway.podPriority.enabled }} - priorityClassName: {{ $gateway.name }}-priority + priorityClassName: {{ .Release.Namespace }}-{{ $gateway.name }}-priority {{- end }} {{- end }} status: diff --git a/charts/vald/templates/gateway/filter/deployment.yaml b/charts/vald/templates/gateway/filter/deployment.yaml index bd65d932909..ea024f03c0e 100644 --- a/charts/vald/templates/gateway/filter/deployment.yaml +++ b/charts/vald/templates/gateway/filter/deployment.yaml @@ -123,7 +123,7 @@ spec: {{- end }} {{- if $gateway.podPriority }} {{- if $gateway.podPriority.enabled }} - priorityClassName: {{ $gateway.name }}-priority + priorityClassName: {{ .Release.Namespace }}-{{ $gateway.name }}-priority {{- end }} {{- end }} status: diff --git a/charts/vald/templates/gateway/lb/daemonset.yaml b/charts/vald/templates/gateway/lb/daemonset.yaml index c90b60c2144..b206d824c1f 100644 --- a/charts/vald/templates/gateway/lb/daemonset.yaml +++ b/charts/vald/templates/gateway/lb/daemonset.yaml @@ -118,7 +118,7 @@ spec: {{- end }} {{- if $gateway.podPriority }} {{- if $gateway.podPriority.enabled }} - priorityClassName: {{ $gateway.name }}-priority + priorityClassName: {{ .Release.Namespace }}-{{ $gateway.name }}-priority {{- end }} {{- end }} status: diff --git a/charts/vald/templates/gateway/lb/deployment.yaml b/charts/vald/templates/gateway/lb/deployment.yaml index 914f3d92f1f..cb7f6b2dd40 100644 --- a/charts/vald/templates/gateway/lb/deployment.yaml +++ b/charts/vald/templates/gateway/lb/deployment.yaml @@ -123,7 +123,7 @@ spec: {{- end }} {{- if $gateway.podPriority }} {{- if $gateway.podPriority.enabled }} - priorityClassName: {{ $gateway.name }}-priority + priorityClassName: {{ .Release.Namespace }}-{{ $gateway.name }}-priority {{- end }} {{- end }} status: diff --git a/charts/vald/templates/gateway/meta/daemonset.yaml b/charts/vald/templates/gateway/meta/daemonset.yaml index 6ac1877f94f..429099a193b 100644 --- a/charts/vald/templates/gateway/meta/daemonset.yaml +++ b/charts/vald/templates/gateway/meta/daemonset.yaml @@ -118,7 +118,7 @@ spec: {{- end }} {{- if $gateway.podPriority }} {{- if $gateway.podPriority.enabled }} - priorityClassName: {{ $gateway.name }}-priority + priorityClassName: {{ .Release.Namespace }}-{{ $gateway.name }}-priority {{- end }} {{- end }} status: diff --git a/charts/vald/templates/gateway/meta/deployment.yaml b/charts/vald/templates/gateway/meta/deployment.yaml index a9a761443c0..124d440f11f 100644 --- a/charts/vald/templates/gateway/meta/deployment.yaml +++ b/charts/vald/templates/gateway/meta/deployment.yaml @@ -123,7 +123,7 @@ spec: {{- end }} {{- if $gateway.podPriority }} {{- if $gateway.podPriority.enabled }} - priorityClassName: {{ $gateway.name }}-priority + priorityClassName: {{ .Release.Namespace }}-{{ $gateway.name }}-priority {{- end }} {{- end }} status: diff --git a/charts/vald/values.schema.json b/charts/vald/values.schema.json index 262fea130ff..7a139f38755 100644 --- a/charts/vald/values.schema.json +++ b/charts/vald/values.schema.json @@ -1 +1 @@ -{"$schema":"http://json-schema.org/draft-07/schema#","title":"Values","type":"object","properties":{"agent":{"type":"object","properties":{"affinity":{"type":"object","properties":{"nodeAffinity":{"type":"object","properties":{"preferredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}},"requiredDuringSchedulingIgnoredDuringExecution":{"type":"object","properties":{"nodeSelectorTerms":{"type":"array","items":{"type":"object"}}}}}},"podAffinity":{"type":"object","properties":{"preferredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}},"requiredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}}}},"podAntiAffinity":{"type":"object","properties":{"preferredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}},"requiredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}}}}}},"annotations":{"type":"object"},"enabled":{"type":"boolean"},"env":{"type":"array","items":{"type":"object"}},"externalTrafficPolicy":{"type":"string"},"hpa":{"type":"object","properties":{"enabled":{"type":"boolean"},"targetCPUUtilizationPercentage":{"type":"integer"}}},"image":{"type":"object","properties":{"pullPolicy":{"type":"string","enum":["Always","Never","IfNotPresent"]},"repository":{"type":"string"},"tag":{"type":"string"}}},"initContainers":{"type":"array","items":{"type":"object"}},"kind":{"type":"string","enum":["StatefulSet","Deployment","DaemonSet"]},"logging":{"type":"object","properties":{"format":{"type":"string","enum":["raw","json"]},"level":{"type":"string","enum":["debug","info","warn","error","fatal"]},"logger":{"type":"string","enum":["glg","zap"]}}},"maxReplicas":{"type":"integer","minimum":0},"maxUnavailable":{"type":"string"},"minReplicas":{"type":"integer","minimum":0},"name":{"type":"string"},"ngt":{"type":"object","properties":{"auto_create_index_pool_size":{"type":"integer"},"auto_index_check_duration":{"type":"string"},"auto_index_duration_limit":{"type":"string"},"auto_index_length":{"type":"integer"},"auto_save_index_duration":{"type":"string"},"bulk_insert_chunk_size":{"type":"integer"},"creation_edge_size":{"type":"integer"},"default_epsilon":{"type":"number"},"default_pool_size":{"type":"integer"},"default_radius":{"type":"number"},"dimension":{"type":"integer","minimum":1},"distance_type":{"type":"string","enum":["l1","l2","angle","hamming","cos","cosine","normalizedangle","normalizedcosine","jaccard"]},"enable_in_memory_mode":{"type":"boolean"},"enable_proactive_gc":{"type":"boolean"},"index_path":{"type":"string"},"initial_delay_max_duration":{"type":"string"},"load_index_timeout_factor":{"type":"string"},"max_load_index_timeout":{"type":"string"},"min_load_index_timeout":{"type":"string"},"object_type":{"type":"string","enum":["float","uint8"]},"search_edge_size":{"type":"integer"}}},"nodeName":{"type":"string"},"nodeSelector":{"type":"object"},"observability":{"type":"object","properties":{"collector":{"type":"object","properties":{"duration":{"type":"string"},"metrics":{"type":"object","properties":{"enable_cgo":{"type":"boolean"},"enable_goroutine":{"type":"boolean"},"enable_memory":{"type":"boolean"},"enable_version_info":{"type":"boolean"},"version_info_labels":{"type":"array","items":{"type":"string","enum":["vald_version","server_name","git_commit","build_time","go_version","go_os","go_arch","cgo_enabled","ngt_version","build_cpu_info_flags"]}}}}}},"enabled":{"type":"boolean"},"jaeger":{"type":"object","properties":{"agent_endpoint":{"type":"string"},"buffer_max_count":{"type":"integer"},"collector_endpoint":{"type":"string"},"enabled":{"type":"boolean"},"password":{"type":"string"},"service_name":{"type":"string"},"username":{"type":"string"}}},"prometheus":{"type":"object","properties":{"enabled":{"type":"boolean"},"endpoint":{"type":"string"},"namespace":{"type":"string"}}},"stackdriver":{"type":"object","properties":{"client":{"type":"object","properties":{"api_key":{"type":"string"},"audiences":{"type":"array","items":{"type":"string"}},"authentication_enabled":{"type":"boolean"},"credentials_file":{"type":"string"},"credentials_json":{"type":"string"},"endpoint":{"type":"string"},"quota_project":{"type":"string"},"request_reason":{"type":"string"},"scopes":{"type":"array","items":{"type":"string"}},"telemetry_enabled":{"type":"boolean"},"user_agent":{"type":"string"}}},"exporter":{"type":"object","properties":{"bundle_count_threshold":{"type":"integer"},"bundle_delay_threshold":{"type":"string"},"location":{"type":"string"},"metric_prefix":{"type":"string"},"monitoring_enabled":{"type":"boolean"},"number_of_workers":{"type":"integer"},"reporting_interval":{"type":"string"},"skip_cmd":{"type":"boolean"},"timeout":{"type":"string"},"trace_spans_buffer_max_bytes":{"type":"integer"},"tracing_enabled":{"type":"boolean"}}},"profiler":{"type":"object","properties":{"alloc_force_gc":{"type":"boolean"},"alloc_profiling":{"type":"boolean"},"api_addr":{"type":"string"},"cpu_profiling":{"type":"boolean"},"debug_logging":{"type":"boolean"},"enabled":{"type":"boolean"},"goroutine_profiling":{"type":"boolean"},"heap_profiling":{"type":"boolean"},"instance":{"type":"string"},"mutex_profiling":{"type":"boolean"},"service":{"type":"string"},"service_version":{"type":"string"},"zone":{"type":"string"}}},"project_id":{"type":"string"}}},"trace":{"type":"object","properties":{"enabled":{"type":"boolean"},"sampling_rate":{"type":"number"}}}}},"persistentVolume":{"type":"object","properties":{"accessMode":{"type":"string"},"enabled":{"type":"boolean"},"size":{"type":"string"},"storageClass":{"type":"string"}}},"podAnnotations":{"type":"object"},"podManagementPolicy":{"type":"string","enum":["OrderedReady","Parallel"]},"podPriority":{"type":"object","properties":{"enabled":{"type":"boolean"},"value":{"type":"integer"}}},"podSecurityContext":{"type":"object"},"progressDeadlineSeconds":{"type":"integer"},"resources":{"type":"object","properties":{"limits":{"type":"object"},"requests":{"type":"object"}}},"revisionHistoryLimit":{"type":"integer","minimum":0},"rollingUpdate":{"type":"object","properties":{"maxSurge":{"type":"string"},"maxUnavailable":{"type":"string"},"partition":{"type":"integer"}}},"securityContext":{"type":"object"},"server_config":{"type":"object","properties":{"full_shutdown_duration":{"type":"string"},"healths":{"type":"object","properties":{"liveness":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"livenessProbe":{"type":"object","properties":{"failureThreshold":{"type":"integer"},"httpGet":{"type":"object","properties":{"path":{"type":"string"},"port":{"type":"string"},"scheme":{"type":"string"}}},"initialDelaySeconds":{"type":"integer"},"periodSeconds":{"type":"integer"},"successThreshold":{"type":"integer"},"timetoutSeconds":{"type":"integer"}}},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}},"readiness":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"readinessProbe":{"type":"object","properties":{"failureThreshold":{"type":"integer"},"httpGet":{"type":"object","properties":{"path":{"type":"string"},"port":{"type":"string"},"scheme":{"type":"string"}}},"initialDelaySeconds":{"type":"integer"},"periodSeconds":{"type":"integer"},"successThreshold":{"type":"integer"},"timeoutSeconds":{"type":"integer"}}},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}}}},"metrics":{"type":"object","properties":{"pprof":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}},"prometheus":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}}}},"servers":{"type":"object","properties":{"grpc":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"grpc":{"type":"object","properties":{"bidirectional_stream_concurrency":{"type":"integer"},"connection_timeout":{"type":"string"},"header_table_size":{"type":"integer"},"initial_conn_window_size":{"type":"integer"},"initial_window_size":{"type":"integer"},"interceptors":{"type":"array","items":{"type":"string","enum":["RecoverInterceptor","AccessLogInterceptor","TracePayloadInterceptor"]}},"keepalive":{"type":"object","properties":{"max_conn_age":{"type":"string"},"max_conn_age_grace":{"type":"string"},"max_conn_idle":{"type":"string"},"time":{"type":"string"},"timeout":{"type":"string"}}},"max_header_list_size":{"type":"integer"},"max_receive_message_size":{"type":"integer"},"max_send_message_size":{"type":"integer"},"read_buffer_size":{"type":"integer"},"write_buffer_size":{"type":"integer"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"},"restart":{"type":"boolean"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}},"rest":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"handler_timeout":{"type":"string"},"http":{"type":"object"},"idle_timeout":{"type":"string"},"mode":{"type":"string"},"probe_wait_time":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"key":{"type":"string"}}}}},"service":{"type":"object","properties":{"annotations":{"type":"object"},"labels":{"type":"object"}}},"serviceType":{"type":"string","enum":["ClusterIP","LoadBalancer","NodePort"]},"sidecar":{"type":"object","properties":{"config":{"type":"object","properties":{"auto_backup_duration":{"type":"string"},"auto_backup_enabled":{"type":"boolean"},"blob_storage":{"type":"object","properties":{"bucket":{"type":"string"},"s3":{"type":"object","properties":{"access_key":{"type":"string"},"enable_100_continue":{"type":"boolean"},"enable_content_md5_validation":{"type":"boolean"},"enable_endpoint_discovery":{"type":"boolean"},"enable_endpoint_host_prefix":{"type":"boolean"},"enable_param_validation":{"type":"boolean"},"enable_ssl":{"type":"boolean"},"endpoint":{"type":"string"},"force_path_style":{"type":"boolean"},"max_chunk_size":{"type":"string","pattern":"^[0-9]+(kb|mb|gb)$"},"max_part_size":{"type":"string","pattern":"^[0-9]+(kb|mb|gb)$"},"max_retries":{"type":"integer"},"region":{"type":"string"},"secret_access_key":{"type":"string"},"token":{"type":"string"},"use_accelerate":{"type":"boolean"},"use_arn_region":{"type":"boolean"},"use_dual_stack":{"type":"boolean"}}},"storage_type":{"type":"string","enum":["s3"]}}},"client":{"type":"object","properties":{"tcp":{"type":"object","properties":{"dialer":{"type":"object","properties":{"dual_stack_enabled":{"type":"boolean"},"keep_alive":{"type":"string"},"timeout":{"type":"string"}}},"dns":{"type":"object","properties":{"cache_enabled":{"type":"boolean"},"cache_expiration":{"type":"string"},"refresh_duration":{"type":"string"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"key":{"type":"string"}}}}},"transport":{"type":"object","properties":{"backoff":{"type":"object","properties":{"backoff_factor":{"type":"number"},"backoff_time_limit":{"type":"string"},"enable_error_log":{"type":"boolean"},"initial_duration":{"type":"string"},"jitter_limit":{"type":"string"},"maximum_duration":{"type":"string"},"retry_count":{"type":"integer"}}},"round_tripper":{"type":"object","properties":{"expect_continue_timeout":{"type":"string"},"force_attempt_http_2":{"type":"boolean"},"idle_conn_timeout":{"type":"string"},"max_conns_per_host":{"type":"integer"},"max_idle_conns":{"type":"integer"},"max_idle_conns_per_host":{"type":"integer"},"max_response_header_size":{"type":"integer"},"read_buffer_size":{"type":"integer"},"response_header_timeout":{"type":"string"},"tls_handshake_timeout":{"type":"string"},"write_buffer_size":{"type":"integer"}}}}}}},"compress":{"type":"object","properties":{"compress_algorithm":{"type":"string","enum":["gob","gzip","lz4","zstd"]},"compression_level":{"type":"integer"}}},"filename":{"type":"string"},"filename_suffix":{"type":"string"},"post_stop_timeout":{"type":"string"},"restore_backoff":{"type":"object","properties":{"backoff_factor":{"type":"number"},"backoff_time_limit":{"type":"string"},"enable_error_log":{"type":"boolean"},"initial_duration":{"type":"string"},"jitter_limit":{"type":"string"},"maximum_duration":{"type":"string"},"retry_count":{"type":"integer"}}},"watch_enabled":{"type":"boolean"}}},"enabled":{"type":"boolean"},"env":{"type":"array","items":{"type":"object"}},"image":{"type":"object","properties":{"pullPolicy":{"type":"string","enum":["Always","Never","IfNotPresent"]},"repository":{"type":"string"},"tag":{"type":"string"}}},"initContainerEnabled":{"type":"boolean"},"logging":{"type":"object","properties":{"format":{"type":"string","enum":["raw","json"]},"level":{"type":"string","enum":["debug","info","warn","error","fatal"]},"logger":{"type":"string","enum":["glg","zap"]}}},"name":{"type":"string"},"observability":{"type":"object","properties":{"collector":{"type":"object","properties":{"duration":{"type":"string"},"metrics":{"type":"object","properties":{"enable_cgo":{"type":"boolean"},"enable_goroutine":{"type":"boolean"},"enable_memory":{"type":"boolean"},"enable_version_info":{"type":"boolean"},"version_info_labels":{"type":"array","items":{"type":"string","enum":["vald_version","server_name","git_commit","build_time","go_version","go_os","go_arch","cgo_enabled","ngt_version","build_cpu_info_flags"]}}}}}},"enabled":{"type":"boolean"},"jaeger":{"type":"object","properties":{"agent_endpoint":{"type":"string"},"buffer_max_count":{"type":"integer"},"collector_endpoint":{"type":"string"},"enabled":{"type":"boolean"},"password":{"type":"string"},"service_name":{"type":"string"},"username":{"type":"string"}}},"prometheus":{"type":"object","properties":{"enabled":{"type":"boolean"},"endpoint":{"type":"string"},"namespace":{"type":"string"}}},"stackdriver":{"type":"object","properties":{"client":{"type":"object","properties":{"api_key":{"type":"string"},"audiences":{"type":"array","items":{"type":"string"}},"authentication_enabled":{"type":"boolean"},"credentials_file":{"type":"string"},"credentials_json":{"type":"string"},"endpoint":{"type":"string"},"quota_project":{"type":"string"},"request_reason":{"type":"string"},"scopes":{"type":"array","items":{"type":"string"}},"telemetry_enabled":{"type":"boolean"},"user_agent":{"type":"string"}}},"exporter":{"type":"object","properties":{"bundle_count_threshold":{"type":"integer"},"bundle_delay_threshold":{"type":"string"},"location":{"type":"string"},"metric_prefix":{"type":"string"},"monitoring_enabled":{"type":"boolean"},"number_of_workers":{"type":"integer"},"reporting_interval":{"type":"string"},"skip_cmd":{"type":"boolean"},"timeout":{"type":"string"},"trace_spans_buffer_max_bytes":{"type":"integer"},"tracing_enabled":{"type":"boolean"}}},"profiler":{"type":"object","properties":{"alloc_force_gc":{"type":"boolean"},"alloc_profiling":{"type":"boolean"},"api_addr":{"type":"string"},"cpu_profiling":{"type":"boolean"},"debug_logging":{"type":"boolean"},"enabled":{"type":"boolean"},"goroutine_profiling":{"type":"boolean"},"heap_profiling":{"type":"boolean"},"instance":{"type":"string"},"mutex_profiling":{"type":"boolean"},"service":{"type":"string"},"service_version":{"type":"string"},"zone":{"type":"string"}}},"project_id":{"type":"string"}}},"trace":{"type":"object","properties":{"enabled":{"type":"boolean"},"sampling_rate":{"type":"number"}}}}},"resources":{"type":"object","properties":{"limits":{"type":"object"},"requests":{"type":"object"}}},"server_config":{"type":"object","properties":{"full_shutdown_duration":{"type":"string"},"healths":{"type":"object","properties":{"liveness":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"livenessProbe":{"type":"object","properties":{"failureThreshold":{"type":"integer"},"httpGet":{"type":"object","properties":{"path":{"type":"string"},"port":{"type":"string"},"scheme":{"type":"string"}}},"initialDelaySeconds":{"type":"integer"},"periodSeconds":{"type":"integer"},"successThreshold":{"type":"integer"},"timetoutSeconds":{"type":"integer"}}},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}},"readiness":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"readinessProbe":{"type":"object","properties":{"failureThreshold":{"type":"integer"},"httpGet":{"type":"object","properties":{"path":{"type":"string"},"port":{"type":"string"},"scheme":{"type":"string"}}},"initialDelaySeconds":{"type":"integer"},"periodSeconds":{"type":"integer"},"successThreshold":{"type":"integer"},"timeoutSeconds":{"type":"integer"}}},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}}}},"metrics":{"type":"object","properties":{"pprof":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}},"prometheus":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}}}},"servers":{"type":"object","properties":{"grpc":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"grpc":{"type":"object","properties":{"bidirectional_stream_concurrency":{"type":"integer"},"connection_timeout":{"type":"string"},"header_table_size":{"type":"integer"},"initial_conn_window_size":{"type":"integer"},"initial_window_size":{"type":"integer"},"interceptors":{"type":"array","items":{"type":"string","enum":["RecoverInterceptor","AccessLogInterceptor","TracePayloadInterceptor"]}},"keepalive":{"type":"object","properties":{"max_conn_age":{"type":"string"},"max_conn_age_grace":{"type":"string"},"max_conn_idle":{"type":"string"},"time":{"type":"string"},"timeout":{"type":"string"}}},"max_header_list_size":{"type":"integer"},"max_receive_message_size":{"type":"integer"},"max_send_message_size":{"type":"integer"},"read_buffer_size":{"type":"integer"},"write_buffer_size":{"type":"integer"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"},"restart":{"type":"boolean"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}},"rest":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"handler_timeout":{"type":"string"},"http":{"type":"object"},"idle_timeout":{"type":"string"},"mode":{"type":"string"},"probe_wait_time":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"key":{"type":"string"}}}}},"service":{"type":"object","properties":{"annotations":{"type":"object"},"enabled":{"type":"boolean"},"externalTrafficPolicy":{"type":"string"},"labels":{"type":"object"},"type":{"type":"string","enum":["ClusterIP","LoadBalancer","NodePort"]}}},"time_zone":{"type":"string"},"version":{"type":"string","pattern":"^v[0-9]+\\.[0-9]+\\.[0-9]$"}}},"terminationGracePeriodSeconds":{"type":"integer","minimum":0},"time_zone":{"type":"string"},"tolerations":{"type":"array","items":{"type":"object"}},"topologySpreadConstraints":{"type":"array","items":{"type":"object"}},"version":{"type":"string","pattern":"^v[0-9]+\\.[0-9]+\\.[0-9]$"},"volumeMounts":{"type":"array","items":{"type":"object"}},"volumes":{"type":"array","items":{"type":"object"}}}},"defaults":{"type":"object","properties":{"grpc":{"type":"object","properties":{"client":{"type":"object","properties":{"addrs":{"type":"array","items":{"type":"string"}},"backoff":{"type":"object","properties":{"backoff_factor":{"type":"number"},"backoff_time_limit":{"type":"string"},"enable_error_log":{"type":"boolean"},"initial_duration":{"type":"string"},"jitter_limit":{"type":"string"},"maximum_duration":{"type":"string"},"retry_count":{"type":"integer"}}},"call_option":{"type":"object"},"connection_pool":{"type":"object","properties":{"enable_dns_resolver":{"type":"boolean"},"enable_rebalance":{"type":"boolean"},"old_conn_close_duration":{"type":"string"},"rebalance_duration":{"type":"string"},"size":{"type":"integer"}}},"dial_option":{"type":"object","properties":{"backoff_base_delay":{"type":"string"},"backoff_jitter":{"type":"number"},"backoff_max_delay":{"type":"string"},"backoff_multiplier":{"type":"number"},"enable_backoff":{"type":"boolean"},"initial_connection_window_size":{"type":"integer"},"initial_window_size":{"type":"integer"},"insecure":{"type":"boolean"},"keep_alive":{"type":"object","properties":{"permit_without_stream":{"type":"boolean"},"time":{"type":"string"},"timeout":{"type":"string"}}},"max_msg_size":{"type":"integer"},"min_connection_timeout":{"type":"string"},"read_buffer_size":{"type":"integer"},"tcp":{"type":"object","properties":{"dialer":{"type":"object","properties":{"dual_stack_enabled":{"type":"boolean"},"keep_alive":{"type":"string"},"timeout":{"type":"string"}}},"dns":{"type":"object","properties":{"cache_enabled":{"type":"boolean"},"cache_expiration":{"type":"string"},"refresh_duration":{"type":"string"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"key":{"type":"string"}}}}},"timeout":{"type":"string"},"write_buffer_size":{"type":"integer"}}},"health_check_duration":{"type":"string"},"max_recv_msg_size":{"type":"integer"},"max_retry_rpc_buffer_size":{"type":"integer"},"max_send_msg_size":{"type":"integer"},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"key":{"type":"string"}}},"wait_for_ready":{"type":"boolean"}}}}},"image":{"type":"object","properties":{"tag":{"type":"string"}}},"ingress":{"type":"object","properties":{"usev1beta1":{"type":"boolean"}}},"logging":{"type":"object","properties":{"format":{"type":"string","enum":["raw","json"]},"level":{"type":"string","enum":["debug","info","warn","error","fatal"]},"logger":{"type":"string","enum":["glg","zap"]}}},"observability":{"type":"object","properties":{"collector":{"type":"object","properties":{"duration":{"type":"string"},"metrics":{"type":"object","properties":{"enable_cgo":{"type":"boolean"},"enable_goroutine":{"type":"boolean"},"enable_memory":{"type":"boolean"},"enable_version_info":{"type":"boolean"},"version_info_labels":{"type":"array","items":{"type":"string","enum":["vald_version","server_name","git_commit","build_time","go_version","go_os","go_arch","cgo_enabled","ngt_version","build_cpu_info_flags"]}}}}}},"enabled":{"type":"boolean"},"jaeger":{"type":"object","properties":{"agent_endpoint":{"type":"string"},"buffer_max_count":{"type":"integer"},"collector_endpoint":{"type":"string"},"enabled":{"type":"boolean"},"password":{"type":"string"},"service_name":{"type":"string"},"username":{"type":"string"}}},"prometheus":{"type":"object","properties":{"enabled":{"type":"boolean"},"endpoint":{"type":"string"},"namespace":{"type":"string"}}},"stackdriver":{"type":"object","properties":{"client":{"type":"object","properties":{"api_key":{"type":"string"},"audiences":{"type":"array","items":{"type":"string"}},"authentication_enabled":{"type":"boolean"},"credentials_file":{"type":"string"},"credentials_json":{"type":"string"},"endpoint":{"type":"string"},"quota_project":{"type":"string"},"request_reason":{"type":"string"},"scopes":{"type":"array","items":{"type":"string"}},"telemetry_enabled":{"type":"boolean"},"user_agent":{"type":"string"}}},"exporter":{"type":"object","properties":{"bundle_count_threshold":{"type":"integer"},"bundle_delay_threshold":{"type":"string"},"location":{"type":"string"},"metric_prefix":{"type":"string"},"monitoring_enabled":{"type":"boolean"},"number_of_workers":{"type":"integer"},"reporting_interval":{"type":"string"},"skip_cmd":{"type":"boolean"},"timeout":{"type":"string"},"trace_spans_buffer_max_bytes":{"type":"integer"},"tracing_enabled":{"type":"boolean"}}},"profiler":{"type":"object","properties":{"alloc_force_gc":{"type":"boolean"},"alloc_profiling":{"type":"boolean"},"api_addr":{"type":"string"},"cpu_profiling":{"type":"boolean"},"debug_logging":{"type":"boolean"},"enabled":{"type":"boolean"},"goroutine_profiling":{"type":"boolean"},"heap_profiling":{"type":"boolean"},"instance":{"type":"string"},"mutex_profiling":{"type":"boolean"},"service":{"type":"string"},"service_version":{"type":"string"},"zone":{"type":"string"}}},"project_id":{"type":"string"}}},"trace":{"type":"object","properties":{"enabled":{"type":"boolean"},"sampling_rate":{"type":"number"}}}}},"server_config":{"type":"object","properties":{"full_shutdown_duration":{"type":"string"},"healths":{"type":"object","properties":{"liveness":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"livenessProbe":{"type":"object","properties":{"failureThreshold":{"type":"integer"},"httpGet":{"type":"object","properties":{"path":{"type":"string"},"port":{"type":"string"},"scheme":{"type":"string"}}},"initialDelaySeconds":{"type":"integer"},"periodSeconds":{"type":"integer"},"successThreshold":{"type":"integer"},"timetoutSeconds":{"type":"integer"}}},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}},"readiness":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"readinessProbe":{"type":"object","properties":{"failureThreshold":{"type":"integer"},"httpGet":{"type":"object","properties":{"path":{"type":"string"},"port":{"type":"string"},"scheme":{"type":"string"}}},"initialDelaySeconds":{"type":"integer"},"periodSeconds":{"type":"integer"},"successThreshold":{"type":"integer"},"timeoutSeconds":{"type":"integer"}}},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}}}},"metrics":{"type":"object","properties":{"pprof":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}},"prometheus":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}}}},"servers":{"type":"object","properties":{"grpc":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"grpc":{"type":"object","properties":{"bidirectional_stream_concurrency":{"type":"integer"},"connection_timeout":{"type":"string"},"header_table_size":{"type":"integer"},"initial_conn_window_size":{"type":"integer"},"initial_window_size":{"type":"integer"},"interceptors":{"type":"array","items":{"type":"string","enum":["RecoverInterceptor","AccessLogInterceptor","TracePayloadInterceptor"]}},"keepalive":{"type":"object","properties":{"max_conn_age":{"type":"string"},"max_conn_age_grace":{"type":"string"},"max_conn_idle":{"type":"string"},"time":{"type":"string"},"timeout":{"type":"string"}}},"max_header_list_size":{"type":"integer"},"max_receive_message_size":{"type":"integer"},"max_send_message_size":{"type":"integer"},"read_buffer_size":{"type":"integer"},"write_buffer_size":{"type":"integer"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"},"restart":{"type":"boolean"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}},"rest":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"handler_timeout":{"type":"string"},"http":{"type":"object"},"idle_timeout":{"type":"string"},"mode":{"type":"string"},"probe_wait_time":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"key":{"type":"string"}}}}},"time_zone":{"type":"string"}}},"discoverer":{"type":"object","properties":{"affinity":{"type":"object","properties":{"nodeAffinity":{"type":"object","properties":{"preferredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}},"requiredDuringSchedulingIgnoredDuringExecution":{"type":"object","properties":{"nodeSelectorTerms":{"type":"array","items":{"type":"object"}}}}}},"podAffinity":{"type":"object","properties":{"preferredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}},"requiredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}}}},"podAntiAffinity":{"type":"object","properties":{"preferredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}},"requiredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}}}}}},"annotations":{"type":"object"},"clusterRole":{"type":"object","properties":{"enabled":{"type":"boolean"},"name":{"type":"string"}}},"clusterRoleBinding":{"type":"object","properties":{"enabled":{"type":"boolean"},"name":{"type":"string"}}},"discoverer":{"type":"object","properties":{"discovery_duration":{"type":"string"},"name":{"type":"string"},"namespace":{"type":"string"}}},"enabled":{"type":"boolean"},"env":{"type":"array","items":{"type":"object"}},"externalTrafficPolicy":{"type":"string"},"hpa":{"type":"object","properties":{"enabled":{"type":"boolean"},"targetCPUUtilizationPercentage":{"type":"integer"}}},"image":{"type":"object","properties":{"pullPolicy":{"type":"string","enum":["Always","Never","IfNotPresent"]},"repository":{"type":"string"},"tag":{"type":"string"}}},"initContainers":{"type":"array","items":{"type":"object"}},"kind":{"type":"string","enum":["Deployment","DaemonSet"]},"logging":{"type":"object","properties":{"format":{"type":"string","enum":["raw","json"]},"level":{"type":"string","enum":["debug","info","warn","error","fatal"]},"logger":{"type":"string","enum":["glg","zap"]}}},"maxReplicas":{"type":"integer","minimum":0},"maxUnavailable":{"type":"string"},"minReplicas":{"type":"integer","minimum":0},"name":{"type":"string"},"nodeName":{"type":"string"},"nodeSelector":{"type":"object"},"observability":{"type":"object","properties":{"collector":{"type":"object","properties":{"duration":{"type":"string"},"metrics":{"type":"object","properties":{"enable_cgo":{"type":"boolean"},"enable_goroutine":{"type":"boolean"},"enable_memory":{"type":"boolean"},"enable_version_info":{"type":"boolean"},"version_info_labels":{"type":"array","items":{"type":"string","enum":["vald_version","server_name","git_commit","build_time","go_version","go_os","go_arch","cgo_enabled","ngt_version","build_cpu_info_flags"]}}}}}},"enabled":{"type":"boolean"},"jaeger":{"type":"object","properties":{"agent_endpoint":{"type":"string"},"buffer_max_count":{"type":"integer"},"collector_endpoint":{"type":"string"},"enabled":{"type":"boolean"},"password":{"type":"string"},"service_name":{"type":"string"},"username":{"type":"string"}}},"prometheus":{"type":"object","properties":{"enabled":{"type":"boolean"},"endpoint":{"type":"string"},"namespace":{"type":"string"}}},"stackdriver":{"type":"object","properties":{"client":{"type":"object","properties":{"api_key":{"type":"string"},"audiences":{"type":"array","items":{"type":"string"}},"authentication_enabled":{"type":"boolean"},"credentials_file":{"type":"string"},"credentials_json":{"type":"string"},"endpoint":{"type":"string"},"quota_project":{"type":"string"},"request_reason":{"type":"string"},"scopes":{"type":"array","items":{"type":"string"}},"telemetry_enabled":{"type":"boolean"},"user_agent":{"type":"string"}}},"exporter":{"type":"object","properties":{"bundle_count_threshold":{"type":"integer"},"bundle_delay_threshold":{"type":"string"},"location":{"type":"string"},"metric_prefix":{"type":"string"},"monitoring_enabled":{"type":"boolean"},"number_of_workers":{"type":"integer"},"reporting_interval":{"type":"string"},"skip_cmd":{"type":"boolean"},"timeout":{"type":"string"},"trace_spans_buffer_max_bytes":{"type":"integer"},"tracing_enabled":{"type":"boolean"}}},"profiler":{"type":"object","properties":{"alloc_force_gc":{"type":"boolean"},"alloc_profiling":{"type":"boolean"},"api_addr":{"type":"string"},"cpu_profiling":{"type":"boolean"},"debug_logging":{"type":"boolean"},"enabled":{"type":"boolean"},"goroutine_profiling":{"type":"boolean"},"heap_profiling":{"type":"boolean"},"instance":{"type":"string"},"mutex_profiling":{"type":"boolean"},"service":{"type":"string"},"service_version":{"type":"string"},"zone":{"type":"string"}}},"project_id":{"type":"string"}}},"trace":{"type":"object","properties":{"enabled":{"type":"boolean"},"sampling_rate":{"type":"number"}}}}},"podAnnotations":{"type":"object"},"podPriority":{"type":"object","properties":{"enabled":{"type":"boolean"},"value":{"type":"integer"}}},"podSecurityContext":{"type":"object"},"progressDeadlineSeconds":{"type":"integer"},"resources":{"type":"object","properties":{"limits":{"type":"object"},"requests":{"type":"object"}}},"revisionHistoryLimit":{"type":"integer","minimum":0},"rollingUpdate":{"type":"object","properties":{"maxSurge":{"type":"string"},"maxUnavailable":{"type":"string"}}},"securityContext":{"type":"object"},"server_config":{"type":"object","properties":{"full_shutdown_duration":{"type":"string"},"healths":{"type":"object","properties":{"liveness":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"livenessProbe":{"type":"object","properties":{"failureThreshold":{"type":"integer"},"httpGet":{"type":"object","properties":{"path":{"type":"string"},"port":{"type":"string"},"scheme":{"type":"string"}}},"initialDelaySeconds":{"type":"integer"},"periodSeconds":{"type":"integer"},"successThreshold":{"type":"integer"},"timetoutSeconds":{"type":"integer"}}},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}},"readiness":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"readinessProbe":{"type":"object","properties":{"failureThreshold":{"type":"integer"},"httpGet":{"type":"object","properties":{"path":{"type":"string"},"port":{"type":"string"},"scheme":{"type":"string"}}},"initialDelaySeconds":{"type":"integer"},"periodSeconds":{"type":"integer"},"successThreshold":{"type":"integer"},"timeoutSeconds":{"type":"integer"}}},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}}}},"metrics":{"type":"object","properties":{"pprof":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}},"prometheus":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}}}},"servers":{"type":"object","properties":{"grpc":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"grpc":{"type":"object","properties":{"bidirectional_stream_concurrency":{"type":"integer"},"connection_timeout":{"type":"string"},"header_table_size":{"type":"integer"},"initial_conn_window_size":{"type":"integer"},"initial_window_size":{"type":"integer"},"interceptors":{"type":"array","items":{"type":"string","enum":["RecoverInterceptor","AccessLogInterceptor","TracePayloadInterceptor"]}},"keepalive":{"type":"object","properties":{"max_conn_age":{"type":"string"},"max_conn_age_grace":{"type":"string"},"max_conn_idle":{"type":"string"},"time":{"type":"string"},"timeout":{"type":"string"}}},"max_header_list_size":{"type":"integer"},"max_receive_message_size":{"type":"integer"},"max_send_message_size":{"type":"integer"},"read_buffer_size":{"type":"integer"},"write_buffer_size":{"type":"integer"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"},"restart":{"type":"boolean"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}},"rest":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"handler_timeout":{"type":"string"},"http":{"type":"object"},"idle_timeout":{"type":"string"},"mode":{"type":"string"},"probe_wait_time":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"key":{"type":"string"}}}}},"service":{"type":"object","properties":{"annotations":{"type":"object"},"labels":{"type":"object"}}},"serviceAccount":{"type":"object","properties":{"enabled":{"type":"boolean"},"name":{"type":"string"}}},"serviceType":{"type":"string","enum":["ClusterIP","LoadBalancer","NodePort"]},"terminationGracePeriodSeconds":{"type":"integer","minimum":0},"time_zone":{"type":"string"},"tolerations":{"type":"array","items":{"type":"object"}},"topologySpreadConstraints":{"type":"array","items":{"type":"object"}},"version":{"type":"string","pattern":"^v[0-9]+\\.[0-9]+\\.[0-9]$"},"volumeMounts":{"type":"array","items":{"type":"object"}},"volumes":{"type":"array","items":{"type":"object"}}}},"gateway":{"type":"object","properties":{"backup":{"type":"object","properties":{"affinity":{"type":"object","properties":{"nodeAffinity":{"type":"object","properties":{"preferredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}},"requiredDuringSchedulingIgnoredDuringExecution":{"type":"object","properties":{"nodeSelectorTerms":{"type":"array","items":{"type":"object"}}}}}},"podAffinity":{"type":"object","properties":{"preferredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}},"requiredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}}}},"podAntiAffinity":{"type":"object","properties":{"preferredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}},"requiredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}}}}}},"annotations":{"type":"object"},"enabled":{"type":"boolean"},"env":{"type":"array","items":{"type":"object"}},"externalTrafficPolicy":{"type":"string"},"gateway_config":{"type":"object","properties":{"backup_client":{"type":"object","properties":{"addrs":{"type":"array","items":{"type":"string"}},"backoff":{"type":"object","properties":{"backoff_factor":{"type":"number"},"backoff_time_limit":{"type":"string"},"enable_error_log":{"type":"boolean"},"initial_duration":{"type":"string"},"jitter_limit":{"type":"string"},"maximum_duration":{"type":"string"},"retry_count":{"type":"integer"}}},"call_option":{"type":"object"},"connection_pool":{"type":"object","properties":{"enable_dns_resolver":{"type":"boolean"},"enable_rebalance":{"type":"boolean"},"old_conn_close_duration":{"type":"string"},"rebalance_duration":{"type":"string"},"size":{"type":"integer"}}},"dial_option":{"type":"object","properties":{"backoff_base_delay":{"type":"string"},"backoff_jitter":{"type":"number"},"backoff_max_delay":{"type":"string"},"backoff_multiplier":{"type":"number"},"enable_backoff":{"type":"boolean"},"initial_connection_window_size":{"type":"integer"},"initial_window_size":{"type":"integer"},"insecure":{"type":"boolean"},"keep_alive":{"type":"object","properties":{"permit_without_stream":{"type":"boolean"},"time":{"type":"string"},"timeout":{"type":"string"}}},"max_msg_size":{"type":"integer"},"min_connection_timeout":{"type":"string"},"read_buffer_size":{"type":"integer"},"tcp":{"type":"object","properties":{"dialer":{"type":"object","properties":{"dual_stack_enabled":{"type":"boolean"},"keep_alive":{"type":"string"},"timeout":{"type":"string"}}},"dns":{"type":"object","properties":{"cache_enabled":{"type":"boolean"},"cache_expiration":{"type":"string"},"refresh_duration":{"type":"string"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"key":{"type":"string"}}}}},"timeout":{"type":"string"},"write_buffer_size":{"type":"integer"}}},"health_check_duration":{"type":"string"},"max_recv_msg_size":{"type":"integer"},"max_retry_rpc_buffer_size":{"type":"integer"},"max_send_msg_size":{"type":"integer"},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"key":{"type":"string"}}},"wait_for_ready":{"type":"boolean"}}},"gateway_client":{"type":"object","properties":{"addrs":{"type":"array","items":{"type":"string"}},"backoff":{"type":"object","properties":{"backoff_factor":{"type":"number"},"backoff_time_limit":{"type":"string"},"enable_error_log":{"type":"boolean"},"initial_duration":{"type":"string"},"jitter_limit":{"type":"string"},"maximum_duration":{"type":"string"},"retry_count":{"type":"integer"}}},"call_option":{"type":"object"},"connection_pool":{"type":"object","properties":{"enable_dns_resolver":{"type":"boolean"},"enable_rebalance":{"type":"boolean"},"old_conn_close_duration":{"type":"string"},"rebalance_duration":{"type":"string"},"size":{"type":"integer"}}},"dial_option":{"type":"object","properties":{"backoff_base_delay":{"type":"string"},"backoff_jitter":{"type":"number"},"backoff_max_delay":{"type":"string"},"backoff_multiplier":{"type":"number"},"enable_backoff":{"type":"boolean"},"initial_connection_window_size":{"type":"integer"},"initial_window_size":{"type":"integer"},"insecure":{"type":"boolean"},"keep_alive":{"type":"object","properties":{"permit_without_stream":{"type":"boolean"},"time":{"type":"string"},"timeout":{"type":"string"}}},"max_msg_size":{"type":"integer"},"min_connection_timeout":{"type":"string"},"read_buffer_size":{"type":"integer"},"tcp":{"type":"object","properties":{"dialer":{"type":"object","properties":{"dual_stack_enabled":{"type":"boolean"},"keep_alive":{"type":"string"},"timeout":{"type":"string"}}},"dns":{"type":"object","properties":{"cache_enabled":{"type":"boolean"},"cache_expiration":{"type":"string"},"refresh_duration":{"type":"string"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"key":{"type":"string"}}}}},"timeout":{"type":"string"},"write_buffer_size":{"type":"integer"}}},"health_check_duration":{"type":"string"},"max_recv_msg_size":{"type":"integer"},"max_retry_rpc_buffer_size":{"type":"integer"},"max_send_msg_size":{"type":"integer"},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"key":{"type":"string"}}},"wait_for_ready":{"type":"boolean"}}}}},"hpa":{"type":"object","properties":{"enabled":{"type":"boolean"},"targetCPUUtilizationPercentage":{"type":"integer"}}},"image":{"type":"object","properties":{"pullPolicy":{"type":"string","enum":["Always","Never","IfNotPresent"]},"repository":{"type":"string"},"tag":{"type":"string"}}},"ingress":{"type":"object","properties":{"annotations":{"type":"object"},"enabled":{"type":"boolean"},"host":{"type":"string"},"pathType":{"type":"string"},"servicePort":{"type":"string"}}},"initContainers":{"type":"array","items":{"type":"object"}},"kind":{"type":"string","enum":["Deployment","DaemonSet"]},"logging":{"type":"object","properties":{"format":{"type":"string","enum":["raw","json"]},"level":{"type":"string","enum":["debug","info","warn","error","fatal"]},"logger":{"type":"string","enum":["glg","zap"]}}},"maxReplicas":{"type":"integer","minimum":0},"maxUnavailable":{"type":"string"},"minReplicas":{"type":"integer","minimum":0},"name":{"type":"string"},"nodeName":{"type":"string"},"nodeSelector":{"type":"object"},"observability":{"type":"object","properties":{"collector":{"type":"object","properties":{"duration":{"type":"string"},"metrics":{"type":"object","properties":{"enable_cgo":{"type":"boolean"},"enable_goroutine":{"type":"boolean"},"enable_memory":{"type":"boolean"},"enable_version_info":{"type":"boolean"},"version_info_labels":{"type":"array","items":{"type":"string","enum":["vald_version","server_name","git_commit","build_time","go_version","go_os","go_arch","cgo_enabled","ngt_version","build_cpu_info_flags"]}}}}}},"enabled":{"type":"boolean"},"jaeger":{"type":"object","properties":{"agent_endpoint":{"type":"string"},"buffer_max_count":{"type":"integer"},"collector_endpoint":{"type":"string"},"enabled":{"type":"boolean"},"password":{"type":"string"},"service_name":{"type":"string"},"username":{"type":"string"}}},"prometheus":{"type":"object","properties":{"enabled":{"type":"boolean"},"endpoint":{"type":"string"},"namespace":{"type":"string"}}},"stackdriver":{"type":"object","properties":{"client":{"type":"object","properties":{"api_key":{"type":"string"},"audiences":{"type":"array","items":{"type":"string"}},"authentication_enabled":{"type":"boolean"},"credentials_file":{"type":"string"},"credentials_json":{"type":"string"},"endpoint":{"type":"string"},"quota_project":{"type":"string"},"request_reason":{"type":"string"},"scopes":{"type":"array","items":{"type":"string"}},"telemetry_enabled":{"type":"boolean"},"user_agent":{"type":"string"}}},"exporter":{"type":"object","properties":{"bundle_count_threshold":{"type":"integer"},"bundle_delay_threshold":{"type":"string"},"location":{"type":"string"},"metric_prefix":{"type":"string"},"monitoring_enabled":{"type":"boolean"},"number_of_workers":{"type":"integer"},"reporting_interval":{"type":"string"},"skip_cmd":{"type":"boolean"},"timeout":{"type":"string"},"trace_spans_buffer_max_bytes":{"type":"integer"},"tracing_enabled":{"type":"boolean"}}},"profiler":{"type":"object","properties":{"alloc_force_gc":{"type":"boolean"},"alloc_profiling":{"type":"boolean"},"api_addr":{"type":"string"},"cpu_profiling":{"type":"boolean"},"debug_logging":{"type":"boolean"},"enabled":{"type":"boolean"},"goroutine_profiling":{"type":"boolean"},"heap_profiling":{"type":"boolean"},"instance":{"type":"string"},"mutex_profiling":{"type":"boolean"},"service":{"type":"string"},"service_version":{"type":"string"},"zone":{"type":"string"}}},"project_id":{"type":"string"}}},"trace":{"type":"object","properties":{"enabled":{"type":"boolean"},"sampling_rate":{"type":"number"}}}}},"podAnnotations":{"type":"object"},"podPriority":{"type":"object","properties":{"enabled":{"type":"boolean"},"value":{"type":"integer"}}},"podSecurityContext":{"type":"object"},"progressDeadlineSeconds":{"type":"integer"},"resources":{"type":"object","properties":{"limits":{"type":"object"},"requests":{"type":"object"}}},"revisionHistoryLimit":{"type":"integer","minimum":0},"rollingUpdate":{"type":"object","properties":{"maxSurge":{"type":"string"},"maxUnavailable":{"type":"string"}}},"securityContext":{"type":"object"},"server_config":{"type":"object","properties":{"full_shutdown_duration":{"type":"string"},"healths":{"type":"object","properties":{"liveness":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"livenessProbe":{"type":"object","properties":{"failureThreshold":{"type":"integer"},"httpGet":{"type":"object","properties":{"path":{"type":"string"},"port":{"type":"string"},"scheme":{"type":"string"}}},"initialDelaySeconds":{"type":"integer"},"periodSeconds":{"type":"integer"},"successThreshold":{"type":"integer"},"timetoutSeconds":{"type":"integer"}}},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}},"readiness":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"readinessProbe":{"type":"object","properties":{"failureThreshold":{"type":"integer"},"httpGet":{"type":"object","properties":{"path":{"type":"string"},"port":{"type":"string"},"scheme":{"type":"string"}}},"initialDelaySeconds":{"type":"integer"},"periodSeconds":{"type":"integer"},"successThreshold":{"type":"integer"},"timeoutSeconds":{"type":"integer"}}},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}}}},"metrics":{"type":"object","properties":{"pprof":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}},"prometheus":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}}}},"servers":{"type":"object","properties":{"grpc":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"grpc":{"type":"object","properties":{"bidirectional_stream_concurrency":{"type":"integer"},"connection_timeout":{"type":"string"},"header_table_size":{"type":"integer"},"initial_conn_window_size":{"type":"integer"},"initial_window_size":{"type":"integer"},"interceptors":{"type":"array","items":{"type":"string","enum":["RecoverInterceptor","AccessLogInterceptor","TracePayloadInterceptor"]}},"keepalive":{"type":"object","properties":{"max_conn_age":{"type":"string"},"max_conn_age_grace":{"type":"string"},"max_conn_idle":{"type":"string"},"time":{"type":"string"},"timeout":{"type":"string"}}},"max_header_list_size":{"type":"integer"},"max_receive_message_size":{"type":"integer"},"max_send_message_size":{"type":"integer"},"read_buffer_size":{"type":"integer"},"write_buffer_size":{"type":"integer"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"},"restart":{"type":"boolean"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}},"rest":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"handler_timeout":{"type":"string"},"http":{"type":"object"},"idle_timeout":{"type":"string"},"mode":{"type":"string"},"probe_wait_time":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"key":{"type":"string"}}}}},"service":{"type":"object","properties":{"annotations":{"type":"object"},"labels":{"type":"object"}}},"serviceType":{"type":"string","enum":["ClusterIP","LoadBalancer","NodePort"]},"terminationGracePeriodSeconds":{"type":"integer","minimum":0},"time_zone":{"type":"string"},"tolerations":{"type":"array","items":{"type":"object"}},"topologySpreadConstraints":{"type":"array","items":{"type":"object"}},"version":{"type":"string","pattern":"^v[0-9]+\\.[0-9]+\\.[0-9]$"},"volumeMounts":{"type":"array","items":{"type":"object"}},"volumes":{"type":"array","items":{"type":"object"}}}},"filter":{"type":"object","properties":{"affinity":{"type":"object","properties":{"nodeAffinity":{"type":"object","properties":{"preferredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}},"requiredDuringSchedulingIgnoredDuringExecution":{"type":"object","properties":{"nodeSelectorTerms":{"type":"array","items":{"type":"object"}}}}}},"podAffinity":{"type":"object","properties":{"preferredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}},"requiredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}}}},"podAntiAffinity":{"type":"object","properties":{"preferredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}},"requiredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}}}}}},"annotations":{"type":"object"},"enabled":{"type":"boolean"},"env":{"type":"array","items":{"type":"object"}},"externalTrafficPolicy":{"type":"string"},"gateway_config":{"type":"object","properties":{"egress_filter":{"type":"object","properties":{"client":{"type":"object","properties":{"addrs":{"type":"array","items":{"type":"string"}},"backoff":{"type":"object","properties":{"backoff_factor":{"type":"number"},"backoff_time_limit":{"type":"string"},"enable_error_log":{"type":"boolean"},"initial_duration":{"type":"string"},"jitter_limit":{"type":"string"},"maximum_duration":{"type":"string"},"retry_count":{"type":"integer"}}},"call_option":{"type":"object"},"connection_pool":{"type":"object","properties":{"enable_dns_resolver":{"type":"boolean"},"enable_rebalance":{"type":"boolean"},"old_conn_close_duration":{"type":"string"},"rebalance_duration":{"type":"string"},"size":{"type":"integer"}}},"dial_option":{"type":"object","properties":{"backoff_base_delay":{"type":"string"},"backoff_jitter":{"type":"number"},"backoff_max_delay":{"type":"string"},"backoff_multiplier":{"type":"number"},"enable_backoff":{"type":"boolean"},"initial_connection_window_size":{"type":"integer"},"initial_window_size":{"type":"integer"},"insecure":{"type":"boolean"},"keep_alive":{"type":"object","properties":{"permit_without_stream":{"type":"boolean"},"time":{"type":"string"},"timeout":{"type":"string"}}},"max_msg_size":{"type":"integer"},"min_connection_timeout":{"type":"string"},"read_buffer_size":{"type":"integer"},"tcp":{"type":"object","properties":{"dialer":{"type":"object","properties":{"dual_stack_enabled":{"type":"boolean"},"keep_alive":{"type":"string"},"timeout":{"type":"string"}}},"dns":{"type":"object","properties":{"cache_enabled":{"type":"boolean"},"cache_expiration":{"type":"string"},"refresh_duration":{"type":"string"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"key":{"type":"string"}}}}},"timeout":{"type":"string"},"write_buffer_size":{"type":"integer"}}},"health_check_duration":{"type":"string"},"max_recv_msg_size":{"type":"integer"},"max_retry_rpc_buffer_size":{"type":"integer"},"max_send_msg_size":{"type":"integer"},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"key":{"type":"string"}}},"wait_for_ready":{"type":"boolean"}}},"distance_filters":{"type":"array","items":{"type":"string"}},"object_filters":{"type":"array","items":{"type":"string"}}}},"gateway_client":{"type":"object","properties":{"addrs":{"type":"array","items":{"type":"string"}},"backoff":{"type":"object","properties":{"backoff_factor":{"type":"number"},"backoff_time_limit":{"type":"string"},"enable_error_log":{"type":"boolean"},"initial_duration":{"type":"string"},"jitter_limit":{"type":"string"},"maximum_duration":{"type":"string"},"retry_count":{"type":"integer"}}},"call_option":{"type":"object"},"connection_pool":{"type":"object","properties":{"enable_dns_resolver":{"type":"boolean"},"enable_rebalance":{"type":"boolean"},"old_conn_close_duration":{"type":"string"},"rebalance_duration":{"type":"string"},"size":{"type":"integer"}}},"dial_option":{"type":"object","properties":{"backoff_base_delay":{"type":"string"},"backoff_jitter":{"type":"number"},"backoff_max_delay":{"type":"string"},"backoff_multiplier":{"type":"number"},"enable_backoff":{"type":"boolean"},"initial_connection_window_size":{"type":"integer"},"initial_window_size":{"type":"integer"},"insecure":{"type":"boolean"},"keep_alive":{"type":"object","properties":{"permit_without_stream":{"type":"boolean"},"time":{"type":"string"},"timeout":{"type":"string"}}},"max_msg_size":{"type":"integer"},"min_connection_timeout":{"type":"string"},"read_buffer_size":{"type":"integer"},"tcp":{"type":"object","properties":{"dialer":{"type":"object","properties":{"dual_stack_enabled":{"type":"boolean"},"keep_alive":{"type":"string"},"timeout":{"type":"string"}}},"dns":{"type":"object","properties":{"cache_enabled":{"type":"boolean"},"cache_expiration":{"type":"string"},"refresh_duration":{"type":"string"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"key":{"type":"string"}}}}},"timeout":{"type":"string"},"write_buffer_size":{"type":"integer"}}},"health_check_duration":{"type":"string"},"max_recv_msg_size":{"type":"integer"},"max_retry_rpc_buffer_size":{"type":"integer"},"max_send_msg_size":{"type":"integer"},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"key":{"type":"string"}}},"wait_for_ready":{"type":"boolean"}}},"ingress_filter":{"type":"object","properties":{"client":{"type":"object","properties":{"addrs":{"type":"array","items":{"type":"string"}},"backoff":{"type":"object","properties":{"backoff_factor":{"type":"number"},"backoff_time_limit":{"type":"string"},"enable_error_log":{"type":"boolean"},"initial_duration":{"type":"string"},"jitter_limit":{"type":"string"},"maximum_duration":{"type":"string"},"retry_count":{"type":"integer"}}},"call_option":{"type":"object"},"connection_pool":{"type":"object","properties":{"enable_dns_resolver":{"type":"boolean"},"enable_rebalance":{"type":"boolean"},"old_conn_close_duration":{"type":"string"},"rebalance_duration":{"type":"string"},"size":{"type":"integer"}}},"dial_option":{"type":"object","properties":{"backoff_base_delay":{"type":"string"},"backoff_jitter":{"type":"number"},"backoff_max_delay":{"type":"string"},"backoff_multiplier":{"type":"number"},"enable_backoff":{"type":"boolean"},"initial_connection_window_size":{"type":"integer"},"initial_window_size":{"type":"integer"},"insecure":{"type":"boolean"},"keep_alive":{"type":"object","properties":{"permit_without_stream":{"type":"boolean"},"time":{"type":"string"},"timeout":{"type":"string"}}},"max_msg_size":{"type":"integer"},"min_connection_timeout":{"type":"string"},"read_buffer_size":{"type":"integer"},"tcp":{"type":"object","properties":{"dialer":{"type":"object","properties":{"dual_stack_enabled":{"type":"boolean"},"keep_alive":{"type":"string"},"timeout":{"type":"string"}}},"dns":{"type":"object","properties":{"cache_enabled":{"type":"boolean"},"cache_expiration":{"type":"string"},"refresh_duration":{"type":"string"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"key":{"type":"string"}}}}},"timeout":{"type":"string"},"write_buffer_size":{"type":"integer"}}},"health_check_duration":{"type":"string"},"max_recv_msg_size":{"type":"integer"},"max_retry_rpc_buffer_size":{"type":"integer"},"max_send_msg_size":{"type":"integer"},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"key":{"type":"string"}}},"wait_for_ready":{"type":"boolean"}}},"insert_filters":{"type":"array","items":{"type":"string"}},"search_filters":{"type":"array","items":{"type":"string"}},"update_filters":{"type":"array","items":{"type":"string"}},"upsert_filters":{"type":"array","items":{"type":"string"}},"vectorizer":{"type":"string"}}}}},"hpa":{"type":"object","properties":{"enabled":{"type":"boolean"},"targetCPUUtilizationPercentage":{"type":"integer"}}},"image":{"type":"object","properties":{"pullPolicy":{"type":"string","enum":["Always","Never","IfNotPresent"]},"repository":{"type":"string"},"tag":{"type":"string"}}},"ingress":{"type":"object","properties":{"annotations":{"type":"object"},"enabled":{"type":"boolean"},"host":{"type":"string"},"pathType":{"type":"string"},"servicePort":{"type":"string"}}},"initContainers":{"type":"array","items":{"type":"object"}},"kind":{"type":"string","enum":["Deployment","DaemonSet"]},"logging":{"type":"object","properties":{"format":{"type":"string","enum":["raw","json"]},"level":{"type":"string","enum":["debug","info","warn","error","fatal"]},"logger":{"type":"string","enum":["glg","zap"]}}},"maxReplicas":{"type":"integer","minimum":0},"maxUnavailable":{"type":"string"},"minReplicas":{"type":"integer","minimum":0},"name":{"type":"string"},"nodeName":{"type":"string"},"nodeSelector":{"type":"object"},"observability":{"type":"object","properties":{"collector":{"type":"object","properties":{"duration":{"type":"string"},"metrics":{"type":"object","properties":{"enable_cgo":{"type":"boolean"},"enable_goroutine":{"type":"boolean"},"enable_memory":{"type":"boolean"},"enable_version_info":{"type":"boolean"},"version_info_labels":{"type":"array","items":{"type":"string","enum":["vald_version","server_name","git_commit","build_time","go_version","go_os","go_arch","cgo_enabled","ngt_version","build_cpu_info_flags"]}}}}}},"enabled":{"type":"boolean"},"jaeger":{"type":"object","properties":{"agent_endpoint":{"type":"string"},"buffer_max_count":{"type":"integer"},"collector_endpoint":{"type":"string"},"enabled":{"type":"boolean"},"password":{"type":"string"},"service_name":{"type":"string"},"username":{"type":"string"}}},"prometheus":{"type":"object","properties":{"enabled":{"type":"boolean"},"endpoint":{"type":"string"},"namespace":{"type":"string"}}},"stackdriver":{"type":"object","properties":{"client":{"type":"object","properties":{"api_key":{"type":"string"},"audiences":{"type":"array","items":{"type":"string"}},"authentication_enabled":{"type":"boolean"},"credentials_file":{"type":"string"},"credentials_json":{"type":"string"},"endpoint":{"type":"string"},"quota_project":{"type":"string"},"request_reason":{"type":"string"},"scopes":{"type":"array","items":{"type":"string"}},"telemetry_enabled":{"type":"boolean"},"user_agent":{"type":"string"}}},"exporter":{"type":"object","properties":{"bundle_count_threshold":{"type":"integer"},"bundle_delay_threshold":{"type":"string"},"location":{"type":"string"},"metric_prefix":{"type":"string"},"monitoring_enabled":{"type":"boolean"},"number_of_workers":{"type":"integer"},"reporting_interval":{"type":"string"},"skip_cmd":{"type":"boolean"},"timeout":{"type":"string"},"trace_spans_buffer_max_bytes":{"type":"integer"},"tracing_enabled":{"type":"boolean"}}},"profiler":{"type":"object","properties":{"alloc_force_gc":{"type":"boolean"},"alloc_profiling":{"type":"boolean"},"api_addr":{"type":"string"},"cpu_profiling":{"type":"boolean"},"debug_logging":{"type":"boolean"},"enabled":{"type":"boolean"},"goroutine_profiling":{"type":"boolean"},"heap_profiling":{"type":"boolean"},"instance":{"type":"string"},"mutex_profiling":{"type":"boolean"},"service":{"type":"string"},"service_version":{"type":"string"},"zone":{"type":"string"}}},"project_id":{"type":"string"}}},"trace":{"type":"object","properties":{"enabled":{"type":"boolean"},"sampling_rate":{"type":"number"}}}}},"podAnnotations":{"type":"object"},"podPriority":{"type":"object","properties":{"enabled":{"type":"boolean"},"value":{"type":"integer"}}},"podSecurityContext":{"type":"object"},"progressDeadlineSeconds":{"type":"integer"},"resources":{"type":"object","properties":{"limits":{"type":"object"},"requests":{"type":"object"}}},"revisionHistoryLimit":{"type":"integer","minimum":0},"rollingUpdate":{"type":"object","properties":{"maxSurge":{"type":"string"},"maxUnavailable":{"type":"string"}}},"securityContext":{"type":"object"},"server_config":{"type":"object","properties":{"full_shutdown_duration":{"type":"string"},"healths":{"type":"object","properties":{"liveness":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"livenessProbe":{"type":"object","properties":{"failureThreshold":{"type":"integer"},"httpGet":{"type":"object","properties":{"path":{"type":"string"},"port":{"type":"string"},"scheme":{"type":"string"}}},"initialDelaySeconds":{"type":"integer"},"periodSeconds":{"type":"integer"},"successThreshold":{"type":"integer"},"timetoutSeconds":{"type":"integer"}}},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}},"readiness":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"readinessProbe":{"type":"object","properties":{"failureThreshold":{"type":"integer"},"httpGet":{"type":"object","properties":{"path":{"type":"string"},"port":{"type":"string"},"scheme":{"type":"string"}}},"initialDelaySeconds":{"type":"integer"},"periodSeconds":{"type":"integer"},"successThreshold":{"type":"integer"},"timeoutSeconds":{"type":"integer"}}},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}}}},"metrics":{"type":"object","properties":{"pprof":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}},"prometheus":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}}}},"servers":{"type":"object","properties":{"grpc":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"grpc":{"type":"object","properties":{"bidirectional_stream_concurrency":{"type":"integer"},"connection_timeout":{"type":"string"},"header_table_size":{"type":"integer"},"initial_conn_window_size":{"type":"integer"},"initial_window_size":{"type":"integer"},"interceptors":{"type":"array","items":{"type":"string","enum":["RecoverInterceptor","AccessLogInterceptor","TracePayloadInterceptor"]}},"keepalive":{"type":"object","properties":{"max_conn_age":{"type":"string"},"max_conn_age_grace":{"type":"string"},"max_conn_idle":{"type":"string"},"time":{"type":"string"},"timeout":{"type":"string"}}},"max_header_list_size":{"type":"integer"},"max_receive_message_size":{"type":"integer"},"max_send_message_size":{"type":"integer"},"read_buffer_size":{"type":"integer"},"write_buffer_size":{"type":"integer"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"},"restart":{"type":"boolean"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}},"rest":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"handler_timeout":{"type":"string"},"http":{"type":"object"},"idle_timeout":{"type":"string"},"mode":{"type":"string"},"probe_wait_time":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"key":{"type":"string"}}}}},"service":{"type":"object","properties":{"annotations":{"type":"object"},"labels":{"type":"object"}}},"serviceType":{"type":"string","enum":["ClusterIP","LoadBalancer","NodePort"]},"terminationGracePeriodSeconds":{"type":"integer","minimum":0},"time_zone":{"type":"string"},"tolerations":{"type":"array","items":{"type":"object"}},"topologySpreadConstraints":{"type":"array","items":{"type":"object"}},"version":{"type":"string","pattern":"^v[0-9]+\\.[0-9]+\\.[0-9]$"},"volumeMounts":{"type":"array","items":{"type":"object"}},"volumes":{"type":"array","items":{"type":"object"}}}},"lb":{"type":"object","properties":{"affinity":{"type":"object","properties":{"nodeAffinity":{"type":"object","properties":{"preferredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}},"requiredDuringSchedulingIgnoredDuringExecution":{"type":"object","properties":{"nodeSelectorTerms":{"type":"array","items":{"type":"object"}}}}}},"podAffinity":{"type":"object","properties":{"preferredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}},"requiredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}}}},"podAntiAffinity":{"type":"object","properties":{"preferredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}},"requiredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}}}}}},"annotations":{"type":"object"},"enabled":{"type":"boolean"},"env":{"type":"array","items":{"type":"object"}},"externalTrafficPolicy":{"type":"string"},"gateway_config":{"type":"object","properties":{"agent_namespace":{"type":"string"},"discoverer":{"type":"object","properties":{"agent_client_options":{"type":"object","properties":{"addrs":{"type":"array","items":{"type":"string"}},"backoff":{"type":"object","properties":{"backoff_factor":{"type":"number"},"backoff_time_limit":{"type":"string"},"enable_error_log":{"type":"boolean"},"initial_duration":{"type":"string"},"jitter_limit":{"type":"string"},"maximum_duration":{"type":"string"},"retry_count":{"type":"integer"}}},"call_option":{"type":"object"},"connection_pool":{"type":"object","properties":{"enable_dns_resolver":{"type":"boolean"},"enable_rebalance":{"type":"boolean"},"old_conn_close_duration":{"type":"string"},"rebalance_duration":{"type":"string"},"size":{"type":"integer"}}},"dial_option":{"type":"object","properties":{"backoff_base_delay":{"type":"string"},"backoff_jitter":{"type":"number"},"backoff_max_delay":{"type":"string"},"backoff_multiplier":{"type":"number"},"enable_backoff":{"type":"boolean"},"initial_connection_window_size":{"type":"integer"},"initial_window_size":{"type":"integer"},"insecure":{"type":"boolean"},"keep_alive":{"type":"object","properties":{"permit_without_stream":{"type":"boolean"},"time":{"type":"string"},"timeout":{"type":"string"}}},"max_msg_size":{"type":"integer"},"min_connection_timeout":{"type":"string"},"read_buffer_size":{"type":"integer"},"tcp":{"type":"object","properties":{"dialer":{"type":"object","properties":{"dual_stack_enabled":{"type":"boolean"},"keep_alive":{"type":"string"},"timeout":{"type":"string"}}},"dns":{"type":"object","properties":{"cache_enabled":{"type":"boolean"},"cache_expiration":{"type":"string"},"refresh_duration":{"type":"string"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"key":{"type":"string"}}}}},"timeout":{"type":"string"},"write_buffer_size":{"type":"integer"}}},"health_check_duration":{"type":"string"},"max_recv_msg_size":{"type":"integer"},"max_retry_rpc_buffer_size":{"type":"integer"},"max_send_msg_size":{"type":"integer"},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"key":{"type":"string"}}},"wait_for_ready":{"type":"boolean"}}},"client":{"type":"object","properties":{"addrs":{"type":"array","items":{"type":"string"}},"backoff":{"type":"object","properties":{"backoff_factor":{"type":"number"},"backoff_time_limit":{"type":"string"},"enable_error_log":{"type":"boolean"},"initial_duration":{"type":"string"},"jitter_limit":{"type":"string"},"maximum_duration":{"type":"string"},"retry_count":{"type":"integer"}}},"call_option":{"type":"object"},"connection_pool":{"type":"object","properties":{"enable_dns_resolver":{"type":"boolean"},"enable_rebalance":{"type":"boolean"},"old_conn_close_duration":{"type":"string"},"rebalance_duration":{"type":"string"},"size":{"type":"integer"}}},"dial_option":{"type":"object","properties":{"backoff_base_delay":{"type":"string"},"backoff_jitter":{"type":"number"},"backoff_max_delay":{"type":"string"},"backoff_multiplier":{"type":"number"},"enable_backoff":{"type":"boolean"},"initial_connection_window_size":{"type":"integer"},"initial_window_size":{"type":"integer"},"insecure":{"type":"boolean"},"keep_alive":{"type":"object","properties":{"permit_without_stream":{"type":"boolean"},"time":{"type":"string"},"timeout":{"type":"string"}}},"max_msg_size":{"type":"integer"},"min_connection_timeout":{"type":"string"},"read_buffer_size":{"type":"integer"},"tcp":{"type":"object","properties":{"dialer":{"type":"object","properties":{"dual_stack_enabled":{"type":"boolean"},"keep_alive":{"type":"string"},"timeout":{"type":"string"}}},"dns":{"type":"object","properties":{"cache_enabled":{"type":"boolean"},"cache_expiration":{"type":"string"},"refresh_duration":{"type":"string"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"key":{"type":"string"}}}}},"timeout":{"type":"string"},"write_buffer_size":{"type":"integer"}}},"health_check_duration":{"type":"string"},"max_recv_msg_size":{"type":"integer"},"max_retry_rpc_buffer_size":{"type":"integer"},"max_send_msg_size":{"type":"integer"},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"key":{"type":"string"}}},"wait_for_ready":{"type":"boolean"}}},"duration":{"type":"string"}}},"index_replica":{"type":"integer","minimum":1},"node_namespace":{"type":"string"}}},"hpa":{"type":"object","properties":{"enabled":{"type":"boolean"},"targetCPUUtilizationPercentage":{"type":"integer"}}},"image":{"type":"object","properties":{"pullPolicy":{"type":"string","enum":["Always","Never","IfNotPresent"]},"repository":{"type":"string"},"tag":{"type":"string"}}},"ingress":{"type":"object","properties":{"annotations":{"type":"object"},"enabled":{"type":"boolean"},"host":{"type":"string"},"pathType":{"type":"string"},"servicePort":{"type":"string"}}},"initContainers":{"type":"array","items":{"type":"object"}},"kind":{"type":"string","enum":["Deployment","DaemonSet"]},"logging":{"type":"object","properties":{"format":{"type":"string","enum":["raw","json"]},"level":{"type":"string","enum":["debug","info","warn","error","fatal"]},"logger":{"type":"string","enum":["glg","zap"]}}},"maxReplicas":{"type":"integer","minimum":0},"maxUnavailable":{"type":"string"},"minReplicas":{"type":"integer","minimum":0},"name":{"type":"string"},"nodeName":{"type":"string"},"nodeSelector":{"type":"object"},"observability":{"type":"object","properties":{"collector":{"type":"object","properties":{"duration":{"type":"string"},"metrics":{"type":"object","properties":{"enable_cgo":{"type":"boolean"},"enable_goroutine":{"type":"boolean"},"enable_memory":{"type":"boolean"},"enable_version_info":{"type":"boolean"},"version_info_labels":{"type":"array","items":{"type":"string","enum":["vald_version","server_name","git_commit","build_time","go_version","go_os","go_arch","cgo_enabled","ngt_version","build_cpu_info_flags"]}}}}}},"enabled":{"type":"boolean"},"jaeger":{"type":"object","properties":{"agent_endpoint":{"type":"string"},"buffer_max_count":{"type":"integer"},"collector_endpoint":{"type":"string"},"enabled":{"type":"boolean"},"password":{"type":"string"},"service_name":{"type":"string"},"username":{"type":"string"}}},"prometheus":{"type":"object","properties":{"enabled":{"type":"boolean"},"endpoint":{"type":"string"},"namespace":{"type":"string"}}},"stackdriver":{"type":"object","properties":{"client":{"type":"object","properties":{"api_key":{"type":"string"},"audiences":{"type":"array","items":{"type":"string"}},"authentication_enabled":{"type":"boolean"},"credentials_file":{"type":"string"},"credentials_json":{"type":"string"},"endpoint":{"type":"string"},"quota_project":{"type":"string"},"request_reason":{"type":"string"},"scopes":{"type":"array","items":{"type":"string"}},"telemetry_enabled":{"type":"boolean"},"user_agent":{"type":"string"}}},"exporter":{"type":"object","properties":{"bundle_count_threshold":{"type":"integer"},"bundle_delay_threshold":{"type":"string"},"location":{"type":"string"},"metric_prefix":{"type":"string"},"monitoring_enabled":{"type":"boolean"},"number_of_workers":{"type":"integer"},"reporting_interval":{"type":"string"},"skip_cmd":{"type":"boolean"},"timeout":{"type":"string"},"trace_spans_buffer_max_bytes":{"type":"integer"},"tracing_enabled":{"type":"boolean"}}},"profiler":{"type":"object","properties":{"alloc_force_gc":{"type":"boolean"},"alloc_profiling":{"type":"boolean"},"api_addr":{"type":"string"},"cpu_profiling":{"type":"boolean"},"debug_logging":{"type":"boolean"},"enabled":{"type":"boolean"},"goroutine_profiling":{"type":"boolean"},"heap_profiling":{"type":"boolean"},"instance":{"type":"string"},"mutex_profiling":{"type":"boolean"},"service":{"type":"string"},"service_version":{"type":"string"},"zone":{"type":"string"}}},"project_id":{"type":"string"}}},"trace":{"type":"object","properties":{"enabled":{"type":"boolean"},"sampling_rate":{"type":"number"}}}}},"podAnnotations":{"type":"object"},"podPriority":{"type":"object","properties":{"enabled":{"type":"boolean"},"value":{"type":"integer"}}},"podSecurityContext":{"type":"object"},"progressDeadlineSeconds":{"type":"integer"},"resources":{"type":"object","properties":{"limits":{"type":"object"},"requests":{"type":"object"}}},"revisionHistoryLimit":{"type":"integer","minimum":0},"rollingUpdate":{"type":"object","properties":{"maxSurge":{"type":"string"},"maxUnavailable":{"type":"string"}}},"securityContext":{"type":"object"},"server_config":{"type":"object","properties":{"full_shutdown_duration":{"type":"string"},"healths":{"type":"object","properties":{"liveness":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"livenessProbe":{"type":"object","properties":{"failureThreshold":{"type":"integer"},"httpGet":{"type":"object","properties":{"path":{"type":"string"},"port":{"type":"string"},"scheme":{"type":"string"}}},"initialDelaySeconds":{"type":"integer"},"periodSeconds":{"type":"integer"},"successThreshold":{"type":"integer"},"timetoutSeconds":{"type":"integer"}}},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}},"readiness":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"readinessProbe":{"type":"object","properties":{"failureThreshold":{"type":"integer"},"httpGet":{"type":"object","properties":{"path":{"type":"string"},"port":{"type":"string"},"scheme":{"type":"string"}}},"initialDelaySeconds":{"type":"integer"},"periodSeconds":{"type":"integer"},"successThreshold":{"type":"integer"},"timeoutSeconds":{"type":"integer"}}},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}}}},"metrics":{"type":"object","properties":{"pprof":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}},"prometheus":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}}}},"servers":{"type":"object","properties":{"grpc":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"grpc":{"type":"object","properties":{"bidirectional_stream_concurrency":{"type":"integer"},"connection_timeout":{"type":"string"},"header_table_size":{"type":"integer"},"initial_conn_window_size":{"type":"integer"},"initial_window_size":{"type":"integer"},"interceptors":{"type":"array","items":{"type":"string","enum":["RecoverInterceptor","AccessLogInterceptor","TracePayloadInterceptor"]}},"keepalive":{"type":"object","properties":{"max_conn_age":{"type":"string"},"max_conn_age_grace":{"type":"string"},"max_conn_idle":{"type":"string"},"time":{"type":"string"},"timeout":{"type":"string"}}},"max_header_list_size":{"type":"integer"},"max_receive_message_size":{"type":"integer"},"max_send_message_size":{"type":"integer"},"read_buffer_size":{"type":"integer"},"write_buffer_size":{"type":"integer"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"},"restart":{"type":"boolean"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}},"rest":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"handler_timeout":{"type":"string"},"http":{"type":"object"},"idle_timeout":{"type":"string"},"mode":{"type":"string"},"probe_wait_time":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"key":{"type":"string"}}}}},"service":{"type":"object","properties":{"annotations":{"type":"object"},"labels":{"type":"object"}}},"serviceType":{"type":"string","enum":["ClusterIP","LoadBalancer","NodePort"]},"terminationGracePeriodSeconds":{"type":"integer","minimum":0},"time_zone":{"type":"string"},"tolerations":{"type":"array","items":{"type":"object"}},"topologySpreadConstraints":{"type":"array","items":{"type":"object"}},"version":{"type":"string","pattern":"^v[0-9]+\\.[0-9]+\\.[0-9]$"},"volumeMounts":{"type":"array","items":{"type":"object"}},"volumes":{"type":"array","items":{"type":"object"}}}},"meta":{"type":"object","properties":{"affinity":{"type":"object","properties":{"nodeAffinity":{"type":"object","properties":{"preferredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}},"requiredDuringSchedulingIgnoredDuringExecution":{"type":"object","properties":{"nodeSelectorTerms":{"type":"array","items":{"type":"object"}}}}}},"podAffinity":{"type":"object","properties":{"preferredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}},"requiredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}}}},"podAntiAffinity":{"type":"object","properties":{"preferredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}},"requiredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}}}}}},"annotations":{"type":"object"},"enabled":{"type":"boolean"},"env":{"type":"array","items":{"type":"object"}},"externalTrafficPolicy":{"type":"string"},"gateway_config":{"type":"object","properties":{"gateway_client":{"type":"object","properties":{"addrs":{"type":"array","items":{"type":"string"}},"backoff":{"type":"object","properties":{"backoff_factor":{"type":"number"},"backoff_time_limit":{"type":"string"},"enable_error_log":{"type":"boolean"},"initial_duration":{"type":"string"},"jitter_limit":{"type":"string"},"maximum_duration":{"type":"string"},"retry_count":{"type":"integer"}}},"call_option":{"type":"object"},"connection_pool":{"type":"object","properties":{"enable_dns_resolver":{"type":"boolean"},"enable_rebalance":{"type":"boolean"},"old_conn_close_duration":{"type":"string"},"rebalance_duration":{"type":"string"},"size":{"type":"integer"}}},"dial_option":{"type":"object","properties":{"backoff_base_delay":{"type":"string"},"backoff_jitter":{"type":"number"},"backoff_max_delay":{"type":"string"},"backoff_multiplier":{"type":"number"},"enable_backoff":{"type":"boolean"},"initial_connection_window_size":{"type":"integer"},"initial_window_size":{"type":"integer"},"insecure":{"type":"boolean"},"keep_alive":{"type":"object","properties":{"permit_without_stream":{"type":"boolean"},"time":{"type":"string"},"timeout":{"type":"string"}}},"max_msg_size":{"type":"integer"},"min_connection_timeout":{"type":"string"},"read_buffer_size":{"type":"integer"},"tcp":{"type":"object","properties":{"dialer":{"type":"object","properties":{"dual_stack_enabled":{"type":"boolean"},"keep_alive":{"type":"string"},"timeout":{"type":"string"}}},"dns":{"type":"object","properties":{"cache_enabled":{"type":"boolean"},"cache_expiration":{"type":"string"},"refresh_duration":{"type":"string"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"key":{"type":"string"}}}}},"timeout":{"type":"string"},"write_buffer_size":{"type":"integer"}}},"health_check_duration":{"type":"string"},"max_recv_msg_size":{"type":"integer"},"max_retry_rpc_buffer_size":{"type":"integer"},"max_send_msg_size":{"type":"integer"},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"key":{"type":"string"}}},"wait_for_ready":{"type":"boolean"}}},"meta":{"type":"object","properties":{"cache_expiration":{"type":"string"},"client":{"type":"object","properties":{"addrs":{"type":"array","items":{"type":"string"}},"backoff":{"type":"object","properties":{"backoff_factor":{"type":"number"},"backoff_time_limit":{"type":"string"},"enable_error_log":{"type":"boolean"},"initial_duration":{"type":"string"},"jitter_limit":{"type":"string"},"maximum_duration":{"type":"string"},"retry_count":{"type":"integer"}}},"call_option":{"type":"object"},"connection_pool":{"type":"object","properties":{"enable_dns_resolver":{"type":"boolean"},"enable_rebalance":{"type":"boolean"},"old_conn_close_duration":{"type":"string"},"rebalance_duration":{"type":"string"},"size":{"type":"integer"}}},"dial_option":{"type":"object","properties":{"backoff_base_delay":{"type":"string"},"backoff_jitter":{"type":"number"},"backoff_max_delay":{"type":"string"},"backoff_multiplier":{"type":"number"},"enable_backoff":{"type":"boolean"},"initial_connection_window_size":{"type":"integer"},"initial_window_size":{"type":"integer"},"insecure":{"type":"boolean"},"keep_alive":{"type":"object","properties":{"permit_without_stream":{"type":"boolean"},"time":{"type":"string"},"timeout":{"type":"string"}}},"max_msg_size":{"type":"integer"},"min_connection_timeout":{"type":"string"},"read_buffer_size":{"type":"integer"},"tcp":{"type":"object","properties":{"dialer":{"type":"object","properties":{"dual_stack_enabled":{"type":"boolean"},"keep_alive":{"type":"string"},"timeout":{"type":"string"}}},"dns":{"type":"object","properties":{"cache_enabled":{"type":"boolean"},"cache_expiration":{"type":"string"},"refresh_duration":{"type":"string"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"key":{"type":"string"}}}}},"timeout":{"type":"string"},"write_buffer_size":{"type":"integer"}}},"health_check_duration":{"type":"string"},"max_recv_msg_size":{"type":"integer"},"max_retry_rpc_buffer_size":{"type":"integer"},"max_send_msg_size":{"type":"integer"},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"key":{"type":"string"}}},"wait_for_ready":{"type":"boolean"}}},"enable_cache":{"type":"boolean"},"expired_cache_check_duration":{"type":"string"}}}}},"hpa":{"type":"object","properties":{"enabled":{"type":"boolean"},"targetCPUUtilizationPercentage":{"type":"integer"}}},"image":{"type":"object","properties":{"pullPolicy":{"type":"string","enum":["Always","Never","IfNotPresent"]},"repository":{"type":"string"},"tag":{"type":"string"}}},"ingress":{"type":"object","properties":{"annotations":{"type":"object"},"enabled":{"type":"boolean"},"host":{"type":"string"},"pathType":{"type":"string"},"servicePort":{"type":"string"}}},"initContainers":{"type":"array","items":{"type":"object"}},"kind":{"type":"string","enum":["Deployment","DaemonSet"]},"logging":{"type":"object","properties":{"format":{"type":"string","enum":["raw","json"]},"level":{"type":"string","enum":["debug","info","warn","error","fatal"]},"logger":{"type":"string","enum":["glg","zap"]}}},"maxReplicas":{"type":"integer","minimum":0},"maxUnavailable":{"type":"string"},"minReplicas":{"type":"integer","minimum":0},"name":{"type":"string"},"nodeName":{"type":"string"},"nodeSelector":{"type":"object"},"observability":{"type":"object","properties":{"collector":{"type":"object","properties":{"duration":{"type":"string"},"metrics":{"type":"object","properties":{"enable_cgo":{"type":"boolean"},"enable_goroutine":{"type":"boolean"},"enable_memory":{"type":"boolean"},"enable_version_info":{"type":"boolean"},"version_info_labels":{"type":"array","items":{"type":"string","enum":["vald_version","server_name","git_commit","build_time","go_version","go_os","go_arch","cgo_enabled","ngt_version","build_cpu_info_flags"]}}}}}},"enabled":{"type":"boolean"},"jaeger":{"type":"object","properties":{"agent_endpoint":{"type":"string"},"buffer_max_count":{"type":"integer"},"collector_endpoint":{"type":"string"},"enabled":{"type":"boolean"},"password":{"type":"string"},"service_name":{"type":"string"},"username":{"type":"string"}}},"prometheus":{"type":"object","properties":{"enabled":{"type":"boolean"},"endpoint":{"type":"string"},"namespace":{"type":"string"}}},"stackdriver":{"type":"object","properties":{"client":{"type":"object","properties":{"api_key":{"type":"string"},"audiences":{"type":"array","items":{"type":"string"}},"authentication_enabled":{"type":"boolean"},"credentials_file":{"type":"string"},"credentials_json":{"type":"string"},"endpoint":{"type":"string"},"quota_project":{"type":"string"},"request_reason":{"type":"string"},"scopes":{"type":"array","items":{"type":"string"}},"telemetry_enabled":{"type":"boolean"},"user_agent":{"type":"string"}}},"exporter":{"type":"object","properties":{"bundle_count_threshold":{"type":"integer"},"bundle_delay_threshold":{"type":"string"},"location":{"type":"string"},"metric_prefix":{"type":"string"},"monitoring_enabled":{"type":"boolean"},"number_of_workers":{"type":"integer"},"reporting_interval":{"type":"string"},"skip_cmd":{"type":"boolean"},"timeout":{"type":"string"},"trace_spans_buffer_max_bytes":{"type":"integer"},"tracing_enabled":{"type":"boolean"}}},"profiler":{"type":"object","properties":{"alloc_force_gc":{"type":"boolean"},"alloc_profiling":{"type":"boolean"},"api_addr":{"type":"string"},"cpu_profiling":{"type":"boolean"},"debug_logging":{"type":"boolean"},"enabled":{"type":"boolean"},"goroutine_profiling":{"type":"boolean"},"heap_profiling":{"type":"boolean"},"instance":{"type":"string"},"mutex_profiling":{"type":"boolean"},"service":{"type":"string"},"service_version":{"type":"string"},"zone":{"type":"string"}}},"project_id":{"type":"string"}}},"trace":{"type":"object","properties":{"enabled":{"type":"boolean"},"sampling_rate":{"type":"number"}}}}},"podAnnotations":{"type":"object"},"podPriority":{"type":"object","properties":{"enabled":{"type":"boolean"},"value":{"type":"integer"}}},"podSecurityContext":{"type":"object"},"progressDeadlineSeconds":{"type":"integer"},"resources":{"type":"object","properties":{"limits":{"type":"object"},"requests":{"type":"object"}}},"revisionHistoryLimit":{"type":"integer","minimum":0},"rollingUpdate":{"type":"object","properties":{"maxSurge":{"type":"string"},"maxUnavailable":{"type":"string"}}},"securityContext":{"type":"object"},"server_config":{"type":"object","properties":{"full_shutdown_duration":{"type":"string"},"healths":{"type":"object","properties":{"liveness":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"livenessProbe":{"type":"object","properties":{"failureThreshold":{"type":"integer"},"httpGet":{"type":"object","properties":{"path":{"type":"string"},"port":{"type":"string"},"scheme":{"type":"string"}}},"initialDelaySeconds":{"type":"integer"},"periodSeconds":{"type":"integer"},"successThreshold":{"type":"integer"},"timetoutSeconds":{"type":"integer"}}},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}},"readiness":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"readinessProbe":{"type":"object","properties":{"failureThreshold":{"type":"integer"},"httpGet":{"type":"object","properties":{"path":{"type":"string"},"port":{"type":"string"},"scheme":{"type":"string"}}},"initialDelaySeconds":{"type":"integer"},"periodSeconds":{"type":"integer"},"successThreshold":{"type":"integer"},"timeoutSeconds":{"type":"integer"}}},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}}}},"metrics":{"type":"object","properties":{"pprof":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}},"prometheus":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}}}},"servers":{"type":"object","properties":{"grpc":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"grpc":{"type":"object","properties":{"bidirectional_stream_concurrency":{"type":"integer"},"connection_timeout":{"type":"string"},"header_table_size":{"type":"integer"},"initial_conn_window_size":{"type":"integer"},"initial_window_size":{"type":"integer"},"interceptors":{"type":"array","items":{"type":"string","enum":["RecoverInterceptor","AccessLogInterceptor","TracePayloadInterceptor"]}},"keepalive":{"type":"object","properties":{"max_conn_age":{"type":"string"},"max_conn_age_grace":{"type":"string"},"max_conn_idle":{"type":"string"},"time":{"type":"string"},"timeout":{"type":"string"}}},"max_header_list_size":{"type":"integer"},"max_receive_message_size":{"type":"integer"},"max_send_message_size":{"type":"integer"},"read_buffer_size":{"type":"integer"},"write_buffer_size":{"type":"integer"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"},"restart":{"type":"boolean"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}},"rest":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"handler_timeout":{"type":"string"},"http":{"type":"object"},"idle_timeout":{"type":"string"},"mode":{"type":"string"},"probe_wait_time":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"key":{"type":"string"}}}}},"service":{"type":"object","properties":{"annotations":{"type":"object"},"labels":{"type":"object"}}},"serviceType":{"type":"string","enum":["ClusterIP","LoadBalancer","NodePort"]},"terminationGracePeriodSeconds":{"type":"integer","minimum":0},"time_zone":{"type":"string"},"tolerations":{"type":"array","items":{"type":"object"}},"topologySpreadConstraints":{"type":"array","items":{"type":"object"}},"version":{"type":"string","pattern":"^v[0-9]+\\.[0-9]+\\.[0-9]$"},"volumeMounts":{"type":"array","items":{"type":"object"}},"volumes":{"type":"array","items":{"type":"object"}}}},"vald":{"type":"object","properties":{"affinity":{"type":"object","properties":{"nodeAffinity":{"type":"object","properties":{"preferredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}},"requiredDuringSchedulingIgnoredDuringExecution":{"type":"object","properties":{"nodeSelectorTerms":{"type":"array","items":{"type":"object"}}}}}},"podAffinity":{"type":"object","properties":{"preferredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}},"requiredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}}}},"podAntiAffinity":{"type":"object","properties":{"preferredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}},"requiredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}}}}}},"annotations":{"type":"object"},"enabled":{"type":"boolean"},"env":{"type":"array","items":{"type":"object"}},"externalTrafficPolicy":{"type":"string"},"gateway_config":{"type":"object","properties":{"agent_namespace":{"type":"string"},"backup":{"type":"object","properties":{"client":{"type":"object","properties":{"addrs":{"type":"array","items":{"type":"string"}},"backoff":{"type":"object","properties":{"backoff_factor":{"type":"number"},"backoff_time_limit":{"type":"string"},"enable_error_log":{"type":"boolean"},"initial_duration":{"type":"string"},"jitter_limit":{"type":"string"},"maximum_duration":{"type":"string"},"retry_count":{"type":"integer"}}},"call_option":{"type":"object"},"connection_pool":{"type":"object","properties":{"enable_dns_resolver":{"type":"boolean"},"enable_rebalance":{"type":"boolean"},"old_conn_close_duration":{"type":"string"},"rebalance_duration":{"type":"string"},"size":{"type":"integer"}}},"dial_option":{"type":"object","properties":{"backoff_base_delay":{"type":"string"},"backoff_jitter":{"type":"number"},"backoff_max_delay":{"type":"string"},"backoff_multiplier":{"type":"number"},"enable_backoff":{"type":"boolean"},"initial_connection_window_size":{"type":"integer"},"initial_window_size":{"type":"integer"},"insecure":{"type":"boolean"},"keep_alive":{"type":"object","properties":{"permit_without_stream":{"type":"boolean"},"time":{"type":"string"},"timeout":{"type":"string"}}},"max_msg_size":{"type":"integer"},"min_connection_timeout":{"type":"string"},"read_buffer_size":{"type":"integer"},"tcp":{"type":"object","properties":{"dialer":{"type":"object","properties":{"dual_stack_enabled":{"type":"boolean"},"keep_alive":{"type":"string"},"timeout":{"type":"string"}}},"dns":{"type":"object","properties":{"cache_enabled":{"type":"boolean"},"cache_expiration":{"type":"string"},"refresh_duration":{"type":"string"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"key":{"type":"string"}}}}},"timeout":{"type":"string"},"write_buffer_size":{"type":"integer"}}},"health_check_duration":{"type":"string"},"max_recv_msg_size":{"type":"integer"},"max_retry_rpc_buffer_size":{"type":"integer"},"max_send_msg_size":{"type":"integer"},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"key":{"type":"string"}}},"wait_for_ready":{"type":"boolean"}}}}},"discoverer":{"type":"object","properties":{"agent_client_options":{"type":"object","properties":{"addrs":{"type":"array","items":{"type":"string"}},"backoff":{"type":"object","properties":{"backoff_factor":{"type":"number"},"backoff_time_limit":{"type":"string"},"enable_error_log":{"type":"boolean"},"initial_duration":{"type":"string"},"jitter_limit":{"type":"string"},"maximum_duration":{"type":"string"},"retry_count":{"type":"integer"}}},"call_option":{"type":"object"},"connection_pool":{"type":"object","properties":{"enable_dns_resolver":{"type":"boolean"},"enable_rebalance":{"type":"boolean"},"old_conn_close_duration":{"type":"string"},"rebalance_duration":{"type":"string"},"size":{"type":"integer"}}},"dial_option":{"type":"object","properties":{"backoff_base_delay":{"type":"string"},"backoff_jitter":{"type":"number"},"backoff_max_delay":{"type":"string"},"backoff_multiplier":{"type":"number"},"enable_backoff":{"type":"boolean"},"initial_connection_window_size":{"type":"integer"},"initial_window_size":{"type":"integer"},"insecure":{"type":"boolean"},"keep_alive":{"type":"object","properties":{"permit_without_stream":{"type":"boolean"},"time":{"type":"string"},"timeout":{"type":"string"}}},"max_msg_size":{"type":"integer"},"min_connection_timeout":{"type":"string"},"read_buffer_size":{"type":"integer"},"tcp":{"type":"object","properties":{"dialer":{"type":"object","properties":{"dual_stack_enabled":{"type":"boolean"},"keep_alive":{"type":"string"},"timeout":{"type":"string"}}},"dns":{"type":"object","properties":{"cache_enabled":{"type":"boolean"},"cache_expiration":{"type":"string"},"refresh_duration":{"type":"string"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"key":{"type":"string"}}}}},"timeout":{"type":"string"},"write_buffer_size":{"type":"integer"}}},"health_check_duration":{"type":"string"},"max_recv_msg_size":{"type":"integer"},"max_retry_rpc_buffer_size":{"type":"integer"},"max_send_msg_size":{"type":"integer"},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"key":{"type":"string"}}},"wait_for_ready":{"type":"boolean"}}},"client":{"type":"object","properties":{"addrs":{"type":"array","items":{"type":"string"}},"backoff":{"type":"object","properties":{"backoff_factor":{"type":"number"},"backoff_time_limit":{"type":"string"},"enable_error_log":{"type":"boolean"},"initial_duration":{"type":"string"},"jitter_limit":{"type":"string"},"maximum_duration":{"type":"string"},"retry_count":{"type":"integer"}}},"call_option":{"type":"object"},"connection_pool":{"type":"object","properties":{"enable_dns_resolver":{"type":"boolean"},"enable_rebalance":{"type":"boolean"},"old_conn_close_duration":{"type":"string"},"rebalance_duration":{"type":"string"},"size":{"type":"integer"}}},"dial_option":{"type":"object","properties":{"backoff_base_delay":{"type":"string"},"backoff_jitter":{"type":"number"},"backoff_max_delay":{"type":"string"},"backoff_multiplier":{"type":"number"},"enable_backoff":{"type":"boolean"},"initial_connection_window_size":{"type":"integer"},"initial_window_size":{"type":"integer"},"insecure":{"type":"boolean"},"keep_alive":{"type":"object","properties":{"permit_without_stream":{"type":"boolean"},"time":{"type":"string"},"timeout":{"type":"string"}}},"max_msg_size":{"type":"integer"},"min_connection_timeout":{"type":"string"},"read_buffer_size":{"type":"integer"},"tcp":{"type":"object","properties":{"dialer":{"type":"object","properties":{"dual_stack_enabled":{"type":"boolean"},"keep_alive":{"type":"string"},"timeout":{"type":"string"}}},"dns":{"type":"object","properties":{"cache_enabled":{"type":"boolean"},"cache_expiration":{"type":"string"},"refresh_duration":{"type":"string"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"key":{"type":"string"}}}}},"timeout":{"type":"string"},"write_buffer_size":{"type":"integer"}}},"health_check_duration":{"type":"string"},"max_recv_msg_size":{"type":"integer"},"max_retry_rpc_buffer_size":{"type":"integer"},"max_send_msg_size":{"type":"integer"},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"key":{"type":"string"}}},"wait_for_ready":{"type":"boolean"}}},"duration":{"type":"string"}}},"index_replica":{"type":"integer","minimum":1},"meta":{"type":"object","properties":{"cache_expiration":{"type":"string"},"client":{"type":"object","properties":{"addrs":{"type":"array","items":{"type":"string"}},"backoff":{"type":"object","properties":{"backoff_factor":{"type":"number"},"backoff_time_limit":{"type":"string"},"enable_error_log":{"type":"boolean"},"initial_duration":{"type":"string"},"jitter_limit":{"type":"string"},"maximum_duration":{"type":"string"},"retry_count":{"type":"integer"}}},"call_option":{"type":"object"},"connection_pool":{"type":"object","properties":{"enable_dns_resolver":{"type":"boolean"},"enable_rebalance":{"type":"boolean"},"old_conn_close_duration":{"type":"string"},"rebalance_duration":{"type":"string"},"size":{"type":"integer"}}},"dial_option":{"type":"object","properties":{"backoff_base_delay":{"type":"string"},"backoff_jitter":{"type":"number"},"backoff_max_delay":{"type":"string"},"backoff_multiplier":{"type":"number"},"enable_backoff":{"type":"boolean"},"initial_connection_window_size":{"type":"integer"},"initial_window_size":{"type":"integer"},"insecure":{"type":"boolean"},"keep_alive":{"type":"object","properties":{"permit_without_stream":{"type":"boolean"},"time":{"type":"string"},"timeout":{"type":"string"}}},"max_msg_size":{"type":"integer"},"min_connection_timeout":{"type":"string"},"read_buffer_size":{"type":"integer"},"tcp":{"type":"object","properties":{"dialer":{"type":"object","properties":{"dual_stack_enabled":{"type":"boolean"},"keep_alive":{"type":"string"},"timeout":{"type":"string"}}},"dns":{"type":"object","properties":{"cache_enabled":{"type":"boolean"},"cache_expiration":{"type":"string"},"refresh_duration":{"type":"string"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"key":{"type":"string"}}}}},"timeout":{"type":"string"},"write_buffer_size":{"type":"integer"}}},"health_check_duration":{"type":"string"},"max_recv_msg_size":{"type":"integer"},"max_retry_rpc_buffer_size":{"type":"integer"},"max_send_msg_size":{"type":"integer"},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"key":{"type":"string"}}},"wait_for_ready":{"type":"boolean"}}},"enable_cache":{"type":"boolean"},"expired_cache_check_duration":{"type":"string"}}},"node_namespace":{"type":"string"}}},"hpa":{"type":"object","properties":{"enabled":{"type":"boolean"},"targetCPUUtilizationPercentage":{"type":"integer"}}},"image":{"type":"object","properties":{"pullPolicy":{"type":"string","enum":["Always","Never","IfNotPresent"]},"repository":{"type":"string"},"tag":{"type":"string"}}},"ingress":{"type":"object","properties":{"annotations":{"type":"object"},"enabled":{"type":"boolean"},"host":{"type":"string"},"pathType":{"type":"string"},"servicePort":{"type":"string"}}},"initContainers":{"type":"array","items":{"type":"object"}},"kind":{"type":"string","enum":["Deployment","DaemonSet"]},"logging":{"type":"object","properties":{"format":{"type":"string","enum":["raw","json"]},"level":{"type":"string","enum":["debug","info","warn","error","fatal"]},"logger":{"type":"string","enum":["glg","zap"]}}},"maxReplicas":{"type":"integer","minimum":0},"maxUnavailable":{"type":"string"},"minReplicas":{"type":"integer","minimum":0},"name":{"type":"string"},"nodeName":{"type":"string"},"nodeSelector":{"type":"object"},"observability":{"type":"object","properties":{"collector":{"type":"object","properties":{"duration":{"type":"string"},"metrics":{"type":"object","properties":{"enable_cgo":{"type":"boolean"},"enable_goroutine":{"type":"boolean"},"enable_memory":{"type":"boolean"},"enable_version_info":{"type":"boolean"},"version_info_labels":{"type":"array","items":{"type":"string","enum":["vald_version","server_name","git_commit","build_time","go_version","go_os","go_arch","cgo_enabled","ngt_version","build_cpu_info_flags"]}}}}}},"enabled":{"type":"boolean"},"jaeger":{"type":"object","properties":{"agent_endpoint":{"type":"string"},"buffer_max_count":{"type":"integer"},"collector_endpoint":{"type":"string"},"enabled":{"type":"boolean"},"password":{"type":"string"},"service_name":{"type":"string"},"username":{"type":"string"}}},"prometheus":{"type":"object","properties":{"enabled":{"type":"boolean"},"endpoint":{"type":"string"},"namespace":{"type":"string"}}},"stackdriver":{"type":"object","properties":{"client":{"type":"object","properties":{"api_key":{"type":"string"},"audiences":{"type":"array","items":{"type":"string"}},"authentication_enabled":{"type":"boolean"},"credentials_file":{"type":"string"},"credentials_json":{"type":"string"},"endpoint":{"type":"string"},"quota_project":{"type":"string"},"request_reason":{"type":"string"},"scopes":{"type":"array","items":{"type":"string"}},"telemetry_enabled":{"type":"boolean"},"user_agent":{"type":"string"}}},"exporter":{"type":"object","properties":{"bundle_count_threshold":{"type":"integer"},"bundle_delay_threshold":{"type":"string"},"location":{"type":"string"},"metric_prefix":{"type":"string"},"monitoring_enabled":{"type":"boolean"},"number_of_workers":{"type":"integer"},"reporting_interval":{"type":"string"},"skip_cmd":{"type":"boolean"},"timeout":{"type":"string"},"trace_spans_buffer_max_bytes":{"type":"integer"},"tracing_enabled":{"type":"boolean"}}},"profiler":{"type":"object","properties":{"alloc_force_gc":{"type":"boolean"},"alloc_profiling":{"type":"boolean"},"api_addr":{"type":"string"},"cpu_profiling":{"type":"boolean"},"debug_logging":{"type":"boolean"},"enabled":{"type":"boolean"},"goroutine_profiling":{"type":"boolean"},"heap_profiling":{"type":"boolean"},"instance":{"type":"string"},"mutex_profiling":{"type":"boolean"},"service":{"type":"string"},"service_version":{"type":"string"},"zone":{"type":"string"}}},"project_id":{"type":"string"}}},"trace":{"type":"object","properties":{"enabled":{"type":"boolean"},"sampling_rate":{"type":"number"}}}}},"podAnnotations":{"type":"object"},"podPriority":{"type":"object","properties":{"enabled":{"type":"boolean"},"value":{"type":"integer"}}},"podSecurityContext":{"type":"object"},"progressDeadlineSeconds":{"type":"integer"},"resources":{"type":"object","properties":{"limits":{"type":"object"},"requests":{"type":"object"}}},"revisionHistoryLimit":{"type":"integer","minimum":0},"rollingUpdate":{"type":"object","properties":{"maxSurge":{"type":"string"},"maxUnavailable":{"type":"string"}}},"securityContext":{"type":"object"},"server_config":{"type":"object","properties":{"full_shutdown_duration":{"type":"string"},"healths":{"type":"object","properties":{"liveness":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"livenessProbe":{"type":"object","properties":{"failureThreshold":{"type":"integer"},"httpGet":{"type":"object","properties":{"path":{"type":"string"},"port":{"type":"string"},"scheme":{"type":"string"}}},"initialDelaySeconds":{"type":"integer"},"periodSeconds":{"type":"integer"},"successThreshold":{"type":"integer"},"timetoutSeconds":{"type":"integer"}}},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}},"readiness":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"readinessProbe":{"type":"object","properties":{"failureThreshold":{"type":"integer"},"httpGet":{"type":"object","properties":{"path":{"type":"string"},"port":{"type":"string"},"scheme":{"type":"string"}}},"initialDelaySeconds":{"type":"integer"},"periodSeconds":{"type":"integer"},"successThreshold":{"type":"integer"},"timeoutSeconds":{"type":"integer"}}},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}}}},"metrics":{"type":"object","properties":{"pprof":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}},"prometheus":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}}}},"servers":{"type":"object","properties":{"grpc":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"grpc":{"type":"object","properties":{"bidirectional_stream_concurrency":{"type":"integer"},"connection_timeout":{"type":"string"},"header_table_size":{"type":"integer"},"initial_conn_window_size":{"type":"integer"},"initial_window_size":{"type":"integer"},"interceptors":{"type":"array","items":{"type":"string","enum":["RecoverInterceptor","AccessLogInterceptor","TracePayloadInterceptor"]}},"keepalive":{"type":"object","properties":{"max_conn_age":{"type":"string"},"max_conn_age_grace":{"type":"string"},"max_conn_idle":{"type":"string"},"time":{"type":"string"},"timeout":{"type":"string"}}},"max_header_list_size":{"type":"integer"},"max_receive_message_size":{"type":"integer"},"max_send_message_size":{"type":"integer"},"read_buffer_size":{"type":"integer"},"write_buffer_size":{"type":"integer"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"},"restart":{"type":"boolean"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}},"rest":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"handler_timeout":{"type":"string"},"http":{"type":"object"},"idle_timeout":{"type":"string"},"mode":{"type":"string"},"probe_wait_time":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"key":{"type":"string"}}}}},"service":{"type":"object","properties":{"annotations":{"type":"object"},"labels":{"type":"object"}}},"serviceType":{"type":"string","enum":["ClusterIP","LoadBalancer","NodePort"]},"terminationGracePeriodSeconds":{"type":"integer","minimum":0},"time_zone":{"type":"string"},"tolerations":{"type":"array","items":{"type":"object"}},"topologySpreadConstraints":{"type":"array","items":{"type":"object"}},"version":{"type":"string","pattern":"^v[0-9]+\\.[0-9]+\\.[0-9]$"},"volumeMounts":{"type":"array","items":{"type":"object"}},"volumes":{"type":"array","items":{"type":"object"}}}}}},"manager":{"type":"object","properties":{"backup":{"type":"object","properties":{"affinity":{"type":"object","properties":{"nodeAffinity":{"type":"object","properties":{"preferredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}},"requiredDuringSchedulingIgnoredDuringExecution":{"type":"object","properties":{"nodeSelectorTerms":{"type":"array","items":{"type":"object"}}}}}},"podAffinity":{"type":"object","properties":{"preferredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}},"requiredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}}}},"podAntiAffinity":{"type":"object","properties":{"preferredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}},"requiredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}}}}}},"annotations":{"type":"object"},"cassandra":{"type":"object","properties":{"config":{"type":"object","properties":{"connect_timeout":{"type":"string"},"consistency":{"type":"string","enum":["any","one","two","three","all","quorum","localquorum","eachquorum","localone"]},"cql_version":{"type":"string"},"default_idempotence":{"type":"boolean"},"default_timestamp":{"type":"boolean"},"disable_initial_host_lookup":{"type":"boolean"},"disable_node_status_events":{"type":"boolean"},"disable_skip_metadata":{"type":"boolean"},"disable_topology_events":{"type":"boolean"},"enable_host_verification":{"type":"boolean"},"host_filter":{"type":"object","properties":{"data_center":{"type":"string"},"enabled":{"type":"boolean"},"white_list":{"type":"array","items":{"type":"string"}}}},"hosts":{"type":"array","items":{"type":"string"}},"ignore_peer_addr":{"type":"boolean"},"keyspace":{"type":"string"},"max_prepared_stmts":{"type":"integer"},"max_routing_key_info":{"type":"integer"},"max_wait_schema_agreement":{"type":"string"},"num_conns":{"type":"integer"},"page_size":{"type":"integer"},"password":{"type":"string"},"pool_config":{"type":"object","properties":{"data_center":{"type":"string"},"dc_aware_routing":{"type":"boolean"},"non_local_replicas_fallback":{"type":"boolean"},"shuffle_replicas":{"type":"boolean"},"token_aware_host_policy":{"type":"boolean"}}},"port":{"type":"integer"},"proto_version":{"type":"integer"},"reconnect_interval":{"type":"string"},"reconnection_policy":{"type":"object","properties":{"initial_interval":{"type":"string"},"max_retries":{"type":"integer"}}},"retry_policy":{"type":"object","properties":{"max_duration":{"type":"string"},"min_duration":{"type":"string"},"num_retries":{"type":"integer"}}},"serial_consistency":{"type":"string","enum":["localserial","serial"]},"socket_keepalive":{"type":"string"},"tcp":{"type":"object","properties":{"dialer":{"type":"object","properties":{"dual_stack_enabled":{"type":"boolean"},"keep_alive":{"type":"string"},"timeout":{"type":"string"}}},"dns":{"type":"object","properties":{"cache_enabled":{"type":"boolean"},"cache_expiration":{"type":"string"},"refresh_duration":{"type":"string"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"key":{"type":"string"}}}}},"timeout":{"type":"string"},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"key":{"type":"string"}}},"username":{"type":"string"},"vector_backup_table":{"type":"string"},"write_coalesce_wait_time":{"type":"string"}}},"enabled":{"type":"boolean"}}},"enabled":{"type":"boolean"},"env":{"type":"array","items":{"type":"object"}},"externalTrafficPolicy":{"type":"string"},"hpa":{"type":"object","properties":{"enabled":{"type":"boolean"},"targetCPUUtilizationPercentage":{"type":"integer"}}},"image":{"type":"object","properties":{"pullPolicy":{"type":"string","enum":["Always","Never","IfNotPresent"]},"repository":{"type":"string"},"tag":{"type":"string"}}},"initContainers":{"type":"array","items":{"type":"object"}},"kind":{"type":"string","enum":["Deployment","DaemonSet"]},"logging":{"type":"object","properties":{"format":{"type":"string","enum":["raw","json"]},"level":{"type":"string","enum":["debug","info","warn","error","fatal"]},"logger":{"type":"string","enum":["glg","zap"]}}},"maxReplicas":{"type":"integer","minimum":0},"maxUnavailable":{"type":"string"},"minReplicas":{"type":"integer","minimum":0},"mysql":{"type":"object","properties":{"config":{"type":"object","properties":{"conn_max_life_time":{"type":"string"},"db":{"type":"string","enum":["mysql","postgres","sqlite3"]},"host":{"type":"string"},"max_idle_conns":{"type":"integer"},"max_open_conns":{"type":"integer"},"name":{"type":"string"},"pass":{"type":"string"},"port":{"type":"integer"},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"key":{"type":"string"}}},"user":{"type":"string"}}},"enabled":{"type":"boolean"}}},"name":{"type":"string"},"nodeName":{"type":"string"},"nodeSelector":{"type":"object"},"observability":{"type":"object","properties":{"collector":{"type":"object","properties":{"duration":{"type":"string"},"metrics":{"type":"object","properties":{"enable_cgo":{"type":"boolean"},"enable_goroutine":{"type":"boolean"},"enable_memory":{"type":"boolean"},"enable_version_info":{"type":"boolean"},"version_info_labels":{"type":"array","items":{"type":"string","enum":["vald_version","server_name","git_commit","build_time","go_version","go_os","go_arch","cgo_enabled","ngt_version","build_cpu_info_flags"]}}}}}},"enabled":{"type":"boolean"},"jaeger":{"type":"object","properties":{"agent_endpoint":{"type":"string"},"buffer_max_count":{"type":"integer"},"collector_endpoint":{"type":"string"},"enabled":{"type":"boolean"},"password":{"type":"string"},"service_name":{"type":"string"},"username":{"type":"string"}}},"prometheus":{"type":"object","properties":{"enabled":{"type":"boolean"},"endpoint":{"type":"string"},"namespace":{"type":"string"}}},"stackdriver":{"type":"object","properties":{"client":{"type":"object","properties":{"api_key":{"type":"string"},"audiences":{"type":"array","items":{"type":"string"}},"authentication_enabled":{"type":"boolean"},"credentials_file":{"type":"string"},"credentials_json":{"type":"string"},"endpoint":{"type":"string"},"quota_project":{"type":"string"},"request_reason":{"type":"string"},"scopes":{"type":"array","items":{"type":"string"}},"telemetry_enabled":{"type":"boolean"},"user_agent":{"type":"string"}}},"exporter":{"type":"object","properties":{"bundle_count_threshold":{"type":"integer"},"bundle_delay_threshold":{"type":"string"},"location":{"type":"string"},"metric_prefix":{"type":"string"},"monitoring_enabled":{"type":"boolean"},"number_of_workers":{"type":"integer"},"reporting_interval":{"type":"string"},"skip_cmd":{"type":"boolean"},"timeout":{"type":"string"},"trace_spans_buffer_max_bytes":{"type":"integer"},"tracing_enabled":{"type":"boolean"}}},"profiler":{"type":"object","properties":{"alloc_force_gc":{"type":"boolean"},"alloc_profiling":{"type":"boolean"},"api_addr":{"type":"string"},"cpu_profiling":{"type":"boolean"},"debug_logging":{"type":"boolean"},"enabled":{"type":"boolean"},"goroutine_profiling":{"type":"boolean"},"heap_profiling":{"type":"boolean"},"instance":{"type":"string"},"mutex_profiling":{"type":"boolean"},"service":{"type":"string"},"service_version":{"type":"string"},"zone":{"type":"string"}}},"project_id":{"type":"string"}}},"trace":{"type":"object","properties":{"enabled":{"type":"boolean"},"sampling_rate":{"type":"number"}}}}},"podAnnotations":{"type":"object"},"podPriority":{"type":"object","properties":{"enabled":{"type":"boolean"},"value":{"type":"integer"}}},"podSecurityContext":{"type":"object"},"progressDeadlineSeconds":{"type":"integer"},"resources":{"type":"object","properties":{"limits":{"type":"object"},"requests":{"type":"object"}}},"revisionHistoryLimit":{"type":"integer","minimum":0},"rollingUpdate":{"type":"object","properties":{"maxSurge":{"type":"string"},"maxUnavailable":{"type":"string"}}},"securityContext":{"type":"object"},"server_config":{"type":"object","properties":{"full_shutdown_duration":{"type":"string"},"healths":{"type":"object","properties":{"liveness":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"livenessProbe":{"type":"object","properties":{"failureThreshold":{"type":"integer"},"httpGet":{"type":"object","properties":{"path":{"type":"string"},"port":{"type":"string"},"scheme":{"type":"string"}}},"initialDelaySeconds":{"type":"integer"},"periodSeconds":{"type":"integer"},"successThreshold":{"type":"integer"},"timetoutSeconds":{"type":"integer"}}},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}},"readiness":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"readinessProbe":{"type":"object","properties":{"failureThreshold":{"type":"integer"},"httpGet":{"type":"object","properties":{"path":{"type":"string"},"port":{"type":"string"},"scheme":{"type":"string"}}},"initialDelaySeconds":{"type":"integer"},"periodSeconds":{"type":"integer"},"successThreshold":{"type":"integer"},"timeoutSeconds":{"type":"integer"}}},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}}}},"metrics":{"type":"object","properties":{"pprof":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}},"prometheus":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}}}},"servers":{"type":"object","properties":{"grpc":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"grpc":{"type":"object","properties":{"bidirectional_stream_concurrency":{"type":"integer"},"connection_timeout":{"type":"string"},"header_table_size":{"type":"integer"},"initial_conn_window_size":{"type":"integer"},"initial_window_size":{"type":"integer"},"interceptors":{"type":"array","items":{"type":"string","enum":["RecoverInterceptor","AccessLogInterceptor","TracePayloadInterceptor"]}},"keepalive":{"type":"object","properties":{"max_conn_age":{"type":"string"},"max_conn_age_grace":{"type":"string"},"max_conn_idle":{"type":"string"},"time":{"type":"string"},"timeout":{"type":"string"}}},"max_header_list_size":{"type":"integer"},"max_receive_message_size":{"type":"integer"},"max_send_message_size":{"type":"integer"},"read_buffer_size":{"type":"integer"},"write_buffer_size":{"type":"integer"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"},"restart":{"type":"boolean"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}},"rest":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"handler_timeout":{"type":"string"},"http":{"type":"object"},"idle_timeout":{"type":"string"},"mode":{"type":"string"},"probe_wait_time":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"key":{"type":"string"}}}}},"service":{"type":"object","properties":{"annotations":{"type":"object"},"labels":{"type":"object"}}},"serviceType":{"type":"string","enum":["ClusterIP","LoadBalancer","NodePort"]},"terminationGracePeriodSeconds":{"type":"integer","minimum":0},"time_zone":{"type":"string"},"tolerations":{"type":"array","items":{"type":"object"}},"topologySpreadConstraints":{"type":"array","items":{"type":"object"}},"version":{"type":"string","pattern":"^v[0-9]+\\.[0-9]+\\.[0-9]$"},"volumeMounts":{"type":"array","items":{"type":"object"}},"volumes":{"type":"array","items":{"type":"object"}}}},"compressor":{"type":"object","properties":{"affinity":{"type":"object","properties":{"nodeAffinity":{"type":"object","properties":{"preferredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}},"requiredDuringSchedulingIgnoredDuringExecution":{"type":"object","properties":{"nodeSelectorTerms":{"type":"array","items":{"type":"object"}}}}}},"podAffinity":{"type":"object","properties":{"preferredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}},"requiredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}}}},"podAntiAffinity":{"type":"object","properties":{"preferredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}},"requiredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}}}}}},"annotations":{"type":"object"},"backup":{"type":"object","properties":{"client":{"type":"object","properties":{"addrs":{"type":"array","items":{"type":"string"}},"backoff":{"type":"object","properties":{"backoff_factor":{"type":"number"},"backoff_time_limit":{"type":"string"},"enable_error_log":{"type":"boolean"},"initial_duration":{"type":"string"},"jitter_limit":{"type":"string"},"maximum_duration":{"type":"string"},"retry_count":{"type":"integer"}}},"call_option":{"type":"object"},"connection_pool":{"type":"object","properties":{"enable_dns_resolver":{"type":"boolean"},"enable_rebalance":{"type":"boolean"},"old_conn_close_duration":{"type":"string"},"rebalance_duration":{"type":"string"},"size":{"type":"integer"}}},"dial_option":{"type":"object","properties":{"backoff_base_delay":{"type":"string"},"backoff_jitter":{"type":"number"},"backoff_max_delay":{"type":"string"},"backoff_multiplier":{"type":"number"},"enable_backoff":{"type":"boolean"},"initial_connection_window_size":{"type":"integer"},"initial_window_size":{"type":"integer"},"insecure":{"type":"boolean"},"keep_alive":{"type":"object","properties":{"permit_without_stream":{"type":"boolean"},"time":{"type":"string"},"timeout":{"type":"string"}}},"max_msg_size":{"type":"integer"},"min_connection_timeout":{"type":"string"},"read_buffer_size":{"type":"integer"},"tcp":{"type":"object","properties":{"dialer":{"type":"object","properties":{"dual_stack_enabled":{"type":"boolean"},"keep_alive":{"type":"string"},"timeout":{"type":"string"}}},"dns":{"type":"object","properties":{"cache_enabled":{"type":"boolean"},"cache_expiration":{"type":"string"},"refresh_duration":{"type":"string"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"key":{"type":"string"}}}}},"timeout":{"type":"string"},"write_buffer_size":{"type":"integer"}}},"health_check_duration":{"type":"string"},"max_recv_msg_size":{"type":"integer"},"max_retry_rpc_buffer_size":{"type":"integer"},"max_send_msg_size":{"type":"integer"},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"key":{"type":"string"}}},"wait_for_ready":{"type":"boolean"}}}}},"compress":{"type":"object","properties":{"compress_algorithm":{"type":"string","enum":["gob","gzip","lz4","zstd"]},"compression_level":{"type":"integer"},"concurrent_limit":{"type":"integer"},"queue_check_duration":{"type":"string"}}},"enabled":{"type":"boolean"},"env":{"type":"array","items":{"type":"object"}},"externalTrafficPolicy":{"type":"string"},"hpa":{"type":"object","properties":{"enabled":{"type":"boolean"},"targetCPUUtilizationPercentage":{"type":"integer"}}},"image":{"type":"object","properties":{"pullPolicy":{"type":"string","enum":["Always","Never","IfNotPresent"]},"repository":{"type":"string"},"tag":{"type":"string"}}},"initContainers":{"type":"array","items":{"type":"object"}},"kind":{"type":"string","enum":["Deployment","DaemonSet"]},"logging":{"type":"object","properties":{"format":{"type":"string","enum":["raw","json"]},"level":{"type":"string","enum":["debug","info","warn","error","fatal"]},"logger":{"type":"string","enum":["glg","zap"]}}},"maxReplicas":{"type":"integer","minimum":0},"maxUnavailable":{"type":"string"},"minReplicas":{"type":"integer","minimum":0},"name":{"type":"string"},"nodeName":{"type":"string"},"nodeSelector":{"type":"object"},"observability":{"type":"object","properties":{"collector":{"type":"object","properties":{"duration":{"type":"string"},"metrics":{"type":"object","properties":{"enable_cgo":{"type":"boolean"},"enable_goroutine":{"type":"boolean"},"enable_memory":{"type":"boolean"},"enable_version_info":{"type":"boolean"},"version_info_labels":{"type":"array","items":{"type":"string","enum":["vald_version","server_name","git_commit","build_time","go_version","go_os","go_arch","cgo_enabled","ngt_version","build_cpu_info_flags"]}}}}}},"enabled":{"type":"boolean"},"jaeger":{"type":"object","properties":{"agent_endpoint":{"type":"string"},"buffer_max_count":{"type":"integer"},"collector_endpoint":{"type":"string"},"enabled":{"type":"boolean"},"password":{"type":"string"},"service_name":{"type":"string"},"username":{"type":"string"}}},"prometheus":{"type":"object","properties":{"enabled":{"type":"boolean"},"endpoint":{"type":"string"},"namespace":{"type":"string"}}},"stackdriver":{"type":"object","properties":{"client":{"type":"object","properties":{"api_key":{"type":"string"},"audiences":{"type":"array","items":{"type":"string"}},"authentication_enabled":{"type":"boolean"},"credentials_file":{"type":"string"},"credentials_json":{"type":"string"},"endpoint":{"type":"string"},"quota_project":{"type":"string"},"request_reason":{"type":"string"},"scopes":{"type":"array","items":{"type":"string"}},"telemetry_enabled":{"type":"boolean"},"user_agent":{"type":"string"}}},"exporter":{"type":"object","properties":{"bundle_count_threshold":{"type":"integer"},"bundle_delay_threshold":{"type":"string"},"location":{"type":"string"},"metric_prefix":{"type":"string"},"monitoring_enabled":{"type":"boolean"},"number_of_workers":{"type":"integer"},"reporting_interval":{"type":"string"},"skip_cmd":{"type":"boolean"},"timeout":{"type":"string"},"trace_spans_buffer_max_bytes":{"type":"integer"},"tracing_enabled":{"type":"boolean"}}},"profiler":{"type":"object","properties":{"alloc_force_gc":{"type":"boolean"},"alloc_profiling":{"type":"boolean"},"api_addr":{"type":"string"},"cpu_profiling":{"type":"boolean"},"debug_logging":{"type":"boolean"},"enabled":{"type":"boolean"},"goroutine_profiling":{"type":"boolean"},"heap_profiling":{"type":"boolean"},"instance":{"type":"string"},"mutex_profiling":{"type":"boolean"},"service":{"type":"string"},"service_version":{"type":"string"},"zone":{"type":"string"}}},"project_id":{"type":"string"}}},"trace":{"type":"object","properties":{"enabled":{"type":"boolean"},"sampling_rate":{"type":"number"}}}}},"podAnnotations":{"type":"object"},"podPriority":{"type":"object","properties":{"enabled":{"type":"boolean"},"value":{"type":"integer"}}},"podSecurityContext":{"type":"object"},"progressDeadlineSeconds":{"type":"integer"},"registerer":{"type":"object","properties":{"compressor":{"type":"object","properties":{"client":{"type":"object","properties":{"addrs":{"type":"array","items":{"type":"string"}},"backoff":{"type":"object","properties":{"backoff_factor":{"type":"number"},"backoff_time_limit":{"type":"string"},"enable_error_log":{"type":"boolean"},"initial_duration":{"type":"string"},"jitter_limit":{"type":"string"},"maximum_duration":{"type":"string"},"retry_count":{"type":"integer"}}},"call_option":{"type":"object"},"connection_pool":{"type":"object","properties":{"enable_dns_resolver":{"type":"boolean"},"enable_rebalance":{"type":"boolean"},"old_conn_close_duration":{"type":"string"},"rebalance_duration":{"type":"string"},"size":{"type":"integer"}}},"dial_option":{"type":"object","properties":{"backoff_base_delay":{"type":"string"},"backoff_jitter":{"type":"number"},"backoff_max_delay":{"type":"string"},"backoff_multiplier":{"type":"number"},"enable_backoff":{"type":"boolean"},"initial_connection_window_size":{"type":"integer"},"initial_window_size":{"type":"integer"},"insecure":{"type":"boolean"},"keep_alive":{"type":"object","properties":{"permit_without_stream":{"type":"boolean"},"time":{"type":"string"},"timeout":{"type":"string"}}},"max_msg_size":{"type":"integer"},"min_connection_timeout":{"type":"string"},"read_buffer_size":{"type":"integer"},"tcp":{"type":"object","properties":{"dialer":{"type":"object","properties":{"dual_stack_enabled":{"type":"boolean"},"keep_alive":{"type":"string"},"timeout":{"type":"string"}}},"dns":{"type":"object","properties":{"cache_enabled":{"type":"boolean"},"cache_expiration":{"type":"string"},"refresh_duration":{"type":"string"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"key":{"type":"string"}}}}},"timeout":{"type":"string"},"write_buffer_size":{"type":"integer"}}},"health_check_duration":{"type":"string"},"max_recv_msg_size":{"type":"integer"},"max_retry_rpc_buffer_size":{"type":"integer"},"max_send_msg_size":{"type":"integer"},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"key":{"type":"string"}}},"wait_for_ready":{"type":"boolean"}}}}},"concurrent_limit":{"type":"integer"},"queue_check_duration":{"type":"string"}}},"resources":{"type":"object","properties":{"limits":{"type":"object"},"requests":{"type":"object"}}},"revisionHistoryLimit":{"type":"integer","minimum":0},"rollingUpdate":{"type":"object","properties":{"maxSurge":{"type":"string"},"maxUnavailable":{"type":"string"}}},"securityContext":{"type":"object"},"server_config":{"type":"object","properties":{"full_shutdown_duration":{"type":"string"},"healths":{"type":"object","properties":{"liveness":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"livenessProbe":{"type":"object","properties":{"failureThreshold":{"type":"integer"},"httpGet":{"type":"object","properties":{"path":{"type":"string"},"port":{"type":"string"},"scheme":{"type":"string"}}},"initialDelaySeconds":{"type":"integer"},"periodSeconds":{"type":"integer"},"successThreshold":{"type":"integer"},"timetoutSeconds":{"type":"integer"}}},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}},"readiness":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"readinessProbe":{"type":"object","properties":{"failureThreshold":{"type":"integer"},"httpGet":{"type":"object","properties":{"path":{"type":"string"},"port":{"type":"string"},"scheme":{"type":"string"}}},"initialDelaySeconds":{"type":"integer"},"periodSeconds":{"type":"integer"},"successThreshold":{"type":"integer"},"timeoutSeconds":{"type":"integer"}}},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}}}},"metrics":{"type":"object","properties":{"pprof":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}},"prometheus":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}}}},"servers":{"type":"object","properties":{"grpc":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"grpc":{"type":"object","properties":{"bidirectional_stream_concurrency":{"type":"integer"},"connection_timeout":{"type":"string"},"header_table_size":{"type":"integer"},"initial_conn_window_size":{"type":"integer"},"initial_window_size":{"type":"integer"},"interceptors":{"type":"array","items":{"type":"string","enum":["RecoverInterceptor","AccessLogInterceptor","TracePayloadInterceptor"]}},"keepalive":{"type":"object","properties":{"max_conn_age":{"type":"string"},"max_conn_age_grace":{"type":"string"},"max_conn_idle":{"type":"string"},"time":{"type":"string"},"timeout":{"type":"string"}}},"max_header_list_size":{"type":"integer"},"max_receive_message_size":{"type":"integer"},"max_send_message_size":{"type":"integer"},"read_buffer_size":{"type":"integer"},"write_buffer_size":{"type":"integer"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"},"restart":{"type":"boolean"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}},"rest":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"handler_timeout":{"type":"string"},"http":{"type":"object"},"idle_timeout":{"type":"string"},"mode":{"type":"string"},"probe_wait_time":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"key":{"type":"string"}}}}},"service":{"type":"object","properties":{"annotations":{"type":"object"},"labels":{"type":"object"}}},"serviceType":{"type":"string","enum":["ClusterIP","LoadBalancer","NodePort"]},"terminationGracePeriodSeconds":{"type":"integer","minimum":0},"time_zone":{"type":"string"},"tolerations":{"type":"array","items":{"type":"object"}},"topologySpreadConstraints":{"type":"array","items":{"type":"object"}},"version":{"type":"string","pattern":"^v[0-9]+\\.[0-9]+\\.[0-9]$"},"volumeMounts":{"type":"array","items":{"type":"object"}},"volumes":{"type":"array","items":{"type":"object"}}}},"index":{"type":"object","properties":{"affinity":{"type":"object","properties":{"nodeAffinity":{"type":"object","properties":{"preferredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}},"requiredDuringSchedulingIgnoredDuringExecution":{"type":"object","properties":{"nodeSelectorTerms":{"type":"array","items":{"type":"object"}}}}}},"podAffinity":{"type":"object","properties":{"preferredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}},"requiredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}}}},"podAntiAffinity":{"type":"object","properties":{"preferredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}},"requiredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}}}}}},"annotations":{"type":"object"},"enabled":{"type":"boolean"},"env":{"type":"array","items":{"type":"object"}},"externalTrafficPolicy":{"type":"string"},"image":{"type":"object","properties":{"pullPolicy":{"type":"string","enum":["Always","Never","IfNotPresent"]},"repository":{"type":"string"},"tag":{"type":"string"}}},"indexer":{"type":"object","properties":{"agent_namespace":{"type":"string"},"auto_index_check_duration":{"type":"string"},"auto_index_duration_limit":{"type":"string"},"auto_index_length":{"type":"integer"},"concurrency":{"type":"integer","minimum":1},"creation_pool_size":{"type":"integer"},"discoverer":{"type":"object","properties":{"agent_client_options":{"type":"object","properties":{"addrs":{"type":"array","items":{"type":"string"}},"backoff":{"type":"object","properties":{"backoff_factor":{"type":"number"},"backoff_time_limit":{"type":"string"},"enable_error_log":{"type":"boolean"},"initial_duration":{"type":"string"},"jitter_limit":{"type":"string"},"maximum_duration":{"type":"string"},"retry_count":{"type":"integer"}}},"call_option":{"type":"object"},"connection_pool":{"type":"object","properties":{"enable_dns_resolver":{"type":"boolean"},"enable_rebalance":{"type":"boolean"},"old_conn_close_duration":{"type":"string"},"rebalance_duration":{"type":"string"},"size":{"type":"integer"}}},"dial_option":{"type":"object","properties":{"backoff_base_delay":{"type":"string"},"backoff_jitter":{"type":"number"},"backoff_max_delay":{"type":"string"},"backoff_multiplier":{"type":"number"},"enable_backoff":{"type":"boolean"},"initial_connection_window_size":{"type":"integer"},"initial_window_size":{"type":"integer"},"insecure":{"type":"boolean"},"keep_alive":{"type":"object","properties":{"permit_without_stream":{"type":"boolean"},"time":{"type":"string"},"timeout":{"type":"string"}}},"max_msg_size":{"type":"integer"},"min_connection_timeout":{"type":"string"},"read_buffer_size":{"type":"integer"},"tcp":{"type":"object","properties":{"dialer":{"type":"object","properties":{"dual_stack_enabled":{"type":"boolean"},"keep_alive":{"type":"string"},"timeout":{"type":"string"}}},"dns":{"type":"object","properties":{"cache_enabled":{"type":"boolean"},"cache_expiration":{"type":"string"},"refresh_duration":{"type":"string"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"key":{"type":"string"}}}}},"timeout":{"type":"string"},"write_buffer_size":{"type":"integer"}}},"health_check_duration":{"type":"string"},"max_recv_msg_size":{"type":"integer"},"max_retry_rpc_buffer_size":{"type":"integer"},"max_send_msg_size":{"type":"integer"},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"key":{"type":"string"}}},"wait_for_ready":{"type":"boolean"}}},"client":{"type":"object","properties":{"addrs":{"type":"array","items":{"type":"string"}},"backoff":{"type":"object","properties":{"backoff_factor":{"type":"number"},"backoff_time_limit":{"type":"string"},"enable_error_log":{"type":"boolean"},"initial_duration":{"type":"string"},"jitter_limit":{"type":"string"},"maximum_duration":{"type":"string"},"retry_count":{"type":"integer"}}},"call_option":{"type":"object"},"connection_pool":{"type":"object","properties":{"enable_dns_resolver":{"type":"boolean"},"enable_rebalance":{"type":"boolean"},"old_conn_close_duration":{"type":"string"},"rebalance_duration":{"type":"string"},"size":{"type":"integer"}}},"dial_option":{"type":"object","properties":{"backoff_base_delay":{"type":"string"},"backoff_jitter":{"type":"number"},"backoff_max_delay":{"type":"string"},"backoff_multiplier":{"type":"number"},"enable_backoff":{"type":"boolean"},"initial_connection_window_size":{"type":"integer"},"initial_window_size":{"type":"integer"},"insecure":{"type":"boolean"},"keep_alive":{"type":"object","properties":{"permit_without_stream":{"type":"boolean"},"time":{"type":"string"},"timeout":{"type":"string"}}},"max_msg_size":{"type":"integer"},"min_connection_timeout":{"type":"string"},"read_buffer_size":{"type":"integer"},"tcp":{"type":"object","properties":{"dialer":{"type":"object","properties":{"dual_stack_enabled":{"type":"boolean"},"keep_alive":{"type":"string"},"timeout":{"type":"string"}}},"dns":{"type":"object","properties":{"cache_enabled":{"type":"boolean"},"cache_expiration":{"type":"string"},"refresh_duration":{"type":"string"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"key":{"type":"string"}}}}},"timeout":{"type":"string"},"write_buffer_size":{"type":"integer"}}},"health_check_duration":{"type":"string"},"max_recv_msg_size":{"type":"integer"},"max_retry_rpc_buffer_size":{"type":"integer"},"max_send_msg_size":{"type":"integer"},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"key":{"type":"string"}}},"wait_for_ready":{"type":"boolean"}}},"duration":{"type":"string"}}},"node_name":{"type":"string"}}},"initContainers":{"type":"array","items":{"type":"object"}},"kind":{"type":"string","enum":["Deployment","DaemonSet"]},"logging":{"type":"object","properties":{"format":{"type":"string","enum":["raw","json"]},"level":{"type":"string","enum":["debug","info","warn","error","fatal"]},"logger":{"type":"string","enum":["glg","zap"]}}},"maxUnavailable":{"type":"string"},"name":{"type":"string"},"nodeName":{"type":"string"},"nodeSelector":{"type":"object"},"observability":{"type":"object","properties":{"collector":{"type":"object","properties":{"duration":{"type":"string"},"metrics":{"type":"object","properties":{"enable_cgo":{"type":"boolean"},"enable_goroutine":{"type":"boolean"},"enable_memory":{"type":"boolean"},"enable_version_info":{"type":"boolean"},"version_info_labels":{"type":"array","items":{"type":"string","enum":["vald_version","server_name","git_commit","build_time","go_version","go_os","go_arch","cgo_enabled","ngt_version","build_cpu_info_flags"]}}}}}},"enabled":{"type":"boolean"},"jaeger":{"type":"object","properties":{"agent_endpoint":{"type":"string"},"buffer_max_count":{"type":"integer"},"collector_endpoint":{"type":"string"},"enabled":{"type":"boolean"},"password":{"type":"string"},"service_name":{"type":"string"},"username":{"type":"string"}}},"prometheus":{"type":"object","properties":{"enabled":{"type":"boolean"},"endpoint":{"type":"string"},"namespace":{"type":"string"}}},"stackdriver":{"type":"object","properties":{"client":{"type":"object","properties":{"api_key":{"type":"string"},"audiences":{"type":"array","items":{"type":"string"}},"authentication_enabled":{"type":"boolean"},"credentials_file":{"type":"string"},"credentials_json":{"type":"string"},"endpoint":{"type":"string"},"quota_project":{"type":"string"},"request_reason":{"type":"string"},"scopes":{"type":"array","items":{"type":"string"}},"telemetry_enabled":{"type":"boolean"},"user_agent":{"type":"string"}}},"exporter":{"type":"object","properties":{"bundle_count_threshold":{"type":"integer"},"bundle_delay_threshold":{"type":"string"},"location":{"type":"string"},"metric_prefix":{"type":"string"},"monitoring_enabled":{"type":"boolean"},"number_of_workers":{"type":"integer"},"reporting_interval":{"type":"string"},"skip_cmd":{"type":"boolean"},"timeout":{"type":"string"},"trace_spans_buffer_max_bytes":{"type":"integer"},"tracing_enabled":{"type":"boolean"}}},"profiler":{"type":"object","properties":{"alloc_force_gc":{"type":"boolean"},"alloc_profiling":{"type":"boolean"},"api_addr":{"type":"string"},"cpu_profiling":{"type":"boolean"},"debug_logging":{"type":"boolean"},"enabled":{"type":"boolean"},"goroutine_profiling":{"type":"boolean"},"heap_profiling":{"type":"boolean"},"instance":{"type":"string"},"mutex_profiling":{"type":"boolean"},"service":{"type":"string"},"service_version":{"type":"string"},"zone":{"type":"string"}}},"project_id":{"type":"string"}}},"trace":{"type":"object","properties":{"enabled":{"type":"boolean"},"sampling_rate":{"type":"number"}}}}},"podAnnotations":{"type":"object"},"podPriority":{"type":"object","properties":{"enabled":{"type":"boolean"},"value":{"type":"integer"}}},"progressDeadlineSeconds":{"type":"integer"},"replicas":{"type":"integer","minimum":0},"resources":{"type":"object","properties":{"limits":{"type":"object"},"requests":{"type":"object"}}},"revisionHistoryLimit":{"type":"integer","minimum":0},"rollingUpdate":{"type":"object","properties":{"maxSurge":{"type":"string"},"maxUnavailable":{"type":"string"}}},"securityContext":{"type":"object"},"server_config":{"type":"object","properties":{"full_shutdown_duration":{"type":"string"},"healths":{"type":"object","properties":{"liveness":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"livenessProbe":{"type":"object","properties":{"failureThreshold":{"type":"integer"},"httpGet":{"type":"object","properties":{"path":{"type":"string"},"port":{"type":"string"},"scheme":{"type":"string"}}},"initialDelaySeconds":{"type":"integer"},"periodSeconds":{"type":"integer"},"successThreshold":{"type":"integer"},"timetoutSeconds":{"type":"integer"}}},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}},"readiness":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"readinessProbe":{"type":"object","properties":{"failureThreshold":{"type":"integer"},"httpGet":{"type":"object","properties":{"path":{"type":"string"},"port":{"type":"string"},"scheme":{"type":"string"}}},"initialDelaySeconds":{"type":"integer"},"periodSeconds":{"type":"integer"},"successThreshold":{"type":"integer"},"timeoutSeconds":{"type":"integer"}}},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}}}},"metrics":{"type":"object","properties":{"pprof":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}},"prometheus":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}}}},"servers":{"type":"object","properties":{"grpc":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"grpc":{"type":"object","properties":{"bidirectional_stream_concurrency":{"type":"integer"},"connection_timeout":{"type":"string"},"header_table_size":{"type":"integer"},"initial_conn_window_size":{"type":"integer"},"initial_window_size":{"type":"integer"},"interceptors":{"type":"array","items":{"type":"string","enum":["RecoverInterceptor","AccessLogInterceptor","TracePayloadInterceptor"]}},"keepalive":{"type":"object","properties":{"max_conn_age":{"type":"string"},"max_conn_age_grace":{"type":"string"},"max_conn_idle":{"type":"string"},"time":{"type":"string"},"timeout":{"type":"string"}}},"max_header_list_size":{"type":"integer"},"max_receive_message_size":{"type":"integer"},"max_send_message_size":{"type":"integer"},"read_buffer_size":{"type":"integer"},"write_buffer_size":{"type":"integer"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"},"restart":{"type":"boolean"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}},"rest":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"handler_timeout":{"type":"string"},"http":{"type":"object"},"idle_timeout":{"type":"string"},"mode":{"type":"string"},"probe_wait_time":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"key":{"type":"string"}}}}},"service":{"type":"object","properties":{"annotations":{"type":"object"},"labels":{"type":"object"}}},"serviceType":{"type":"string","enum":["ClusterIP","LoadBalancer","NodePort"]},"terminationGracePeriodSeconds":{"type":"integer","minimum":0},"time_zone":{"type":"string"},"tolerations":{"type":"array","items":{"type":"object"}},"topologySpreadConstraints":{"type":"array","items":{"type":"object"}},"version":{"type":"string","pattern":"^v[0-9]+\\.[0-9]+\\.[0-9]$"},"volumeMounts":{"type":"array","items":{"type":"object"}},"volumes":{"type":"array","items":{"type":"object"}}}}}},"mangaer":{"type":"object"},"meta":{"type":"object","properties":{"affinity":{"type":"object","properties":{"nodeAffinity":{"type":"object","properties":{"preferredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}},"requiredDuringSchedulingIgnoredDuringExecution":{"type":"object","properties":{"nodeSelectorTerms":{"type":"array","items":{"type":"object"}}}}}},"podAffinity":{"type":"object","properties":{"preferredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}},"requiredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}}}},"podAntiAffinity":{"type":"object","properties":{"preferredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}},"requiredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}}}}}},"annotations":{"type":"object"},"cassandra":{"type":"object","properties":{"config":{"type":"object","properties":{"connect_timeout":{"type":"string"},"consistency":{"type":"string","enum":["any","one","two","three","all","quorum","localquorum","eachquorum","localone"]},"cql_version":{"type":"string"},"default_idempotence":{"type":"boolean"},"default_timestamp":{"type":"boolean"},"disable_initial_host_lookup":{"type":"boolean"},"disable_node_status_events":{"type":"boolean"},"disable_skip_metadata":{"type":"boolean"},"disable_topology_events":{"type":"boolean"},"enable_host_verification":{"type":"boolean"},"host_filter":{"type":"object","properties":{"data_center":{"type":"string"},"enabled":{"type":"boolean"},"white_list":{"type":"array","items":{"type":"string"}}}},"hosts":{"type":"array","items":{"type":"string"}},"ignore_peer_addr":{"type":"boolean"},"keyspace":{"type":"string"},"max_prepared_stmts":{"type":"integer"},"max_routing_key_info":{"type":"integer"},"max_wait_schema_agreement":{"type":"string"},"num_conns":{"type":"integer"},"page_size":{"type":"integer"},"password":{"type":"string"},"pool_config":{"type":"object","properties":{"data_center":{"type":"string"},"dc_aware_routing":{"type":"boolean"},"non_local_replicas_fallback":{"type":"boolean"},"shuffle_replicas":{"type":"boolean"},"token_aware_host_policy":{"type":"boolean"}}},"port":{"type":"integer"},"proto_version":{"type":"integer"},"reconnect_interval":{"type":"string"},"reconnection_policy":{"type":"object","properties":{"initial_interval":{"type":"string"},"max_retries":{"type":"integer"}}},"retry_policy":{"type":"object","properties":{"max_duration":{"type":"string"},"min_duration":{"type":"string"},"num_retries":{"type":"integer"}}},"serial_consistency":{"type":"string","enum":["localserial","serial"]},"socket_keepalive":{"type":"string"},"tcp":{"type":"object","properties":{"dialer":{"type":"object","properties":{"dual_stack_enabled":{"type":"boolean"},"keep_alive":{"type":"string"},"timeout":{"type":"string"}}},"dns":{"type":"object","properties":{"cache_enabled":{"type":"boolean"},"cache_expiration":{"type":"string"},"refresh_duration":{"type":"string"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"key":{"type":"string"}}}}},"timeout":{"type":"string"},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"key":{"type":"string"}}},"username":{"type":"string"},"vector_backup_table":{"type":"string"},"write_coalesce_wait_time":{"type":"string"}}},"enabled":{"type":"boolean"}}},"enabled":{"type":"boolean"},"env":{"type":"array","items":{"type":"object"}},"externalTrafficPolicy":{"type":"string"},"hpa":{"type":"object","properties":{"enabled":{"type":"boolean"},"targetCPUUtilizationPercentage":{"type":"integer"}}},"image":{"type":"object","properties":{"pullPolicy":{"type":"string","enum":["Always","Never","IfNotPresent"]},"repository":{"type":"string"},"tag":{"type":"string"}}},"initContainers":{"type":"array","items":{"type":"object"}},"kind":{"type":"string","enum":["Deployment","DaemonSet"]},"logging":{"type":"object","properties":{"format":{"type":"string","enum":["raw","json"]},"level":{"type":"string","enum":["debug","info","warn","error","fatal"]},"logger":{"type":"string","enum":["glg","zap"]}}},"maxReplicas":{"type":"integer","minimum":0},"maxUnavailable":{"type":"string"},"minReplicas":{"type":"integer","minimum":0},"name":{"type":"string"},"nodeName":{"type":"string"},"nodeSelector":{"type":"object"},"observability":{"type":"object","properties":{"collector":{"type":"object","properties":{"duration":{"type":"string"},"metrics":{"type":"object","properties":{"enable_cgo":{"type":"boolean"},"enable_goroutine":{"type":"boolean"},"enable_memory":{"type":"boolean"},"enable_version_info":{"type":"boolean"},"version_info_labels":{"type":"array","items":{"type":"string","enum":["vald_version","server_name","git_commit","build_time","go_version","go_os","go_arch","cgo_enabled","ngt_version","build_cpu_info_flags"]}}}}}},"enabled":{"type":"boolean"},"jaeger":{"type":"object","properties":{"agent_endpoint":{"type":"string"},"buffer_max_count":{"type":"integer"},"collector_endpoint":{"type":"string"},"enabled":{"type":"boolean"},"password":{"type":"string"},"service_name":{"type":"string"},"username":{"type":"string"}}},"prometheus":{"type":"object","properties":{"enabled":{"type":"boolean"},"endpoint":{"type":"string"},"namespace":{"type":"string"}}},"stackdriver":{"type":"object","properties":{"client":{"type":"object","properties":{"api_key":{"type":"string"},"audiences":{"type":"array","items":{"type":"string"}},"authentication_enabled":{"type":"boolean"},"credentials_file":{"type":"string"},"credentials_json":{"type":"string"},"endpoint":{"type":"string"},"quota_project":{"type":"string"},"request_reason":{"type":"string"},"scopes":{"type":"array","items":{"type":"string"}},"telemetry_enabled":{"type":"boolean"},"user_agent":{"type":"string"}}},"exporter":{"type":"object","properties":{"bundle_count_threshold":{"type":"integer"},"bundle_delay_threshold":{"type":"string"},"location":{"type":"string"},"metric_prefix":{"type":"string"},"monitoring_enabled":{"type":"boolean"},"number_of_workers":{"type":"integer"},"reporting_interval":{"type":"string"},"skip_cmd":{"type":"boolean"},"timeout":{"type":"string"},"trace_spans_buffer_max_bytes":{"type":"integer"},"tracing_enabled":{"type":"boolean"}}},"profiler":{"type":"object","properties":{"alloc_force_gc":{"type":"boolean"},"alloc_profiling":{"type":"boolean"},"api_addr":{"type":"string"},"cpu_profiling":{"type":"boolean"},"debug_logging":{"type":"boolean"},"enabled":{"type":"boolean"},"goroutine_profiling":{"type":"boolean"},"heap_profiling":{"type":"boolean"},"instance":{"type":"string"},"mutex_profiling":{"type":"boolean"},"service":{"type":"string"},"service_version":{"type":"string"},"zone":{"type":"string"}}},"project_id":{"type":"string"}}},"trace":{"type":"object","properties":{"enabled":{"type":"boolean"},"sampling_rate":{"type":"number"}}}}},"podAnnotations":{"type":"object"},"podPriority":{"type":"object","properties":{"enabled":{"type":"boolean"},"value":{"type":"integer"}}},"podSecurityContext":{"type":"object"},"progressDeadlineSeconds":{"type":"integer"},"redis":{"type":"object","properties":{"config":{"type":"object","properties":{"addrs":{"type":"array","items":{"type":"string"}},"db":{"type":"integer"},"dial_timeout":{"type":"string"},"idle_check_frequency":{"type":"string"},"idle_timeout":{"type":"string"},"key_pref":{"type":"string"},"kv_prefix":{"type":"string"},"max_conn_age":{"type":"string"},"max_redirects":{"type":"integer"},"max_retries":{"type":"integer"},"max_retry_backoff":{"type":"string"},"min_idle_conns":{"type":"integer"},"min_retry_backoff":{"type":"string"},"network":{"type":"string"},"password":{"type":"string"},"pool_size":{"type":"integer"},"pool_timeout":{"type":"string"},"prefix_delimiter":{"type":"string"},"read_only":{"type":"boolean"},"read_timeout":{"type":"string"},"route_by_latency":{"type":"boolean"},"route_randomly":{"type":"boolean"},"sentinel_master_name":{"type":"string"},"sentinel_password":{"type":"string"},"tcp":{"type":"object","properties":{"dialer":{"type":"object","properties":{"dual_stack_enabled":{"type":"boolean"},"keep_alive":{"type":"string"},"timeout":{"type":"string"}}},"dns":{"type":"object","properties":{"cache_enabled":{"type":"boolean"},"cache_expiration":{"type":"string"},"refresh_duration":{"type":"string"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"key":{"type":"string"}}}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"key":{"type":"string"}}},"vk_prefix":{"type":"string"},"write_timeout":{"type":"string"}}},"enabled":{"type":"boolean"}}},"resources":{"type":"object","properties":{"limits":{"type":"object"},"requests":{"type":"object"}}},"revisionHistoryLimit":{"type":"integer","minimum":0},"rollingUpdate":{"type":"object","properties":{"maxSurge":{"type":"string"},"maxUnavailable":{"type":"string"}}},"securityContext":{"type":"object"},"server_config":{"type":"object","properties":{"full_shutdown_duration":{"type":"string"},"healths":{"type":"object","properties":{"liveness":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"livenessProbe":{"type":"object","properties":{"failureThreshold":{"type":"integer"},"httpGet":{"type":"object","properties":{"path":{"type":"string"},"port":{"type":"string"},"scheme":{"type":"string"}}},"initialDelaySeconds":{"type":"integer"},"periodSeconds":{"type":"integer"},"successThreshold":{"type":"integer"},"timetoutSeconds":{"type":"integer"}}},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}},"readiness":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"readinessProbe":{"type":"object","properties":{"failureThreshold":{"type":"integer"},"httpGet":{"type":"object","properties":{"path":{"type":"string"},"port":{"type":"string"},"scheme":{"type":"string"}}},"initialDelaySeconds":{"type":"integer"},"periodSeconds":{"type":"integer"},"successThreshold":{"type":"integer"},"timeoutSeconds":{"type":"integer"}}},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}}}},"metrics":{"type":"object","properties":{"pprof":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}},"prometheus":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}}}},"servers":{"type":"object","properties":{"grpc":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"grpc":{"type":"object","properties":{"bidirectional_stream_concurrency":{"type":"integer"},"connection_timeout":{"type":"string"},"header_table_size":{"type":"integer"},"initial_conn_window_size":{"type":"integer"},"initial_window_size":{"type":"integer"},"interceptors":{"type":"array","items":{"type":"string","enum":["RecoverInterceptor","AccessLogInterceptor","TracePayloadInterceptor"]}},"keepalive":{"type":"object","properties":{"max_conn_age":{"type":"string"},"max_conn_age_grace":{"type":"string"},"max_conn_idle":{"type":"string"},"time":{"type":"string"},"timeout":{"type":"string"}}},"max_header_list_size":{"type":"integer"},"max_receive_message_size":{"type":"integer"},"max_send_message_size":{"type":"integer"},"read_buffer_size":{"type":"integer"},"write_buffer_size":{"type":"integer"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"},"restart":{"type":"boolean"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}},"rest":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"handler_timeout":{"type":"string"},"http":{"type":"object"},"idle_timeout":{"type":"string"},"mode":{"type":"string"},"probe_wait_time":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"key":{"type":"string"}}}}},"service":{"type":"object","properties":{"annotations":{"type":"object"},"labels":{"type":"object"}}},"serviceType":{"type":"string","enum":["ClusterIP","LoadBalancer","NodePort"]},"terminationGracePeriodSeconds":{"type":"integer","minimum":0},"time_zone":{"type":"string"},"tolerations":{"type":"array","items":{"type":"object"}},"topologySpreadConstraints":{"type":"array","items":{"type":"object"}},"version":{"type":"string","pattern":"^v[0-9]+\\.[0-9]+\\.[0-9]$"},"volumeMounts":{"type":"array","items":{"type":"object"}},"volumes":{"type":"array","items":{"type":"object"}}}}}} +{"$schema":"http://json-schema.org/draft-07/schema#","title":"Values","type":"object","properties":{"agent":{"type":"object","properties":{"affinity":{"type":"object","properties":{"nodeAffinity":{"type":"object","properties":{"preferredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}},"requiredDuringSchedulingIgnoredDuringExecution":{"type":"object","properties":{"nodeSelectorTerms":{"type":"array","items":{"type":"object"}}}}}},"podAffinity":{"type":"object","properties":{"preferredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}},"requiredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}}}},"podAntiAffinity":{"type":"object","properties":{"preferredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}},"requiredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}}}}}},"annotations":{"type":"object"},"enabled":{"type":"boolean"},"env":{"type":"array","items":{"type":"object"}},"externalTrafficPolicy":{"type":"string"},"hpa":{"type":"object","properties":{"enabled":{"type":"boolean"},"targetCPUUtilizationPercentage":{"type":"integer"}}},"image":{"type":"object","properties":{"pullPolicy":{"type":"string","enum":["Always","Never","IfNotPresent"]},"repository":{"type":"string"},"tag":{"type":"string"}}},"initContainers":{"type":"array","items":{"type":"object"}},"kind":{"type":"string","enum":["StatefulSet","Deployment","DaemonSet"]},"logging":{"type":"object","properties":{"format":{"type":"string","enum":["raw","json"]},"level":{"type":"string","enum":["debug","info","warn","error","fatal"]},"logger":{"type":"string","enum":["glg","zap"]}}},"maxReplicas":{"type":"integer","minimum":0},"maxUnavailable":{"type":"string"},"minReplicas":{"type":"integer","minimum":0},"name":{"type":"string"},"ngt":{"type":"object","properties":{"auto_create_index_pool_size":{"type":"integer"},"auto_index_check_duration":{"type":"string"},"auto_index_duration_limit":{"type":"string"},"auto_index_length":{"type":"integer"},"auto_save_index_duration":{"type":"string"},"bulk_insert_chunk_size":{"type":"integer"},"creation_edge_size":{"type":"integer"},"default_epsilon":{"type":"number"},"default_pool_size":{"type":"integer"},"default_radius":{"type":"number"},"dimension":{"type":"integer","minimum":1},"distance_type":{"type":"string","enum":["l1","l2","angle","hamming","cos","cosine","normalizedangle","normalizedcosine","jaccard"]},"enable_in_memory_mode":{"type":"boolean"},"enable_proactive_gc":{"type":"boolean"},"index_path":{"type":"string"},"initial_delay_max_duration":{"type":"string"},"load_index_timeout_factor":{"type":"string"},"max_load_index_timeout":{"type":"string"},"min_load_index_timeout":{"type":"string"},"object_type":{"type":"string","enum":["float","uint8"]},"search_edge_size":{"type":"integer"}}},"nodeName":{"type":"string"},"nodeSelector":{"type":"object"},"observability":{"type":"object","properties":{"collector":{"type":"object","properties":{"duration":{"type":"string"},"metrics":{"type":"object","properties":{"enable_cgo":{"type":"boolean"},"enable_goroutine":{"type":"boolean"},"enable_memory":{"type":"boolean"},"enable_version_info":{"type":"boolean"},"version_info_labels":{"type":"array","items":{"type":"string","enum":["vald_version","server_name","git_commit","build_time","go_version","go_os","go_arch","cgo_enabled","ngt_version","build_cpu_info_flags"]}}}}}},"enabled":{"type":"boolean"},"jaeger":{"type":"object","properties":{"agent_endpoint":{"type":"string"},"buffer_max_count":{"type":"integer"},"collector_endpoint":{"type":"string"},"enabled":{"type":"boolean"},"password":{"type":"string"},"service_name":{"type":"string"},"username":{"type":"string"}}},"prometheus":{"type":"object","properties":{"enabled":{"type":"boolean"},"endpoint":{"type":"string"},"namespace":{"type":"string"}}},"stackdriver":{"type":"object","properties":{"client":{"type":"object","properties":{"api_key":{"type":"string"},"audiences":{"type":"array","items":{"type":"string"}},"authentication_enabled":{"type":"boolean"},"credentials_file":{"type":"string"},"credentials_json":{"type":"string"},"endpoint":{"type":"string"},"quota_project":{"type":"string"},"request_reason":{"type":"string"},"scopes":{"type":"array","items":{"type":"string"}},"telemetry_enabled":{"type":"boolean"},"user_agent":{"type":"string"}}},"exporter":{"type":"object","properties":{"bundle_count_threshold":{"type":"integer"},"bundle_delay_threshold":{"type":"string"},"location":{"type":"string"},"metric_prefix":{"type":"string"},"monitoring_enabled":{"type":"boolean"},"number_of_workers":{"type":"integer"},"reporting_interval":{"type":"string"},"skip_cmd":{"type":"boolean"},"timeout":{"type":"string"},"trace_spans_buffer_max_bytes":{"type":"integer"},"tracing_enabled":{"type":"boolean"}}},"profiler":{"type":"object","properties":{"alloc_force_gc":{"type":"boolean"},"alloc_profiling":{"type":"boolean"},"api_addr":{"type":"string"},"cpu_profiling":{"type":"boolean"},"debug_logging":{"type":"boolean"},"enabled":{"type":"boolean"},"goroutine_profiling":{"type":"boolean"},"heap_profiling":{"type":"boolean"},"instance":{"type":"string"},"mutex_profiling":{"type":"boolean"},"service":{"type":"string"},"service_version":{"type":"string"},"zone":{"type":"string"}}},"project_id":{"type":"string"}}},"trace":{"type":"object","properties":{"enabled":{"type":"boolean"},"sampling_rate":{"type":"number"}}}}},"persistentVolume":{"type":"object","properties":{"accessMode":{"type":"string"},"enabled":{"type":"boolean"},"size":{"type":"string"},"storageClass":{"type":"string"}}},"podAnnotations":{"type":"object"},"podManagementPolicy":{"type":"string","enum":["OrderedReady","Parallel"]},"podPriority":{"type":"object","properties":{"enabled":{"type":"boolean"},"value":{"type":"integer"}}},"podSecurityContext":{"type":"object"},"progressDeadlineSeconds":{"type":"integer"},"resources":{"type":"object","properties":{"limits":{"type":"object"},"requests":{"type":"object"}}},"revisionHistoryLimit":{"type":"integer","minimum":0},"rollingUpdate":{"type":"object","properties":{"maxSurge":{"type":"string"},"maxUnavailable":{"type":"string"},"partition":{"type":"integer"}}},"securityContext":{"type":"object"},"server_config":{"type":"object","properties":{"full_shutdown_duration":{"type":"string"},"healths":{"type":"object","properties":{"liveness":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"livenessProbe":{"type":"object","properties":{"failureThreshold":{"type":"integer"},"httpGet":{"type":"object","properties":{"path":{"type":"string"},"port":{"type":"string"},"scheme":{"type":"string"}}},"initialDelaySeconds":{"type":"integer"},"periodSeconds":{"type":"integer"},"successThreshold":{"type":"integer"},"timetoutSeconds":{"type":"integer"}}},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}},"readiness":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"readinessProbe":{"type":"object","properties":{"failureThreshold":{"type":"integer"},"httpGet":{"type":"object","properties":{"path":{"type":"string"},"port":{"type":"string"},"scheme":{"type":"string"}}},"initialDelaySeconds":{"type":"integer"},"periodSeconds":{"type":"integer"},"successThreshold":{"type":"integer"},"timeoutSeconds":{"type":"integer"}}},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}}}},"metrics":{"type":"object","properties":{"pprof":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}},"prometheus":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}}}},"servers":{"type":"object","properties":{"grpc":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"grpc":{"type":"object","properties":{"bidirectional_stream_concurrency":{"type":"integer"},"connection_timeout":{"type":"string"},"header_table_size":{"type":"integer"},"initial_conn_window_size":{"type":"integer"},"initial_window_size":{"type":"integer"},"interceptors":{"type":"array","items":{"type":"string","enum":["RecoverInterceptor","AccessLogInterceptor","TracePayloadInterceptor"]}},"keepalive":{"type":"object","properties":{"max_conn_age":{"type":"string"},"max_conn_age_grace":{"type":"string"},"max_conn_idle":{"type":"string"},"time":{"type":"string"},"timeout":{"type":"string"}}},"max_header_list_size":{"type":"integer"},"max_receive_message_size":{"type":"integer"},"max_send_message_size":{"type":"integer"},"read_buffer_size":{"type":"integer"},"write_buffer_size":{"type":"integer"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"},"restart":{"type":"boolean"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}},"rest":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"handler_timeout":{"type":"string"},"http":{"type":"object"},"idle_timeout":{"type":"string"},"mode":{"type":"string"},"probe_wait_time":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}}}},"service":{"type":"object","properties":{"annotations":{"type":"object"},"labels":{"type":"object"}}},"serviceType":{"type":"string","enum":["ClusterIP","LoadBalancer","NodePort"]},"sidecar":{"type":"object","properties":{"config":{"type":"object","properties":{"auto_backup_duration":{"type":"string"},"auto_backup_enabled":{"type":"boolean"},"blob_storage":{"type":"object","properties":{"bucket":{"type":"string"},"s3":{"type":"object","properties":{"access_key":{"type":"string"},"enable_100_continue":{"type":"boolean"},"enable_content_md5_validation":{"type":"boolean"},"enable_endpoint_discovery":{"type":"boolean"},"enable_endpoint_host_prefix":{"type":"boolean"},"enable_param_validation":{"type":"boolean"},"enable_ssl":{"type":"boolean"},"endpoint":{"type":"string"},"force_path_style":{"type":"boolean"},"max_chunk_size":{"type":"string","pattern":"^[0-9]+(kb|mb|gb)$"},"max_part_size":{"type":"string","pattern":"^[0-9]+(kb|mb|gb)$"},"max_retries":{"type":"integer"},"region":{"type":"string"},"secret_access_key":{"type":"string"},"token":{"type":"string"},"use_accelerate":{"type":"boolean"},"use_arn_region":{"type":"boolean"},"use_dual_stack":{"type":"boolean"}}},"storage_type":{"type":"string","enum":["s3"]}}},"client":{"type":"object","properties":{"tcp":{"type":"object","properties":{"dialer":{"type":"object","properties":{"dual_stack_enabled":{"type":"boolean"},"keep_alive":{"type":"string"},"timeout":{"type":"string"}}},"dns":{"type":"object","properties":{"cache_enabled":{"type":"boolean"},"cache_expiration":{"type":"string"},"refresh_duration":{"type":"string"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}}}},"transport":{"type":"object","properties":{"backoff":{"type":"object","properties":{"backoff_factor":{"type":"number"},"backoff_time_limit":{"type":"string"},"enable_error_log":{"type":"boolean"},"initial_duration":{"type":"string"},"jitter_limit":{"type":"string"},"maximum_duration":{"type":"string"},"retry_count":{"type":"integer"}}},"round_tripper":{"type":"object","properties":{"expect_continue_timeout":{"type":"string"},"force_attempt_http_2":{"type":"boolean"},"idle_conn_timeout":{"type":"string"},"max_conns_per_host":{"type":"integer"},"max_idle_conns":{"type":"integer"},"max_idle_conns_per_host":{"type":"integer"},"max_response_header_size":{"type":"integer"},"read_buffer_size":{"type":"integer"},"response_header_timeout":{"type":"string"},"tls_handshake_timeout":{"type":"string"},"write_buffer_size":{"type":"integer"}}}}}}},"compress":{"type":"object","properties":{"compress_algorithm":{"type":"string","enum":["gob","gzip","lz4","zstd"]},"compression_level":{"type":"integer"}}},"filename":{"type":"string"},"filename_suffix":{"type":"string"},"post_stop_timeout":{"type":"string"},"restore_backoff":{"type":"object","properties":{"backoff_factor":{"type":"number"},"backoff_time_limit":{"type":"string"},"enable_error_log":{"type":"boolean"},"initial_duration":{"type":"string"},"jitter_limit":{"type":"string"},"maximum_duration":{"type":"string"},"retry_count":{"type":"integer"}}},"watch_enabled":{"type":"boolean"}}},"enabled":{"type":"boolean"},"env":{"type":"array","items":{"type":"object"}},"image":{"type":"object","properties":{"pullPolicy":{"type":"string","enum":["Always","Never","IfNotPresent"]},"repository":{"type":"string"},"tag":{"type":"string"}}},"initContainerEnabled":{"type":"boolean"},"logging":{"type":"object","properties":{"format":{"type":"string","enum":["raw","json"]},"level":{"type":"string","enum":["debug","info","warn","error","fatal"]},"logger":{"type":"string","enum":["glg","zap"]}}},"name":{"type":"string"},"observability":{"type":"object","properties":{"collector":{"type":"object","properties":{"duration":{"type":"string"},"metrics":{"type":"object","properties":{"enable_cgo":{"type":"boolean"},"enable_goroutine":{"type":"boolean"},"enable_memory":{"type":"boolean"},"enable_version_info":{"type":"boolean"},"version_info_labels":{"type":"array","items":{"type":"string","enum":["vald_version","server_name","git_commit","build_time","go_version","go_os","go_arch","cgo_enabled","ngt_version","build_cpu_info_flags"]}}}}}},"enabled":{"type":"boolean"},"jaeger":{"type":"object","properties":{"agent_endpoint":{"type":"string"},"buffer_max_count":{"type":"integer"},"collector_endpoint":{"type":"string"},"enabled":{"type":"boolean"},"password":{"type":"string"},"service_name":{"type":"string"},"username":{"type":"string"}}},"prometheus":{"type":"object","properties":{"enabled":{"type":"boolean"},"endpoint":{"type":"string"},"namespace":{"type":"string"}}},"stackdriver":{"type":"object","properties":{"client":{"type":"object","properties":{"api_key":{"type":"string"},"audiences":{"type":"array","items":{"type":"string"}},"authentication_enabled":{"type":"boolean"},"credentials_file":{"type":"string"},"credentials_json":{"type":"string"},"endpoint":{"type":"string"},"quota_project":{"type":"string"},"request_reason":{"type":"string"},"scopes":{"type":"array","items":{"type":"string"}},"telemetry_enabled":{"type":"boolean"},"user_agent":{"type":"string"}}},"exporter":{"type":"object","properties":{"bundle_count_threshold":{"type":"integer"},"bundle_delay_threshold":{"type":"string"},"location":{"type":"string"},"metric_prefix":{"type":"string"},"monitoring_enabled":{"type":"boolean"},"number_of_workers":{"type":"integer"},"reporting_interval":{"type":"string"},"skip_cmd":{"type":"boolean"},"timeout":{"type":"string"},"trace_spans_buffer_max_bytes":{"type":"integer"},"tracing_enabled":{"type":"boolean"}}},"profiler":{"type":"object","properties":{"alloc_force_gc":{"type":"boolean"},"alloc_profiling":{"type":"boolean"},"api_addr":{"type":"string"},"cpu_profiling":{"type":"boolean"},"debug_logging":{"type":"boolean"},"enabled":{"type":"boolean"},"goroutine_profiling":{"type":"boolean"},"heap_profiling":{"type":"boolean"},"instance":{"type":"string"},"mutex_profiling":{"type":"boolean"},"service":{"type":"string"},"service_version":{"type":"string"},"zone":{"type":"string"}}},"project_id":{"type":"string"}}},"trace":{"type":"object","properties":{"enabled":{"type":"boolean"},"sampling_rate":{"type":"number"}}}}},"resources":{"type":"object","properties":{"limits":{"type":"object"},"requests":{"type":"object"}}},"server_config":{"type":"object","properties":{"full_shutdown_duration":{"type":"string"},"healths":{"type":"object","properties":{"liveness":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"livenessProbe":{"type":"object","properties":{"failureThreshold":{"type":"integer"},"httpGet":{"type":"object","properties":{"path":{"type":"string"},"port":{"type":"string"},"scheme":{"type":"string"}}},"initialDelaySeconds":{"type":"integer"},"periodSeconds":{"type":"integer"},"successThreshold":{"type":"integer"},"timetoutSeconds":{"type":"integer"}}},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}},"readiness":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"readinessProbe":{"type":"object","properties":{"failureThreshold":{"type":"integer"},"httpGet":{"type":"object","properties":{"path":{"type":"string"},"port":{"type":"string"},"scheme":{"type":"string"}}},"initialDelaySeconds":{"type":"integer"},"periodSeconds":{"type":"integer"},"successThreshold":{"type":"integer"},"timeoutSeconds":{"type":"integer"}}},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}}}},"metrics":{"type":"object","properties":{"pprof":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}},"prometheus":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}}}},"servers":{"type":"object","properties":{"grpc":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"grpc":{"type":"object","properties":{"bidirectional_stream_concurrency":{"type":"integer"},"connection_timeout":{"type":"string"},"header_table_size":{"type":"integer"},"initial_conn_window_size":{"type":"integer"},"initial_window_size":{"type":"integer"},"interceptors":{"type":"array","items":{"type":"string","enum":["RecoverInterceptor","AccessLogInterceptor","TracePayloadInterceptor"]}},"keepalive":{"type":"object","properties":{"max_conn_age":{"type":"string"},"max_conn_age_grace":{"type":"string"},"max_conn_idle":{"type":"string"},"time":{"type":"string"},"timeout":{"type":"string"}}},"max_header_list_size":{"type":"integer"},"max_receive_message_size":{"type":"integer"},"max_send_message_size":{"type":"integer"},"read_buffer_size":{"type":"integer"},"write_buffer_size":{"type":"integer"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"},"restart":{"type":"boolean"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}},"rest":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"handler_timeout":{"type":"string"},"http":{"type":"object"},"idle_timeout":{"type":"string"},"mode":{"type":"string"},"probe_wait_time":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}}}},"service":{"type":"object","properties":{"annotations":{"type":"object"},"enabled":{"type":"boolean"},"externalTrafficPolicy":{"type":"string"},"labels":{"type":"object"},"type":{"type":"string","enum":["ClusterIP","LoadBalancer","NodePort"]}}},"time_zone":{"type":"string"},"version":{"type":"string","pattern":"^v[0-9]+\\.[0-9]+\\.[0-9]$"}}},"terminationGracePeriodSeconds":{"type":"integer","minimum":0},"time_zone":{"type":"string"},"tolerations":{"type":"array","items":{"type":"object"}},"topologySpreadConstraints":{"type":"array","items":{"type":"object"}},"version":{"type":"string","pattern":"^v[0-9]+\\.[0-9]+\\.[0-9]$"},"volumeMounts":{"type":"array","items":{"type":"object"}},"volumes":{"type":"array","items":{"type":"object"}}}},"defaults":{"type":"object","properties":{"grpc":{"type":"object","properties":{"client":{"type":"object","properties":{"addrs":{"type":"array","items":{"type":"string"}},"backoff":{"type":"object","properties":{"backoff_factor":{"type":"number"},"backoff_time_limit":{"type":"string"},"enable_error_log":{"type":"boolean"},"initial_duration":{"type":"string"},"jitter_limit":{"type":"string"},"maximum_duration":{"type":"string"},"retry_count":{"type":"integer"}}},"call_option":{"type":"object"},"connection_pool":{"type":"object","properties":{"enable_dns_resolver":{"type":"boolean"},"enable_rebalance":{"type":"boolean"},"old_conn_close_duration":{"type":"string"},"rebalance_duration":{"type":"string"},"size":{"type":"integer"}}},"dial_option":{"type":"object","properties":{"backoff_base_delay":{"type":"string"},"backoff_jitter":{"type":"number"},"backoff_max_delay":{"type":"string"},"backoff_multiplier":{"type":"number"},"enable_backoff":{"type":"boolean"},"initial_connection_window_size":{"type":"integer"},"initial_window_size":{"type":"integer"},"insecure":{"type":"boolean"},"keep_alive":{"type":"object","properties":{"permit_without_stream":{"type":"boolean"},"time":{"type":"string"},"timeout":{"type":"string"}}},"max_msg_size":{"type":"integer"},"min_connection_timeout":{"type":"string"},"read_buffer_size":{"type":"integer"},"tcp":{"type":"object","properties":{"dialer":{"type":"object","properties":{"dual_stack_enabled":{"type":"boolean"},"keep_alive":{"type":"string"},"timeout":{"type":"string"}}},"dns":{"type":"object","properties":{"cache_enabled":{"type":"boolean"},"cache_expiration":{"type":"string"},"refresh_duration":{"type":"string"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}}}},"timeout":{"type":"string"},"write_buffer_size":{"type":"integer"}}},"health_check_duration":{"type":"string"},"max_recv_msg_size":{"type":"integer"},"max_retry_rpc_buffer_size":{"type":"integer"},"max_send_msg_size":{"type":"integer"},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}},"wait_for_ready":{"type":"boolean"}}}}},"image":{"type":"object","properties":{"tag":{"type":"string"}}},"ingress":{"type":"object","properties":{"usev1beta1":{"type":"boolean"}}},"logging":{"type":"object","properties":{"format":{"type":"string","enum":["raw","json"]},"level":{"type":"string","enum":["debug","info","warn","error","fatal"]},"logger":{"type":"string","enum":["glg","zap"]}}},"observability":{"type":"object","properties":{"collector":{"type":"object","properties":{"duration":{"type":"string"},"metrics":{"type":"object","properties":{"enable_cgo":{"type":"boolean"},"enable_goroutine":{"type":"boolean"},"enable_memory":{"type":"boolean"},"enable_version_info":{"type":"boolean"},"version_info_labels":{"type":"array","items":{"type":"string","enum":["vald_version","server_name","git_commit","build_time","go_version","go_os","go_arch","cgo_enabled","ngt_version","build_cpu_info_flags"]}}}}}},"enabled":{"type":"boolean"},"jaeger":{"type":"object","properties":{"agent_endpoint":{"type":"string"},"buffer_max_count":{"type":"integer"},"collector_endpoint":{"type":"string"},"enabled":{"type":"boolean"},"password":{"type":"string"},"service_name":{"type":"string"},"username":{"type":"string"}}},"prometheus":{"type":"object","properties":{"enabled":{"type":"boolean"},"endpoint":{"type":"string"},"namespace":{"type":"string"}}},"stackdriver":{"type":"object","properties":{"client":{"type":"object","properties":{"api_key":{"type":"string"},"audiences":{"type":"array","items":{"type":"string"}},"authentication_enabled":{"type":"boolean"},"credentials_file":{"type":"string"},"credentials_json":{"type":"string"},"endpoint":{"type":"string"},"quota_project":{"type":"string"},"request_reason":{"type":"string"},"scopes":{"type":"array","items":{"type":"string"}},"telemetry_enabled":{"type":"boolean"},"user_agent":{"type":"string"}}},"exporter":{"type":"object","properties":{"bundle_count_threshold":{"type":"integer"},"bundle_delay_threshold":{"type":"string"},"location":{"type":"string"},"metric_prefix":{"type":"string"},"monitoring_enabled":{"type":"boolean"},"number_of_workers":{"type":"integer"},"reporting_interval":{"type":"string"},"skip_cmd":{"type":"boolean"},"timeout":{"type":"string"},"trace_spans_buffer_max_bytes":{"type":"integer"},"tracing_enabled":{"type":"boolean"}}},"profiler":{"type":"object","properties":{"alloc_force_gc":{"type":"boolean"},"alloc_profiling":{"type":"boolean"},"api_addr":{"type":"string"},"cpu_profiling":{"type":"boolean"},"debug_logging":{"type":"boolean"},"enabled":{"type":"boolean"},"goroutine_profiling":{"type":"boolean"},"heap_profiling":{"type":"boolean"},"instance":{"type":"string"},"mutex_profiling":{"type":"boolean"},"service":{"type":"string"},"service_version":{"type":"string"},"zone":{"type":"string"}}},"project_id":{"type":"string"}}},"trace":{"type":"object","properties":{"enabled":{"type":"boolean"},"sampling_rate":{"type":"number"}}}}},"server_config":{"type":"object","properties":{"full_shutdown_duration":{"type":"string"},"healths":{"type":"object","properties":{"liveness":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"livenessProbe":{"type":"object","properties":{"failureThreshold":{"type":"integer"},"httpGet":{"type":"object","properties":{"path":{"type":"string"},"port":{"type":"string"},"scheme":{"type":"string"}}},"initialDelaySeconds":{"type":"integer"},"periodSeconds":{"type":"integer"},"successThreshold":{"type":"integer"},"timetoutSeconds":{"type":"integer"}}},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}},"readiness":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"readinessProbe":{"type":"object","properties":{"failureThreshold":{"type":"integer"},"httpGet":{"type":"object","properties":{"path":{"type":"string"},"port":{"type":"string"},"scheme":{"type":"string"}}},"initialDelaySeconds":{"type":"integer"},"periodSeconds":{"type":"integer"},"successThreshold":{"type":"integer"},"timeoutSeconds":{"type":"integer"}}},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}}}},"metrics":{"type":"object","properties":{"pprof":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}},"prometheus":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}}}},"servers":{"type":"object","properties":{"grpc":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"grpc":{"type":"object","properties":{"bidirectional_stream_concurrency":{"type":"integer"},"connection_timeout":{"type":"string"},"header_table_size":{"type":"integer"},"initial_conn_window_size":{"type":"integer"},"initial_window_size":{"type":"integer"},"interceptors":{"type":"array","items":{"type":"string","enum":["RecoverInterceptor","AccessLogInterceptor","TracePayloadInterceptor"]}},"keepalive":{"type":"object","properties":{"max_conn_age":{"type":"string"},"max_conn_age_grace":{"type":"string"},"max_conn_idle":{"type":"string"},"time":{"type":"string"},"timeout":{"type":"string"}}},"max_header_list_size":{"type":"integer"},"max_receive_message_size":{"type":"integer"},"max_send_message_size":{"type":"integer"},"read_buffer_size":{"type":"integer"},"write_buffer_size":{"type":"integer"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"},"restart":{"type":"boolean"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}},"rest":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"handler_timeout":{"type":"string"},"http":{"type":"object"},"idle_timeout":{"type":"string"},"mode":{"type":"string"},"probe_wait_time":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}}}},"time_zone":{"type":"string"}}},"discoverer":{"type":"object","properties":{"affinity":{"type":"object","properties":{"nodeAffinity":{"type":"object","properties":{"preferredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}},"requiredDuringSchedulingIgnoredDuringExecution":{"type":"object","properties":{"nodeSelectorTerms":{"type":"array","items":{"type":"object"}}}}}},"podAffinity":{"type":"object","properties":{"preferredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}},"requiredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}}}},"podAntiAffinity":{"type":"object","properties":{"preferredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}},"requiredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}}}}}},"annotations":{"type":"object"},"clusterRole":{"type":"object","properties":{"enabled":{"type":"boolean"},"name":{"type":"string"}}},"clusterRoleBinding":{"type":"object","properties":{"enabled":{"type":"boolean"},"name":{"type":"string"}}},"discoverer":{"type":"object","properties":{"discovery_duration":{"type":"string"},"name":{"type":"string"},"namespace":{"type":"string"},"tcp":{"type":"object","properties":{"dialer":{"type":"object","properties":{"dual_stack_enabled":{"type":"boolean"},"keep_alive":{"type":"string"},"timeout":{"type":"string"}}},"dns":{"type":"object","properties":{"cache_enabled":{"type":"boolean"},"cache_expiration":{"type":"string"},"refresh_duration":{"type":"string"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}}}}}},"enabled":{"type":"boolean"},"env":{"type":"array","items":{"type":"object"}},"externalTrafficPolicy":{"type":"string"},"hpa":{"type":"object","properties":{"enabled":{"type":"boolean"},"targetCPUUtilizationPercentage":{"type":"integer"}}},"image":{"type":"object","properties":{"pullPolicy":{"type":"string","enum":["Always","Never","IfNotPresent"]},"repository":{"type":"string"},"tag":{"type":"string"}}},"initContainers":{"type":"array","items":{"type":"object"}},"kind":{"type":"string","enum":["Deployment","DaemonSet"]},"logging":{"type":"object","properties":{"format":{"type":"string","enum":["raw","json"]},"level":{"type":"string","enum":["debug","info","warn","error","fatal"]},"logger":{"type":"string","enum":["glg","zap"]}}},"maxReplicas":{"type":"integer","minimum":0},"maxUnavailable":{"type":"string"},"minReplicas":{"type":"integer","minimum":0},"name":{"type":"string"},"nodeName":{"type":"string"},"nodeSelector":{"type":"object"},"observability":{"type":"object","properties":{"collector":{"type":"object","properties":{"duration":{"type":"string"},"metrics":{"type":"object","properties":{"enable_cgo":{"type":"boolean"},"enable_goroutine":{"type":"boolean"},"enable_memory":{"type":"boolean"},"enable_version_info":{"type":"boolean"},"version_info_labels":{"type":"array","items":{"type":"string","enum":["vald_version","server_name","git_commit","build_time","go_version","go_os","go_arch","cgo_enabled","ngt_version","build_cpu_info_flags"]}}}}}},"enabled":{"type":"boolean"},"jaeger":{"type":"object","properties":{"agent_endpoint":{"type":"string"},"buffer_max_count":{"type":"integer"},"collector_endpoint":{"type":"string"},"enabled":{"type":"boolean"},"password":{"type":"string"},"service_name":{"type":"string"},"username":{"type":"string"}}},"prometheus":{"type":"object","properties":{"enabled":{"type":"boolean"},"endpoint":{"type":"string"},"namespace":{"type":"string"}}},"stackdriver":{"type":"object","properties":{"client":{"type":"object","properties":{"api_key":{"type":"string"},"audiences":{"type":"array","items":{"type":"string"}},"authentication_enabled":{"type":"boolean"},"credentials_file":{"type":"string"},"credentials_json":{"type":"string"},"endpoint":{"type":"string"},"quota_project":{"type":"string"},"request_reason":{"type":"string"},"scopes":{"type":"array","items":{"type":"string"}},"telemetry_enabled":{"type":"boolean"},"user_agent":{"type":"string"}}},"exporter":{"type":"object","properties":{"bundle_count_threshold":{"type":"integer"},"bundle_delay_threshold":{"type":"string"},"location":{"type":"string"},"metric_prefix":{"type":"string"},"monitoring_enabled":{"type":"boolean"},"number_of_workers":{"type":"integer"},"reporting_interval":{"type":"string"},"skip_cmd":{"type":"boolean"},"timeout":{"type":"string"},"trace_spans_buffer_max_bytes":{"type":"integer"},"tracing_enabled":{"type":"boolean"}}},"profiler":{"type":"object","properties":{"alloc_force_gc":{"type":"boolean"},"alloc_profiling":{"type":"boolean"},"api_addr":{"type":"string"},"cpu_profiling":{"type":"boolean"},"debug_logging":{"type":"boolean"},"enabled":{"type":"boolean"},"goroutine_profiling":{"type":"boolean"},"heap_profiling":{"type":"boolean"},"instance":{"type":"string"},"mutex_profiling":{"type":"boolean"},"service":{"type":"string"},"service_version":{"type":"string"},"zone":{"type":"string"}}},"project_id":{"type":"string"}}},"trace":{"type":"object","properties":{"enabled":{"type":"boolean"},"sampling_rate":{"type":"number"}}}}},"podAnnotations":{"type":"object"},"podPriority":{"type":"object","properties":{"enabled":{"type":"boolean"},"value":{"type":"integer"}}},"podSecurityContext":{"type":"object"},"progressDeadlineSeconds":{"type":"integer"},"resources":{"type":"object","properties":{"limits":{"type":"object"},"requests":{"type":"object"}}},"revisionHistoryLimit":{"type":"integer","minimum":0},"rollingUpdate":{"type":"object","properties":{"maxSurge":{"type":"string"},"maxUnavailable":{"type":"string"}}},"securityContext":{"type":"object"},"server_config":{"type":"object","properties":{"full_shutdown_duration":{"type":"string"},"healths":{"type":"object","properties":{"liveness":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"livenessProbe":{"type":"object","properties":{"failureThreshold":{"type":"integer"},"httpGet":{"type":"object","properties":{"path":{"type":"string"},"port":{"type":"string"},"scheme":{"type":"string"}}},"initialDelaySeconds":{"type":"integer"},"periodSeconds":{"type":"integer"},"successThreshold":{"type":"integer"},"timetoutSeconds":{"type":"integer"}}},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}},"readiness":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"readinessProbe":{"type":"object","properties":{"failureThreshold":{"type":"integer"},"httpGet":{"type":"object","properties":{"path":{"type":"string"},"port":{"type":"string"},"scheme":{"type":"string"}}},"initialDelaySeconds":{"type":"integer"},"periodSeconds":{"type":"integer"},"successThreshold":{"type":"integer"},"timeoutSeconds":{"type":"integer"}}},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}}}},"metrics":{"type":"object","properties":{"pprof":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}},"prometheus":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}}}},"servers":{"type":"object","properties":{"grpc":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"grpc":{"type":"object","properties":{"bidirectional_stream_concurrency":{"type":"integer"},"connection_timeout":{"type":"string"},"header_table_size":{"type":"integer"},"initial_conn_window_size":{"type":"integer"},"initial_window_size":{"type":"integer"},"interceptors":{"type":"array","items":{"type":"string","enum":["RecoverInterceptor","AccessLogInterceptor","TracePayloadInterceptor"]}},"keepalive":{"type":"object","properties":{"max_conn_age":{"type":"string"},"max_conn_age_grace":{"type":"string"},"max_conn_idle":{"type":"string"},"time":{"type":"string"},"timeout":{"type":"string"}}},"max_header_list_size":{"type":"integer"},"max_receive_message_size":{"type":"integer"},"max_send_message_size":{"type":"integer"},"read_buffer_size":{"type":"integer"},"write_buffer_size":{"type":"integer"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"},"restart":{"type":"boolean"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}},"rest":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"handler_timeout":{"type":"string"},"http":{"type":"object"},"idle_timeout":{"type":"string"},"mode":{"type":"string"},"probe_wait_time":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}}}},"service":{"type":"object","properties":{"annotations":{"type":"object"},"labels":{"type":"object"}}},"serviceAccount":{"type":"object","properties":{"enabled":{"type":"boolean"},"name":{"type":"string"}}},"serviceType":{"type":"string","enum":["ClusterIP","LoadBalancer","NodePort"]},"terminationGracePeriodSeconds":{"type":"integer","minimum":0},"time_zone":{"type":"string"},"tolerations":{"type":"array","items":{"type":"object"}},"topologySpreadConstraints":{"type":"array","items":{"type":"object"}},"version":{"type":"string","pattern":"^v[0-9]+\\.[0-9]+\\.[0-9]$"},"volumeMounts":{"type":"array","items":{"type":"object"}},"volumes":{"type":"array","items":{"type":"object"}}}},"gateway":{"type":"object","properties":{"backup":{"type":"object","properties":{"affinity":{"type":"object","properties":{"nodeAffinity":{"type":"object","properties":{"preferredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}},"requiredDuringSchedulingIgnoredDuringExecution":{"type":"object","properties":{"nodeSelectorTerms":{"type":"array","items":{"type":"object"}}}}}},"podAffinity":{"type":"object","properties":{"preferredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}},"requiredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}}}},"podAntiAffinity":{"type":"object","properties":{"preferredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}},"requiredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}}}}}},"annotations":{"type":"object"},"enabled":{"type":"boolean"},"env":{"type":"array","items":{"type":"object"}},"externalTrafficPolicy":{"type":"string"},"gateway_config":{"type":"object","properties":{"backup_client":{"type":"object","properties":{"addrs":{"type":"array","items":{"type":"string"}},"backoff":{"type":"object","properties":{"backoff_factor":{"type":"number"},"backoff_time_limit":{"type":"string"},"enable_error_log":{"type":"boolean"},"initial_duration":{"type":"string"},"jitter_limit":{"type":"string"},"maximum_duration":{"type":"string"},"retry_count":{"type":"integer"}}},"call_option":{"type":"object"},"connection_pool":{"type":"object","properties":{"enable_dns_resolver":{"type":"boolean"},"enable_rebalance":{"type":"boolean"},"old_conn_close_duration":{"type":"string"},"rebalance_duration":{"type":"string"},"size":{"type":"integer"}}},"dial_option":{"type":"object","properties":{"backoff_base_delay":{"type":"string"},"backoff_jitter":{"type":"number"},"backoff_max_delay":{"type":"string"},"backoff_multiplier":{"type":"number"},"enable_backoff":{"type":"boolean"},"initial_connection_window_size":{"type":"integer"},"initial_window_size":{"type":"integer"},"insecure":{"type":"boolean"},"keep_alive":{"type":"object","properties":{"permit_without_stream":{"type":"boolean"},"time":{"type":"string"},"timeout":{"type":"string"}}},"max_msg_size":{"type":"integer"},"min_connection_timeout":{"type":"string"},"read_buffer_size":{"type":"integer"},"tcp":{"type":"object","properties":{"dialer":{"type":"object","properties":{"dual_stack_enabled":{"type":"boolean"},"keep_alive":{"type":"string"},"timeout":{"type":"string"}}},"dns":{"type":"object","properties":{"cache_enabled":{"type":"boolean"},"cache_expiration":{"type":"string"},"refresh_duration":{"type":"string"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}}}},"timeout":{"type":"string"},"write_buffer_size":{"type":"integer"}}},"health_check_duration":{"type":"string"},"max_recv_msg_size":{"type":"integer"},"max_retry_rpc_buffer_size":{"type":"integer"},"max_send_msg_size":{"type":"integer"},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}},"wait_for_ready":{"type":"boolean"}}},"gateway_client":{"type":"object","properties":{"addrs":{"type":"array","items":{"type":"string"}},"backoff":{"type":"object","properties":{"backoff_factor":{"type":"number"},"backoff_time_limit":{"type":"string"},"enable_error_log":{"type":"boolean"},"initial_duration":{"type":"string"},"jitter_limit":{"type":"string"},"maximum_duration":{"type":"string"},"retry_count":{"type":"integer"}}},"call_option":{"type":"object"},"connection_pool":{"type":"object","properties":{"enable_dns_resolver":{"type":"boolean"},"enable_rebalance":{"type":"boolean"},"old_conn_close_duration":{"type":"string"},"rebalance_duration":{"type":"string"},"size":{"type":"integer"}}},"dial_option":{"type":"object","properties":{"backoff_base_delay":{"type":"string"},"backoff_jitter":{"type":"number"},"backoff_max_delay":{"type":"string"},"backoff_multiplier":{"type":"number"},"enable_backoff":{"type":"boolean"},"initial_connection_window_size":{"type":"integer"},"initial_window_size":{"type":"integer"},"insecure":{"type":"boolean"},"keep_alive":{"type":"object","properties":{"permit_without_stream":{"type":"boolean"},"time":{"type":"string"},"timeout":{"type":"string"}}},"max_msg_size":{"type":"integer"},"min_connection_timeout":{"type":"string"},"read_buffer_size":{"type":"integer"},"tcp":{"type":"object","properties":{"dialer":{"type":"object","properties":{"dual_stack_enabled":{"type":"boolean"},"keep_alive":{"type":"string"},"timeout":{"type":"string"}}},"dns":{"type":"object","properties":{"cache_enabled":{"type":"boolean"},"cache_expiration":{"type":"string"},"refresh_duration":{"type":"string"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}}}},"timeout":{"type":"string"},"write_buffer_size":{"type":"integer"}}},"health_check_duration":{"type":"string"},"max_recv_msg_size":{"type":"integer"},"max_retry_rpc_buffer_size":{"type":"integer"},"max_send_msg_size":{"type":"integer"},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}},"wait_for_ready":{"type":"boolean"}}}}},"hpa":{"type":"object","properties":{"enabled":{"type":"boolean"},"targetCPUUtilizationPercentage":{"type":"integer"}}},"image":{"type":"object","properties":{"pullPolicy":{"type":"string","enum":["Always","Never","IfNotPresent"]},"repository":{"type":"string"},"tag":{"type":"string"}}},"ingress":{"type":"object","properties":{"annotations":{"type":"object"},"enabled":{"type":"boolean"},"host":{"type":"string"},"pathType":{"type":"string"},"servicePort":{"type":"string"}}},"initContainers":{"type":"array","items":{"type":"object"}},"kind":{"type":"string","enum":["Deployment","DaemonSet"]},"logging":{"type":"object","properties":{"format":{"type":"string","enum":["raw","json"]},"level":{"type":"string","enum":["debug","info","warn","error","fatal"]},"logger":{"type":"string","enum":["glg","zap"]}}},"maxReplicas":{"type":"integer","minimum":0},"maxUnavailable":{"type":"string"},"minReplicas":{"type":"integer","minimum":0},"name":{"type":"string"},"nodeName":{"type":"string"},"nodeSelector":{"type":"object"},"observability":{"type":"object","properties":{"collector":{"type":"object","properties":{"duration":{"type":"string"},"metrics":{"type":"object","properties":{"enable_cgo":{"type":"boolean"},"enable_goroutine":{"type":"boolean"},"enable_memory":{"type":"boolean"},"enable_version_info":{"type":"boolean"},"version_info_labels":{"type":"array","items":{"type":"string","enum":["vald_version","server_name","git_commit","build_time","go_version","go_os","go_arch","cgo_enabled","ngt_version","build_cpu_info_flags"]}}}}}},"enabled":{"type":"boolean"},"jaeger":{"type":"object","properties":{"agent_endpoint":{"type":"string"},"buffer_max_count":{"type":"integer"},"collector_endpoint":{"type":"string"},"enabled":{"type":"boolean"},"password":{"type":"string"},"service_name":{"type":"string"},"username":{"type":"string"}}},"prometheus":{"type":"object","properties":{"enabled":{"type":"boolean"},"endpoint":{"type":"string"},"namespace":{"type":"string"}}},"stackdriver":{"type":"object","properties":{"client":{"type":"object","properties":{"api_key":{"type":"string"},"audiences":{"type":"array","items":{"type":"string"}},"authentication_enabled":{"type":"boolean"},"credentials_file":{"type":"string"},"credentials_json":{"type":"string"},"endpoint":{"type":"string"},"quota_project":{"type":"string"},"request_reason":{"type":"string"},"scopes":{"type":"array","items":{"type":"string"}},"telemetry_enabled":{"type":"boolean"},"user_agent":{"type":"string"}}},"exporter":{"type":"object","properties":{"bundle_count_threshold":{"type":"integer"},"bundle_delay_threshold":{"type":"string"},"location":{"type":"string"},"metric_prefix":{"type":"string"},"monitoring_enabled":{"type":"boolean"},"number_of_workers":{"type":"integer"},"reporting_interval":{"type":"string"},"skip_cmd":{"type":"boolean"},"timeout":{"type":"string"},"trace_spans_buffer_max_bytes":{"type":"integer"},"tracing_enabled":{"type":"boolean"}}},"profiler":{"type":"object","properties":{"alloc_force_gc":{"type":"boolean"},"alloc_profiling":{"type":"boolean"},"api_addr":{"type":"string"},"cpu_profiling":{"type":"boolean"},"debug_logging":{"type":"boolean"},"enabled":{"type":"boolean"},"goroutine_profiling":{"type":"boolean"},"heap_profiling":{"type":"boolean"},"instance":{"type":"string"},"mutex_profiling":{"type":"boolean"},"service":{"type":"string"},"service_version":{"type":"string"},"zone":{"type":"string"}}},"project_id":{"type":"string"}}},"trace":{"type":"object","properties":{"enabled":{"type":"boolean"},"sampling_rate":{"type":"number"}}}}},"podAnnotations":{"type":"object"},"podPriority":{"type":"object","properties":{"enabled":{"type":"boolean"},"value":{"type":"integer"}}},"podSecurityContext":{"type":"object"},"progressDeadlineSeconds":{"type":"integer"},"resources":{"type":"object","properties":{"limits":{"type":"object"},"requests":{"type":"object"}}},"revisionHistoryLimit":{"type":"integer","minimum":0},"rollingUpdate":{"type":"object","properties":{"maxSurge":{"type":"string"},"maxUnavailable":{"type":"string"}}},"securityContext":{"type":"object"},"server_config":{"type":"object","properties":{"full_shutdown_duration":{"type":"string"},"healths":{"type":"object","properties":{"liveness":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"livenessProbe":{"type":"object","properties":{"failureThreshold":{"type":"integer"},"httpGet":{"type":"object","properties":{"path":{"type":"string"},"port":{"type":"string"},"scheme":{"type":"string"}}},"initialDelaySeconds":{"type":"integer"},"periodSeconds":{"type":"integer"},"successThreshold":{"type":"integer"},"timetoutSeconds":{"type":"integer"}}},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}},"readiness":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"readinessProbe":{"type":"object","properties":{"failureThreshold":{"type":"integer"},"httpGet":{"type":"object","properties":{"path":{"type":"string"},"port":{"type":"string"},"scheme":{"type":"string"}}},"initialDelaySeconds":{"type":"integer"},"periodSeconds":{"type":"integer"},"successThreshold":{"type":"integer"},"timeoutSeconds":{"type":"integer"}}},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}}}},"metrics":{"type":"object","properties":{"pprof":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}},"prometheus":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}}}},"servers":{"type":"object","properties":{"grpc":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"grpc":{"type":"object","properties":{"bidirectional_stream_concurrency":{"type":"integer"},"connection_timeout":{"type":"string"},"header_table_size":{"type":"integer"},"initial_conn_window_size":{"type":"integer"},"initial_window_size":{"type":"integer"},"interceptors":{"type":"array","items":{"type":"string","enum":["RecoverInterceptor","AccessLogInterceptor","TracePayloadInterceptor"]}},"keepalive":{"type":"object","properties":{"max_conn_age":{"type":"string"},"max_conn_age_grace":{"type":"string"},"max_conn_idle":{"type":"string"},"time":{"type":"string"},"timeout":{"type":"string"}}},"max_header_list_size":{"type":"integer"},"max_receive_message_size":{"type":"integer"},"max_send_message_size":{"type":"integer"},"read_buffer_size":{"type":"integer"},"write_buffer_size":{"type":"integer"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"},"restart":{"type":"boolean"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}},"rest":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"handler_timeout":{"type":"string"},"http":{"type":"object"},"idle_timeout":{"type":"string"},"mode":{"type":"string"},"probe_wait_time":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}}}},"service":{"type":"object","properties":{"annotations":{"type":"object"},"labels":{"type":"object"}}},"serviceType":{"type":"string","enum":["ClusterIP","LoadBalancer","NodePort"]},"terminationGracePeriodSeconds":{"type":"integer","minimum":0},"time_zone":{"type":"string"},"tolerations":{"type":"array","items":{"type":"object"}},"topologySpreadConstraints":{"type":"array","items":{"type":"object"}},"version":{"type":"string","pattern":"^v[0-9]+\\.[0-9]+\\.[0-9]$"},"volumeMounts":{"type":"array","items":{"type":"object"}},"volumes":{"type":"array","items":{"type":"object"}}}},"filter":{"type":"object","properties":{"affinity":{"type":"object","properties":{"nodeAffinity":{"type":"object","properties":{"preferredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}},"requiredDuringSchedulingIgnoredDuringExecution":{"type":"object","properties":{"nodeSelectorTerms":{"type":"array","items":{"type":"object"}}}}}},"podAffinity":{"type":"object","properties":{"preferredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}},"requiredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}}}},"podAntiAffinity":{"type":"object","properties":{"preferredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}},"requiredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}}}}}},"annotations":{"type":"object"},"enabled":{"type":"boolean"},"env":{"type":"array","items":{"type":"object"}},"externalTrafficPolicy":{"type":"string"},"gateway_config":{"type":"object","properties":{"egress_filter":{"type":"object","properties":{"client":{"type":"object","properties":{"addrs":{"type":"array","items":{"type":"string"}},"backoff":{"type":"object","properties":{"backoff_factor":{"type":"number"},"backoff_time_limit":{"type":"string"},"enable_error_log":{"type":"boolean"},"initial_duration":{"type":"string"},"jitter_limit":{"type":"string"},"maximum_duration":{"type":"string"},"retry_count":{"type":"integer"}}},"call_option":{"type":"object"},"connection_pool":{"type":"object","properties":{"enable_dns_resolver":{"type":"boolean"},"enable_rebalance":{"type":"boolean"},"old_conn_close_duration":{"type":"string"},"rebalance_duration":{"type":"string"},"size":{"type":"integer"}}},"dial_option":{"type":"object","properties":{"backoff_base_delay":{"type":"string"},"backoff_jitter":{"type":"number"},"backoff_max_delay":{"type":"string"},"backoff_multiplier":{"type":"number"},"enable_backoff":{"type":"boolean"},"initial_connection_window_size":{"type":"integer"},"initial_window_size":{"type":"integer"},"insecure":{"type":"boolean"},"keep_alive":{"type":"object","properties":{"permit_without_stream":{"type":"boolean"},"time":{"type":"string"},"timeout":{"type":"string"}}},"max_msg_size":{"type":"integer"},"min_connection_timeout":{"type":"string"},"read_buffer_size":{"type":"integer"},"tcp":{"type":"object","properties":{"dialer":{"type":"object","properties":{"dual_stack_enabled":{"type":"boolean"},"keep_alive":{"type":"string"},"timeout":{"type":"string"}}},"dns":{"type":"object","properties":{"cache_enabled":{"type":"boolean"},"cache_expiration":{"type":"string"},"refresh_duration":{"type":"string"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}}}},"timeout":{"type":"string"},"write_buffer_size":{"type":"integer"}}},"health_check_duration":{"type":"string"},"max_recv_msg_size":{"type":"integer"},"max_retry_rpc_buffer_size":{"type":"integer"},"max_send_msg_size":{"type":"integer"},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}},"wait_for_ready":{"type":"boolean"}}},"distance_filters":{"type":"array","items":{"type":"string"}},"object_filters":{"type":"array","items":{"type":"string"}}}},"gateway_client":{"type":"object","properties":{"addrs":{"type":"array","items":{"type":"string"}},"backoff":{"type":"object","properties":{"backoff_factor":{"type":"number"},"backoff_time_limit":{"type":"string"},"enable_error_log":{"type":"boolean"},"initial_duration":{"type":"string"},"jitter_limit":{"type":"string"},"maximum_duration":{"type":"string"},"retry_count":{"type":"integer"}}},"call_option":{"type":"object"},"connection_pool":{"type":"object","properties":{"enable_dns_resolver":{"type":"boolean"},"enable_rebalance":{"type":"boolean"},"old_conn_close_duration":{"type":"string"},"rebalance_duration":{"type":"string"},"size":{"type":"integer"}}},"dial_option":{"type":"object","properties":{"backoff_base_delay":{"type":"string"},"backoff_jitter":{"type":"number"},"backoff_max_delay":{"type":"string"},"backoff_multiplier":{"type":"number"},"enable_backoff":{"type":"boolean"},"initial_connection_window_size":{"type":"integer"},"initial_window_size":{"type":"integer"},"insecure":{"type":"boolean"},"keep_alive":{"type":"object","properties":{"permit_without_stream":{"type":"boolean"},"time":{"type":"string"},"timeout":{"type":"string"}}},"max_msg_size":{"type":"integer"},"min_connection_timeout":{"type":"string"},"read_buffer_size":{"type":"integer"},"tcp":{"type":"object","properties":{"dialer":{"type":"object","properties":{"dual_stack_enabled":{"type":"boolean"},"keep_alive":{"type":"string"},"timeout":{"type":"string"}}},"dns":{"type":"object","properties":{"cache_enabled":{"type":"boolean"},"cache_expiration":{"type":"string"},"refresh_duration":{"type":"string"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}}}},"timeout":{"type":"string"},"write_buffer_size":{"type":"integer"}}},"health_check_duration":{"type":"string"},"max_recv_msg_size":{"type":"integer"},"max_retry_rpc_buffer_size":{"type":"integer"},"max_send_msg_size":{"type":"integer"},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}},"wait_for_ready":{"type":"boolean"}}},"ingress_filter":{"type":"object","properties":{"client":{"type":"object","properties":{"addrs":{"type":"array","items":{"type":"string"}},"backoff":{"type":"object","properties":{"backoff_factor":{"type":"number"},"backoff_time_limit":{"type":"string"},"enable_error_log":{"type":"boolean"},"initial_duration":{"type":"string"},"jitter_limit":{"type":"string"},"maximum_duration":{"type":"string"},"retry_count":{"type":"integer"}}},"call_option":{"type":"object"},"connection_pool":{"type":"object","properties":{"enable_dns_resolver":{"type":"boolean"},"enable_rebalance":{"type":"boolean"},"old_conn_close_duration":{"type":"string"},"rebalance_duration":{"type":"string"},"size":{"type":"integer"}}},"dial_option":{"type":"object","properties":{"backoff_base_delay":{"type":"string"},"backoff_jitter":{"type":"number"},"backoff_max_delay":{"type":"string"},"backoff_multiplier":{"type":"number"},"enable_backoff":{"type":"boolean"},"initial_connection_window_size":{"type":"integer"},"initial_window_size":{"type":"integer"},"insecure":{"type":"boolean"},"keep_alive":{"type":"object","properties":{"permit_without_stream":{"type":"boolean"},"time":{"type":"string"},"timeout":{"type":"string"}}},"max_msg_size":{"type":"integer"},"min_connection_timeout":{"type":"string"},"read_buffer_size":{"type":"integer"},"tcp":{"type":"object","properties":{"dialer":{"type":"object","properties":{"dual_stack_enabled":{"type":"boolean"},"keep_alive":{"type":"string"},"timeout":{"type":"string"}}},"dns":{"type":"object","properties":{"cache_enabled":{"type":"boolean"},"cache_expiration":{"type":"string"},"refresh_duration":{"type":"string"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}}}},"timeout":{"type":"string"},"write_buffer_size":{"type":"integer"}}},"health_check_duration":{"type":"string"},"max_recv_msg_size":{"type":"integer"},"max_retry_rpc_buffer_size":{"type":"integer"},"max_send_msg_size":{"type":"integer"},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}},"wait_for_ready":{"type":"boolean"}}},"insert_filters":{"type":"array","items":{"type":"string"}},"search_filters":{"type":"array","items":{"type":"string"}},"update_filters":{"type":"array","items":{"type":"string"}},"upsert_filters":{"type":"array","items":{"type":"string"}},"vectorizer":{"type":"string"}}}}},"hpa":{"type":"object","properties":{"enabled":{"type":"boolean"},"targetCPUUtilizationPercentage":{"type":"integer"}}},"image":{"type":"object","properties":{"pullPolicy":{"type":"string","enum":["Always","Never","IfNotPresent"]},"repository":{"type":"string"},"tag":{"type":"string"}}},"ingress":{"type":"object","properties":{"annotations":{"type":"object"},"enabled":{"type":"boolean"},"host":{"type":"string"},"pathType":{"type":"string"},"servicePort":{"type":"string"}}},"initContainers":{"type":"array","items":{"type":"object"}},"kind":{"type":"string","enum":["Deployment","DaemonSet"]},"logging":{"type":"object","properties":{"format":{"type":"string","enum":["raw","json"]},"level":{"type":"string","enum":["debug","info","warn","error","fatal"]},"logger":{"type":"string","enum":["glg","zap"]}}},"maxReplicas":{"type":"integer","minimum":0},"maxUnavailable":{"type":"string"},"minReplicas":{"type":"integer","minimum":0},"name":{"type":"string"},"nodeName":{"type":"string"},"nodeSelector":{"type":"object"},"observability":{"type":"object","properties":{"collector":{"type":"object","properties":{"duration":{"type":"string"},"metrics":{"type":"object","properties":{"enable_cgo":{"type":"boolean"},"enable_goroutine":{"type":"boolean"},"enable_memory":{"type":"boolean"},"enable_version_info":{"type":"boolean"},"version_info_labels":{"type":"array","items":{"type":"string","enum":["vald_version","server_name","git_commit","build_time","go_version","go_os","go_arch","cgo_enabled","ngt_version","build_cpu_info_flags"]}}}}}},"enabled":{"type":"boolean"},"jaeger":{"type":"object","properties":{"agent_endpoint":{"type":"string"},"buffer_max_count":{"type":"integer"},"collector_endpoint":{"type":"string"},"enabled":{"type":"boolean"},"password":{"type":"string"},"service_name":{"type":"string"},"username":{"type":"string"}}},"prometheus":{"type":"object","properties":{"enabled":{"type":"boolean"},"endpoint":{"type":"string"},"namespace":{"type":"string"}}},"stackdriver":{"type":"object","properties":{"client":{"type":"object","properties":{"api_key":{"type":"string"},"audiences":{"type":"array","items":{"type":"string"}},"authentication_enabled":{"type":"boolean"},"credentials_file":{"type":"string"},"credentials_json":{"type":"string"},"endpoint":{"type":"string"},"quota_project":{"type":"string"},"request_reason":{"type":"string"},"scopes":{"type":"array","items":{"type":"string"}},"telemetry_enabled":{"type":"boolean"},"user_agent":{"type":"string"}}},"exporter":{"type":"object","properties":{"bundle_count_threshold":{"type":"integer"},"bundle_delay_threshold":{"type":"string"},"location":{"type":"string"},"metric_prefix":{"type":"string"},"monitoring_enabled":{"type":"boolean"},"number_of_workers":{"type":"integer"},"reporting_interval":{"type":"string"},"skip_cmd":{"type":"boolean"},"timeout":{"type":"string"},"trace_spans_buffer_max_bytes":{"type":"integer"},"tracing_enabled":{"type":"boolean"}}},"profiler":{"type":"object","properties":{"alloc_force_gc":{"type":"boolean"},"alloc_profiling":{"type":"boolean"},"api_addr":{"type":"string"},"cpu_profiling":{"type":"boolean"},"debug_logging":{"type":"boolean"},"enabled":{"type":"boolean"},"goroutine_profiling":{"type":"boolean"},"heap_profiling":{"type":"boolean"},"instance":{"type":"string"},"mutex_profiling":{"type":"boolean"},"service":{"type":"string"},"service_version":{"type":"string"},"zone":{"type":"string"}}},"project_id":{"type":"string"}}},"trace":{"type":"object","properties":{"enabled":{"type":"boolean"},"sampling_rate":{"type":"number"}}}}},"podAnnotations":{"type":"object"},"podPriority":{"type":"object","properties":{"enabled":{"type":"boolean"},"value":{"type":"integer"}}},"podSecurityContext":{"type":"object"},"progressDeadlineSeconds":{"type":"integer"},"resources":{"type":"object","properties":{"limits":{"type":"object"},"requests":{"type":"object"}}},"revisionHistoryLimit":{"type":"integer","minimum":0},"rollingUpdate":{"type":"object","properties":{"maxSurge":{"type":"string"},"maxUnavailable":{"type":"string"}}},"securityContext":{"type":"object"},"server_config":{"type":"object","properties":{"full_shutdown_duration":{"type":"string"},"healths":{"type":"object","properties":{"liveness":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"livenessProbe":{"type":"object","properties":{"failureThreshold":{"type":"integer"},"httpGet":{"type":"object","properties":{"path":{"type":"string"},"port":{"type":"string"},"scheme":{"type":"string"}}},"initialDelaySeconds":{"type":"integer"},"periodSeconds":{"type":"integer"},"successThreshold":{"type":"integer"},"timetoutSeconds":{"type":"integer"}}},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}},"readiness":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"readinessProbe":{"type":"object","properties":{"failureThreshold":{"type":"integer"},"httpGet":{"type":"object","properties":{"path":{"type":"string"},"port":{"type":"string"},"scheme":{"type":"string"}}},"initialDelaySeconds":{"type":"integer"},"periodSeconds":{"type":"integer"},"successThreshold":{"type":"integer"},"timeoutSeconds":{"type":"integer"}}},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}}}},"metrics":{"type":"object","properties":{"pprof":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}},"prometheus":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}}}},"servers":{"type":"object","properties":{"grpc":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"grpc":{"type":"object","properties":{"bidirectional_stream_concurrency":{"type":"integer"},"connection_timeout":{"type":"string"},"header_table_size":{"type":"integer"},"initial_conn_window_size":{"type":"integer"},"initial_window_size":{"type":"integer"},"interceptors":{"type":"array","items":{"type":"string","enum":["RecoverInterceptor","AccessLogInterceptor","TracePayloadInterceptor"]}},"keepalive":{"type":"object","properties":{"max_conn_age":{"type":"string"},"max_conn_age_grace":{"type":"string"},"max_conn_idle":{"type":"string"},"time":{"type":"string"},"timeout":{"type":"string"}}},"max_header_list_size":{"type":"integer"},"max_receive_message_size":{"type":"integer"},"max_send_message_size":{"type":"integer"},"read_buffer_size":{"type":"integer"},"write_buffer_size":{"type":"integer"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"},"restart":{"type":"boolean"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}},"rest":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"handler_timeout":{"type":"string"},"http":{"type":"object"},"idle_timeout":{"type":"string"},"mode":{"type":"string"},"probe_wait_time":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}}}},"service":{"type":"object","properties":{"annotations":{"type":"object"},"labels":{"type":"object"}}},"serviceType":{"type":"string","enum":["ClusterIP","LoadBalancer","NodePort"]},"terminationGracePeriodSeconds":{"type":"integer","minimum":0},"time_zone":{"type":"string"},"tolerations":{"type":"array","items":{"type":"object"}},"topologySpreadConstraints":{"type":"array","items":{"type":"object"}},"version":{"type":"string","pattern":"^v[0-9]+\\.[0-9]+\\.[0-9]$"},"volumeMounts":{"type":"array","items":{"type":"object"}},"volumes":{"type":"array","items":{"type":"object"}}}},"lb":{"type":"object","properties":{"affinity":{"type":"object","properties":{"nodeAffinity":{"type":"object","properties":{"preferredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}},"requiredDuringSchedulingIgnoredDuringExecution":{"type":"object","properties":{"nodeSelectorTerms":{"type":"array","items":{"type":"object"}}}}}},"podAffinity":{"type":"object","properties":{"preferredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}},"requiredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}}}},"podAntiAffinity":{"type":"object","properties":{"preferredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}},"requiredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}}}}}},"annotations":{"type":"object"},"enabled":{"type":"boolean"},"env":{"type":"array","items":{"type":"object"}},"externalTrafficPolicy":{"type":"string"},"gateway_config":{"type":"object","properties":{"agent_namespace":{"type":"string"},"discoverer":{"type":"object","properties":{"agent_client_options":{"type":"object","properties":{"addrs":{"type":"array","items":{"type":"string"}},"backoff":{"type":"object","properties":{"backoff_factor":{"type":"number"},"backoff_time_limit":{"type":"string"},"enable_error_log":{"type":"boolean"},"initial_duration":{"type":"string"},"jitter_limit":{"type":"string"},"maximum_duration":{"type":"string"},"retry_count":{"type":"integer"}}},"call_option":{"type":"object"},"connection_pool":{"type":"object","properties":{"enable_dns_resolver":{"type":"boolean"},"enable_rebalance":{"type":"boolean"},"old_conn_close_duration":{"type":"string"},"rebalance_duration":{"type":"string"},"size":{"type":"integer"}}},"dial_option":{"type":"object","properties":{"backoff_base_delay":{"type":"string"},"backoff_jitter":{"type":"number"},"backoff_max_delay":{"type":"string"},"backoff_multiplier":{"type":"number"},"enable_backoff":{"type":"boolean"},"initial_connection_window_size":{"type":"integer"},"initial_window_size":{"type":"integer"},"insecure":{"type":"boolean"},"keep_alive":{"type":"object","properties":{"permit_without_stream":{"type":"boolean"},"time":{"type":"string"},"timeout":{"type":"string"}}},"max_msg_size":{"type":"integer"},"min_connection_timeout":{"type":"string"},"read_buffer_size":{"type":"integer"},"tcp":{"type":"object","properties":{"dialer":{"type":"object","properties":{"dual_stack_enabled":{"type":"boolean"},"keep_alive":{"type":"string"},"timeout":{"type":"string"}}},"dns":{"type":"object","properties":{"cache_enabled":{"type":"boolean"},"cache_expiration":{"type":"string"},"refresh_duration":{"type":"string"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}}}},"timeout":{"type":"string"},"write_buffer_size":{"type":"integer"}}},"health_check_duration":{"type":"string"},"max_recv_msg_size":{"type":"integer"},"max_retry_rpc_buffer_size":{"type":"integer"},"max_send_msg_size":{"type":"integer"},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}},"wait_for_ready":{"type":"boolean"}}},"client":{"type":"object","properties":{"addrs":{"type":"array","items":{"type":"string"}},"backoff":{"type":"object","properties":{"backoff_factor":{"type":"number"},"backoff_time_limit":{"type":"string"},"enable_error_log":{"type":"boolean"},"initial_duration":{"type":"string"},"jitter_limit":{"type":"string"},"maximum_duration":{"type":"string"},"retry_count":{"type":"integer"}}},"call_option":{"type":"object"},"connection_pool":{"type":"object","properties":{"enable_dns_resolver":{"type":"boolean"},"enable_rebalance":{"type":"boolean"},"old_conn_close_duration":{"type":"string"},"rebalance_duration":{"type":"string"},"size":{"type":"integer"}}},"dial_option":{"type":"object","properties":{"backoff_base_delay":{"type":"string"},"backoff_jitter":{"type":"number"},"backoff_max_delay":{"type":"string"},"backoff_multiplier":{"type":"number"},"enable_backoff":{"type":"boolean"},"initial_connection_window_size":{"type":"integer"},"initial_window_size":{"type":"integer"},"insecure":{"type":"boolean"},"keep_alive":{"type":"object","properties":{"permit_without_stream":{"type":"boolean"},"time":{"type":"string"},"timeout":{"type":"string"}}},"max_msg_size":{"type":"integer"},"min_connection_timeout":{"type":"string"},"read_buffer_size":{"type":"integer"},"tcp":{"type":"object","properties":{"dialer":{"type":"object","properties":{"dual_stack_enabled":{"type":"boolean"},"keep_alive":{"type":"string"},"timeout":{"type":"string"}}},"dns":{"type":"object","properties":{"cache_enabled":{"type":"boolean"},"cache_expiration":{"type":"string"},"refresh_duration":{"type":"string"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}}}},"timeout":{"type":"string"},"write_buffer_size":{"type":"integer"}}},"health_check_duration":{"type":"string"},"max_recv_msg_size":{"type":"integer"},"max_retry_rpc_buffer_size":{"type":"integer"},"max_send_msg_size":{"type":"integer"},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}},"wait_for_ready":{"type":"boolean"}}},"duration":{"type":"string"}}},"index_replica":{"type":"integer","minimum":1},"node_namespace":{"type":"string"}}},"hpa":{"type":"object","properties":{"enabled":{"type":"boolean"},"targetCPUUtilizationPercentage":{"type":"integer"}}},"image":{"type":"object","properties":{"pullPolicy":{"type":"string","enum":["Always","Never","IfNotPresent"]},"repository":{"type":"string"},"tag":{"type":"string"}}},"ingress":{"type":"object","properties":{"annotations":{"type":"object"},"enabled":{"type":"boolean"},"host":{"type":"string"},"pathType":{"type":"string"},"servicePort":{"type":"string"}}},"initContainers":{"type":"array","items":{"type":"object"}},"kind":{"type":"string","enum":["Deployment","DaemonSet"]},"logging":{"type":"object","properties":{"format":{"type":"string","enum":["raw","json"]},"level":{"type":"string","enum":["debug","info","warn","error","fatal"]},"logger":{"type":"string","enum":["glg","zap"]}}},"maxReplicas":{"type":"integer","minimum":0},"maxUnavailable":{"type":"string"},"minReplicas":{"type":"integer","minimum":0},"name":{"type":"string"},"nodeName":{"type":"string"},"nodeSelector":{"type":"object"},"observability":{"type":"object","properties":{"collector":{"type":"object","properties":{"duration":{"type":"string"},"metrics":{"type":"object","properties":{"enable_cgo":{"type":"boolean"},"enable_goroutine":{"type":"boolean"},"enable_memory":{"type":"boolean"},"enable_version_info":{"type":"boolean"},"version_info_labels":{"type":"array","items":{"type":"string","enum":["vald_version","server_name","git_commit","build_time","go_version","go_os","go_arch","cgo_enabled","ngt_version","build_cpu_info_flags"]}}}}}},"enabled":{"type":"boolean"},"jaeger":{"type":"object","properties":{"agent_endpoint":{"type":"string"},"buffer_max_count":{"type":"integer"},"collector_endpoint":{"type":"string"},"enabled":{"type":"boolean"},"password":{"type":"string"},"service_name":{"type":"string"},"username":{"type":"string"}}},"prometheus":{"type":"object","properties":{"enabled":{"type":"boolean"},"endpoint":{"type":"string"},"namespace":{"type":"string"}}},"stackdriver":{"type":"object","properties":{"client":{"type":"object","properties":{"api_key":{"type":"string"},"audiences":{"type":"array","items":{"type":"string"}},"authentication_enabled":{"type":"boolean"},"credentials_file":{"type":"string"},"credentials_json":{"type":"string"},"endpoint":{"type":"string"},"quota_project":{"type":"string"},"request_reason":{"type":"string"},"scopes":{"type":"array","items":{"type":"string"}},"telemetry_enabled":{"type":"boolean"},"user_agent":{"type":"string"}}},"exporter":{"type":"object","properties":{"bundle_count_threshold":{"type":"integer"},"bundle_delay_threshold":{"type":"string"},"location":{"type":"string"},"metric_prefix":{"type":"string"},"monitoring_enabled":{"type":"boolean"},"number_of_workers":{"type":"integer"},"reporting_interval":{"type":"string"},"skip_cmd":{"type":"boolean"},"timeout":{"type":"string"},"trace_spans_buffer_max_bytes":{"type":"integer"},"tracing_enabled":{"type":"boolean"}}},"profiler":{"type":"object","properties":{"alloc_force_gc":{"type":"boolean"},"alloc_profiling":{"type":"boolean"},"api_addr":{"type":"string"},"cpu_profiling":{"type":"boolean"},"debug_logging":{"type":"boolean"},"enabled":{"type":"boolean"},"goroutine_profiling":{"type":"boolean"},"heap_profiling":{"type":"boolean"},"instance":{"type":"string"},"mutex_profiling":{"type":"boolean"},"service":{"type":"string"},"service_version":{"type":"string"},"zone":{"type":"string"}}},"project_id":{"type":"string"}}},"trace":{"type":"object","properties":{"enabled":{"type":"boolean"},"sampling_rate":{"type":"number"}}}}},"podAnnotations":{"type":"object"},"podPriority":{"type":"object","properties":{"enabled":{"type":"boolean"},"value":{"type":"integer"}}},"podSecurityContext":{"type":"object"},"progressDeadlineSeconds":{"type":"integer"},"resources":{"type":"object","properties":{"limits":{"type":"object"},"requests":{"type":"object"}}},"revisionHistoryLimit":{"type":"integer","minimum":0},"rollingUpdate":{"type":"object","properties":{"maxSurge":{"type":"string"},"maxUnavailable":{"type":"string"}}},"securityContext":{"type":"object"},"server_config":{"type":"object","properties":{"full_shutdown_duration":{"type":"string"},"healths":{"type":"object","properties":{"liveness":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"livenessProbe":{"type":"object","properties":{"failureThreshold":{"type":"integer"},"httpGet":{"type":"object","properties":{"path":{"type":"string"},"port":{"type":"string"},"scheme":{"type":"string"}}},"initialDelaySeconds":{"type":"integer"},"periodSeconds":{"type":"integer"},"successThreshold":{"type":"integer"},"timetoutSeconds":{"type":"integer"}}},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}},"readiness":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"readinessProbe":{"type":"object","properties":{"failureThreshold":{"type":"integer"},"httpGet":{"type":"object","properties":{"path":{"type":"string"},"port":{"type":"string"},"scheme":{"type":"string"}}},"initialDelaySeconds":{"type":"integer"},"periodSeconds":{"type":"integer"},"successThreshold":{"type":"integer"},"timeoutSeconds":{"type":"integer"}}},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}}}},"metrics":{"type":"object","properties":{"pprof":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}},"prometheus":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}}}},"servers":{"type":"object","properties":{"grpc":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"grpc":{"type":"object","properties":{"bidirectional_stream_concurrency":{"type":"integer"},"connection_timeout":{"type":"string"},"header_table_size":{"type":"integer"},"initial_conn_window_size":{"type":"integer"},"initial_window_size":{"type":"integer"},"interceptors":{"type":"array","items":{"type":"string","enum":["RecoverInterceptor","AccessLogInterceptor","TracePayloadInterceptor"]}},"keepalive":{"type":"object","properties":{"max_conn_age":{"type":"string"},"max_conn_age_grace":{"type":"string"},"max_conn_idle":{"type":"string"},"time":{"type":"string"},"timeout":{"type":"string"}}},"max_header_list_size":{"type":"integer"},"max_receive_message_size":{"type":"integer"},"max_send_message_size":{"type":"integer"},"read_buffer_size":{"type":"integer"},"write_buffer_size":{"type":"integer"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"},"restart":{"type":"boolean"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}},"rest":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"handler_timeout":{"type":"string"},"http":{"type":"object"},"idle_timeout":{"type":"string"},"mode":{"type":"string"},"probe_wait_time":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}}}},"service":{"type":"object","properties":{"annotations":{"type":"object"},"labels":{"type":"object"}}},"serviceType":{"type":"string","enum":["ClusterIP","LoadBalancer","NodePort"]},"terminationGracePeriodSeconds":{"type":"integer","minimum":0},"time_zone":{"type":"string"},"tolerations":{"type":"array","items":{"type":"object"}},"topologySpreadConstraints":{"type":"array","items":{"type":"object"}},"version":{"type":"string","pattern":"^v[0-9]+\\.[0-9]+\\.[0-9]$"},"volumeMounts":{"type":"array","items":{"type":"object"}},"volumes":{"type":"array","items":{"type":"object"}}}},"meta":{"type":"object","properties":{"affinity":{"type":"object","properties":{"nodeAffinity":{"type":"object","properties":{"preferredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}},"requiredDuringSchedulingIgnoredDuringExecution":{"type":"object","properties":{"nodeSelectorTerms":{"type":"array","items":{"type":"object"}}}}}},"podAffinity":{"type":"object","properties":{"preferredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}},"requiredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}}}},"podAntiAffinity":{"type":"object","properties":{"preferredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}},"requiredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}}}}}},"annotations":{"type":"object"},"enabled":{"type":"boolean"},"env":{"type":"array","items":{"type":"object"}},"externalTrafficPolicy":{"type":"string"},"gateway_config":{"type":"object","properties":{"gateway_client":{"type":"object","properties":{"addrs":{"type":"array","items":{"type":"string"}},"backoff":{"type":"object","properties":{"backoff_factor":{"type":"number"},"backoff_time_limit":{"type":"string"},"enable_error_log":{"type":"boolean"},"initial_duration":{"type":"string"},"jitter_limit":{"type":"string"},"maximum_duration":{"type":"string"},"retry_count":{"type":"integer"}}},"call_option":{"type":"object"},"connection_pool":{"type":"object","properties":{"enable_dns_resolver":{"type":"boolean"},"enable_rebalance":{"type":"boolean"},"old_conn_close_duration":{"type":"string"},"rebalance_duration":{"type":"string"},"size":{"type":"integer"}}},"dial_option":{"type":"object","properties":{"backoff_base_delay":{"type":"string"},"backoff_jitter":{"type":"number"},"backoff_max_delay":{"type":"string"},"backoff_multiplier":{"type":"number"},"enable_backoff":{"type":"boolean"},"initial_connection_window_size":{"type":"integer"},"initial_window_size":{"type":"integer"},"insecure":{"type":"boolean"},"keep_alive":{"type":"object","properties":{"permit_without_stream":{"type":"boolean"},"time":{"type":"string"},"timeout":{"type":"string"}}},"max_msg_size":{"type":"integer"},"min_connection_timeout":{"type":"string"},"read_buffer_size":{"type":"integer"},"tcp":{"type":"object","properties":{"dialer":{"type":"object","properties":{"dual_stack_enabled":{"type":"boolean"},"keep_alive":{"type":"string"},"timeout":{"type":"string"}}},"dns":{"type":"object","properties":{"cache_enabled":{"type":"boolean"},"cache_expiration":{"type":"string"},"refresh_duration":{"type":"string"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}}}},"timeout":{"type":"string"},"write_buffer_size":{"type":"integer"}}},"health_check_duration":{"type":"string"},"max_recv_msg_size":{"type":"integer"},"max_retry_rpc_buffer_size":{"type":"integer"},"max_send_msg_size":{"type":"integer"},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}},"wait_for_ready":{"type":"boolean"}}},"meta":{"type":"object","properties":{"cache_expiration":{"type":"string"},"client":{"type":"object","properties":{"addrs":{"type":"array","items":{"type":"string"}},"backoff":{"type":"object","properties":{"backoff_factor":{"type":"number"},"backoff_time_limit":{"type":"string"},"enable_error_log":{"type":"boolean"},"initial_duration":{"type":"string"},"jitter_limit":{"type":"string"},"maximum_duration":{"type":"string"},"retry_count":{"type":"integer"}}},"call_option":{"type":"object"},"connection_pool":{"type":"object","properties":{"enable_dns_resolver":{"type":"boolean"},"enable_rebalance":{"type":"boolean"},"old_conn_close_duration":{"type":"string"},"rebalance_duration":{"type":"string"},"size":{"type":"integer"}}},"dial_option":{"type":"object","properties":{"backoff_base_delay":{"type":"string"},"backoff_jitter":{"type":"number"},"backoff_max_delay":{"type":"string"},"backoff_multiplier":{"type":"number"},"enable_backoff":{"type":"boolean"},"initial_connection_window_size":{"type":"integer"},"initial_window_size":{"type":"integer"},"insecure":{"type":"boolean"},"keep_alive":{"type":"object","properties":{"permit_without_stream":{"type":"boolean"},"time":{"type":"string"},"timeout":{"type":"string"}}},"max_msg_size":{"type":"integer"},"min_connection_timeout":{"type":"string"},"read_buffer_size":{"type":"integer"},"tcp":{"type":"object","properties":{"dialer":{"type":"object","properties":{"dual_stack_enabled":{"type":"boolean"},"keep_alive":{"type":"string"},"timeout":{"type":"string"}}},"dns":{"type":"object","properties":{"cache_enabled":{"type":"boolean"},"cache_expiration":{"type":"string"},"refresh_duration":{"type":"string"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}}}},"timeout":{"type":"string"},"write_buffer_size":{"type":"integer"}}},"health_check_duration":{"type":"string"},"max_recv_msg_size":{"type":"integer"},"max_retry_rpc_buffer_size":{"type":"integer"},"max_send_msg_size":{"type":"integer"},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}},"wait_for_ready":{"type":"boolean"}}},"enable_cache":{"type":"boolean"},"expired_cache_check_duration":{"type":"string"}}}}},"hpa":{"type":"object","properties":{"enabled":{"type":"boolean"},"targetCPUUtilizationPercentage":{"type":"integer"}}},"image":{"type":"object","properties":{"pullPolicy":{"type":"string","enum":["Always","Never","IfNotPresent"]},"repository":{"type":"string"},"tag":{"type":"string"}}},"ingress":{"type":"object","properties":{"annotations":{"type":"object"},"enabled":{"type":"boolean"},"host":{"type":"string"},"pathType":{"type":"string"},"servicePort":{"type":"string"}}},"initContainers":{"type":"array","items":{"type":"object"}},"kind":{"type":"string","enum":["Deployment","DaemonSet"]},"logging":{"type":"object","properties":{"format":{"type":"string","enum":["raw","json"]},"level":{"type":"string","enum":["debug","info","warn","error","fatal"]},"logger":{"type":"string","enum":["glg","zap"]}}},"maxReplicas":{"type":"integer","minimum":0},"maxUnavailable":{"type":"string"},"minReplicas":{"type":"integer","minimum":0},"name":{"type":"string"},"nodeName":{"type":"string"},"nodeSelector":{"type":"object"},"observability":{"type":"object","properties":{"collector":{"type":"object","properties":{"duration":{"type":"string"},"metrics":{"type":"object","properties":{"enable_cgo":{"type":"boolean"},"enable_goroutine":{"type":"boolean"},"enable_memory":{"type":"boolean"},"enable_version_info":{"type":"boolean"},"version_info_labels":{"type":"array","items":{"type":"string","enum":["vald_version","server_name","git_commit","build_time","go_version","go_os","go_arch","cgo_enabled","ngt_version","build_cpu_info_flags"]}}}}}},"enabled":{"type":"boolean"},"jaeger":{"type":"object","properties":{"agent_endpoint":{"type":"string"},"buffer_max_count":{"type":"integer"},"collector_endpoint":{"type":"string"},"enabled":{"type":"boolean"},"password":{"type":"string"},"service_name":{"type":"string"},"username":{"type":"string"}}},"prometheus":{"type":"object","properties":{"enabled":{"type":"boolean"},"endpoint":{"type":"string"},"namespace":{"type":"string"}}},"stackdriver":{"type":"object","properties":{"client":{"type":"object","properties":{"api_key":{"type":"string"},"audiences":{"type":"array","items":{"type":"string"}},"authentication_enabled":{"type":"boolean"},"credentials_file":{"type":"string"},"credentials_json":{"type":"string"},"endpoint":{"type":"string"},"quota_project":{"type":"string"},"request_reason":{"type":"string"},"scopes":{"type":"array","items":{"type":"string"}},"telemetry_enabled":{"type":"boolean"},"user_agent":{"type":"string"}}},"exporter":{"type":"object","properties":{"bundle_count_threshold":{"type":"integer"},"bundle_delay_threshold":{"type":"string"},"location":{"type":"string"},"metric_prefix":{"type":"string"},"monitoring_enabled":{"type":"boolean"},"number_of_workers":{"type":"integer"},"reporting_interval":{"type":"string"},"skip_cmd":{"type":"boolean"},"timeout":{"type":"string"},"trace_spans_buffer_max_bytes":{"type":"integer"},"tracing_enabled":{"type":"boolean"}}},"profiler":{"type":"object","properties":{"alloc_force_gc":{"type":"boolean"},"alloc_profiling":{"type":"boolean"},"api_addr":{"type":"string"},"cpu_profiling":{"type":"boolean"},"debug_logging":{"type":"boolean"},"enabled":{"type":"boolean"},"goroutine_profiling":{"type":"boolean"},"heap_profiling":{"type":"boolean"},"instance":{"type":"string"},"mutex_profiling":{"type":"boolean"},"service":{"type":"string"},"service_version":{"type":"string"},"zone":{"type":"string"}}},"project_id":{"type":"string"}}},"trace":{"type":"object","properties":{"enabled":{"type":"boolean"},"sampling_rate":{"type":"number"}}}}},"podAnnotations":{"type":"object"},"podPriority":{"type":"object","properties":{"enabled":{"type":"boolean"},"value":{"type":"integer"}}},"podSecurityContext":{"type":"object"},"progressDeadlineSeconds":{"type":"integer"},"resources":{"type":"object","properties":{"limits":{"type":"object"},"requests":{"type":"object"}}},"revisionHistoryLimit":{"type":"integer","minimum":0},"rollingUpdate":{"type":"object","properties":{"maxSurge":{"type":"string"},"maxUnavailable":{"type":"string"}}},"securityContext":{"type":"object"},"server_config":{"type":"object","properties":{"full_shutdown_duration":{"type":"string"},"healths":{"type":"object","properties":{"liveness":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"livenessProbe":{"type":"object","properties":{"failureThreshold":{"type":"integer"},"httpGet":{"type":"object","properties":{"path":{"type":"string"},"port":{"type":"string"},"scheme":{"type":"string"}}},"initialDelaySeconds":{"type":"integer"},"periodSeconds":{"type":"integer"},"successThreshold":{"type":"integer"},"timetoutSeconds":{"type":"integer"}}},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}},"readiness":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"readinessProbe":{"type":"object","properties":{"failureThreshold":{"type":"integer"},"httpGet":{"type":"object","properties":{"path":{"type":"string"},"port":{"type":"string"},"scheme":{"type":"string"}}},"initialDelaySeconds":{"type":"integer"},"periodSeconds":{"type":"integer"},"successThreshold":{"type":"integer"},"timeoutSeconds":{"type":"integer"}}},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}}}},"metrics":{"type":"object","properties":{"pprof":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}},"prometheus":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}}}},"servers":{"type":"object","properties":{"grpc":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"grpc":{"type":"object","properties":{"bidirectional_stream_concurrency":{"type":"integer"},"connection_timeout":{"type":"string"},"header_table_size":{"type":"integer"},"initial_conn_window_size":{"type":"integer"},"initial_window_size":{"type":"integer"},"interceptors":{"type":"array","items":{"type":"string","enum":["RecoverInterceptor","AccessLogInterceptor","TracePayloadInterceptor"]}},"keepalive":{"type":"object","properties":{"max_conn_age":{"type":"string"},"max_conn_age_grace":{"type":"string"},"max_conn_idle":{"type":"string"},"time":{"type":"string"},"timeout":{"type":"string"}}},"max_header_list_size":{"type":"integer"},"max_receive_message_size":{"type":"integer"},"max_send_message_size":{"type":"integer"},"read_buffer_size":{"type":"integer"},"write_buffer_size":{"type":"integer"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"},"restart":{"type":"boolean"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}},"rest":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"handler_timeout":{"type":"string"},"http":{"type":"object"},"idle_timeout":{"type":"string"},"mode":{"type":"string"},"probe_wait_time":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}}}},"service":{"type":"object","properties":{"annotations":{"type":"object"},"labels":{"type":"object"}}},"serviceType":{"type":"string","enum":["ClusterIP","LoadBalancer","NodePort"]},"terminationGracePeriodSeconds":{"type":"integer","minimum":0},"time_zone":{"type":"string"},"tolerations":{"type":"array","items":{"type":"object"}},"topologySpreadConstraints":{"type":"array","items":{"type":"object"}},"version":{"type":"string","pattern":"^v[0-9]+\\.[0-9]+\\.[0-9]$"},"volumeMounts":{"type":"array","items":{"type":"object"}},"volumes":{"type":"array","items":{"type":"object"}}}},"vald":{"type":"object","properties":{"affinity":{"type":"object","properties":{"nodeAffinity":{"type":"object","properties":{"preferredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}},"requiredDuringSchedulingIgnoredDuringExecution":{"type":"object","properties":{"nodeSelectorTerms":{"type":"array","items":{"type":"object"}}}}}},"podAffinity":{"type":"object","properties":{"preferredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}},"requiredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}}}},"podAntiAffinity":{"type":"object","properties":{"preferredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}},"requiredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}}}}}},"annotations":{"type":"object"},"enabled":{"type":"boolean"},"env":{"type":"array","items":{"type":"object"}},"externalTrafficPolicy":{"type":"string"},"gateway_config":{"type":"object","properties":{"agent_namespace":{"type":"string"},"backup":{"type":"object","properties":{"client":{"type":"object","properties":{"addrs":{"type":"array","items":{"type":"string"}},"backoff":{"type":"object","properties":{"backoff_factor":{"type":"number"},"backoff_time_limit":{"type":"string"},"enable_error_log":{"type":"boolean"},"initial_duration":{"type":"string"},"jitter_limit":{"type":"string"},"maximum_duration":{"type":"string"},"retry_count":{"type":"integer"}}},"call_option":{"type":"object"},"connection_pool":{"type":"object","properties":{"enable_dns_resolver":{"type":"boolean"},"enable_rebalance":{"type":"boolean"},"old_conn_close_duration":{"type":"string"},"rebalance_duration":{"type":"string"},"size":{"type":"integer"}}},"dial_option":{"type":"object","properties":{"backoff_base_delay":{"type":"string"},"backoff_jitter":{"type":"number"},"backoff_max_delay":{"type":"string"},"backoff_multiplier":{"type":"number"},"enable_backoff":{"type":"boolean"},"initial_connection_window_size":{"type":"integer"},"initial_window_size":{"type":"integer"},"insecure":{"type":"boolean"},"keep_alive":{"type":"object","properties":{"permit_without_stream":{"type":"boolean"},"time":{"type":"string"},"timeout":{"type":"string"}}},"max_msg_size":{"type":"integer"},"min_connection_timeout":{"type":"string"},"read_buffer_size":{"type":"integer"},"tcp":{"type":"object","properties":{"dialer":{"type":"object","properties":{"dual_stack_enabled":{"type":"boolean"},"keep_alive":{"type":"string"},"timeout":{"type":"string"}}},"dns":{"type":"object","properties":{"cache_enabled":{"type":"boolean"},"cache_expiration":{"type":"string"},"refresh_duration":{"type":"string"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}}}},"timeout":{"type":"string"},"write_buffer_size":{"type":"integer"}}},"health_check_duration":{"type":"string"},"max_recv_msg_size":{"type":"integer"},"max_retry_rpc_buffer_size":{"type":"integer"},"max_send_msg_size":{"type":"integer"},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}},"wait_for_ready":{"type":"boolean"}}}}},"discoverer":{"type":"object","properties":{"agent_client_options":{"type":"object","properties":{"addrs":{"type":"array","items":{"type":"string"}},"backoff":{"type":"object","properties":{"backoff_factor":{"type":"number"},"backoff_time_limit":{"type":"string"},"enable_error_log":{"type":"boolean"},"initial_duration":{"type":"string"},"jitter_limit":{"type":"string"},"maximum_duration":{"type":"string"},"retry_count":{"type":"integer"}}},"call_option":{"type":"object"},"connection_pool":{"type":"object","properties":{"enable_dns_resolver":{"type":"boolean"},"enable_rebalance":{"type":"boolean"},"old_conn_close_duration":{"type":"string"},"rebalance_duration":{"type":"string"},"size":{"type":"integer"}}},"dial_option":{"type":"object","properties":{"backoff_base_delay":{"type":"string"},"backoff_jitter":{"type":"number"},"backoff_max_delay":{"type":"string"},"backoff_multiplier":{"type":"number"},"enable_backoff":{"type":"boolean"},"initial_connection_window_size":{"type":"integer"},"initial_window_size":{"type":"integer"},"insecure":{"type":"boolean"},"keep_alive":{"type":"object","properties":{"permit_without_stream":{"type":"boolean"},"time":{"type":"string"},"timeout":{"type":"string"}}},"max_msg_size":{"type":"integer"},"min_connection_timeout":{"type":"string"},"read_buffer_size":{"type":"integer"},"tcp":{"type":"object","properties":{"dialer":{"type":"object","properties":{"dual_stack_enabled":{"type":"boolean"},"keep_alive":{"type":"string"},"timeout":{"type":"string"}}},"dns":{"type":"object","properties":{"cache_enabled":{"type":"boolean"},"cache_expiration":{"type":"string"},"refresh_duration":{"type":"string"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}}}},"timeout":{"type":"string"},"write_buffer_size":{"type":"integer"}}},"health_check_duration":{"type":"string"},"max_recv_msg_size":{"type":"integer"},"max_retry_rpc_buffer_size":{"type":"integer"},"max_send_msg_size":{"type":"integer"},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}},"wait_for_ready":{"type":"boolean"}}},"client":{"type":"object","properties":{"addrs":{"type":"array","items":{"type":"string"}},"backoff":{"type":"object","properties":{"backoff_factor":{"type":"number"},"backoff_time_limit":{"type":"string"},"enable_error_log":{"type":"boolean"},"initial_duration":{"type":"string"},"jitter_limit":{"type":"string"},"maximum_duration":{"type":"string"},"retry_count":{"type":"integer"}}},"call_option":{"type":"object"},"connection_pool":{"type":"object","properties":{"enable_dns_resolver":{"type":"boolean"},"enable_rebalance":{"type":"boolean"},"old_conn_close_duration":{"type":"string"},"rebalance_duration":{"type":"string"},"size":{"type":"integer"}}},"dial_option":{"type":"object","properties":{"backoff_base_delay":{"type":"string"},"backoff_jitter":{"type":"number"},"backoff_max_delay":{"type":"string"},"backoff_multiplier":{"type":"number"},"enable_backoff":{"type":"boolean"},"initial_connection_window_size":{"type":"integer"},"initial_window_size":{"type":"integer"},"insecure":{"type":"boolean"},"keep_alive":{"type":"object","properties":{"permit_without_stream":{"type":"boolean"},"time":{"type":"string"},"timeout":{"type":"string"}}},"max_msg_size":{"type":"integer"},"min_connection_timeout":{"type":"string"},"read_buffer_size":{"type":"integer"},"tcp":{"type":"object","properties":{"dialer":{"type":"object","properties":{"dual_stack_enabled":{"type":"boolean"},"keep_alive":{"type":"string"},"timeout":{"type":"string"}}},"dns":{"type":"object","properties":{"cache_enabled":{"type":"boolean"},"cache_expiration":{"type":"string"},"refresh_duration":{"type":"string"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}}}},"timeout":{"type":"string"},"write_buffer_size":{"type":"integer"}}},"health_check_duration":{"type":"string"},"max_recv_msg_size":{"type":"integer"},"max_retry_rpc_buffer_size":{"type":"integer"},"max_send_msg_size":{"type":"integer"},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}},"wait_for_ready":{"type":"boolean"}}},"duration":{"type":"string"}}},"index_replica":{"type":"integer","minimum":1},"meta":{"type":"object","properties":{"cache_expiration":{"type":"string"},"client":{"type":"object","properties":{"addrs":{"type":"array","items":{"type":"string"}},"backoff":{"type":"object","properties":{"backoff_factor":{"type":"number"},"backoff_time_limit":{"type":"string"},"enable_error_log":{"type":"boolean"},"initial_duration":{"type":"string"},"jitter_limit":{"type":"string"},"maximum_duration":{"type":"string"},"retry_count":{"type":"integer"}}},"call_option":{"type":"object"},"connection_pool":{"type":"object","properties":{"enable_dns_resolver":{"type":"boolean"},"enable_rebalance":{"type":"boolean"},"old_conn_close_duration":{"type":"string"},"rebalance_duration":{"type":"string"},"size":{"type":"integer"}}},"dial_option":{"type":"object","properties":{"backoff_base_delay":{"type":"string"},"backoff_jitter":{"type":"number"},"backoff_max_delay":{"type":"string"},"backoff_multiplier":{"type":"number"},"enable_backoff":{"type":"boolean"},"initial_connection_window_size":{"type":"integer"},"initial_window_size":{"type":"integer"},"insecure":{"type":"boolean"},"keep_alive":{"type":"object","properties":{"permit_without_stream":{"type":"boolean"},"time":{"type":"string"},"timeout":{"type":"string"}}},"max_msg_size":{"type":"integer"},"min_connection_timeout":{"type":"string"},"read_buffer_size":{"type":"integer"},"tcp":{"type":"object","properties":{"dialer":{"type":"object","properties":{"dual_stack_enabled":{"type":"boolean"},"keep_alive":{"type":"string"},"timeout":{"type":"string"}}},"dns":{"type":"object","properties":{"cache_enabled":{"type":"boolean"},"cache_expiration":{"type":"string"},"refresh_duration":{"type":"string"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}}}},"timeout":{"type":"string"},"write_buffer_size":{"type":"integer"}}},"health_check_duration":{"type":"string"},"max_recv_msg_size":{"type":"integer"},"max_retry_rpc_buffer_size":{"type":"integer"},"max_send_msg_size":{"type":"integer"},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}},"wait_for_ready":{"type":"boolean"}}},"enable_cache":{"type":"boolean"},"expired_cache_check_duration":{"type":"string"}}},"node_namespace":{"type":"string"}}},"hpa":{"type":"object","properties":{"enabled":{"type":"boolean"},"targetCPUUtilizationPercentage":{"type":"integer"}}},"image":{"type":"object","properties":{"pullPolicy":{"type":"string","enum":["Always","Never","IfNotPresent"]},"repository":{"type":"string"},"tag":{"type":"string"}}},"ingress":{"type":"object","properties":{"annotations":{"type":"object"},"enabled":{"type":"boolean"},"host":{"type":"string"},"pathType":{"type":"string"},"servicePort":{"type":"string"}}},"initContainers":{"type":"array","items":{"type":"object"}},"kind":{"type":"string","enum":["Deployment","DaemonSet"]},"logging":{"type":"object","properties":{"format":{"type":"string","enum":["raw","json"]},"level":{"type":"string","enum":["debug","info","warn","error","fatal"]},"logger":{"type":"string","enum":["glg","zap"]}}},"maxReplicas":{"type":"integer","minimum":0},"maxUnavailable":{"type":"string"},"minReplicas":{"type":"integer","minimum":0},"name":{"type":"string"},"nodeName":{"type":"string"},"nodeSelector":{"type":"object"},"observability":{"type":"object","properties":{"collector":{"type":"object","properties":{"duration":{"type":"string"},"metrics":{"type":"object","properties":{"enable_cgo":{"type":"boolean"},"enable_goroutine":{"type":"boolean"},"enable_memory":{"type":"boolean"},"enable_version_info":{"type":"boolean"},"version_info_labels":{"type":"array","items":{"type":"string","enum":["vald_version","server_name","git_commit","build_time","go_version","go_os","go_arch","cgo_enabled","ngt_version","build_cpu_info_flags"]}}}}}},"enabled":{"type":"boolean"},"jaeger":{"type":"object","properties":{"agent_endpoint":{"type":"string"},"buffer_max_count":{"type":"integer"},"collector_endpoint":{"type":"string"},"enabled":{"type":"boolean"},"password":{"type":"string"},"service_name":{"type":"string"},"username":{"type":"string"}}},"prometheus":{"type":"object","properties":{"enabled":{"type":"boolean"},"endpoint":{"type":"string"},"namespace":{"type":"string"}}},"stackdriver":{"type":"object","properties":{"client":{"type":"object","properties":{"api_key":{"type":"string"},"audiences":{"type":"array","items":{"type":"string"}},"authentication_enabled":{"type":"boolean"},"credentials_file":{"type":"string"},"credentials_json":{"type":"string"},"endpoint":{"type":"string"},"quota_project":{"type":"string"},"request_reason":{"type":"string"},"scopes":{"type":"array","items":{"type":"string"}},"telemetry_enabled":{"type":"boolean"},"user_agent":{"type":"string"}}},"exporter":{"type":"object","properties":{"bundle_count_threshold":{"type":"integer"},"bundle_delay_threshold":{"type":"string"},"location":{"type":"string"},"metric_prefix":{"type":"string"},"monitoring_enabled":{"type":"boolean"},"number_of_workers":{"type":"integer"},"reporting_interval":{"type":"string"},"skip_cmd":{"type":"boolean"},"timeout":{"type":"string"},"trace_spans_buffer_max_bytes":{"type":"integer"},"tracing_enabled":{"type":"boolean"}}},"profiler":{"type":"object","properties":{"alloc_force_gc":{"type":"boolean"},"alloc_profiling":{"type":"boolean"},"api_addr":{"type":"string"},"cpu_profiling":{"type":"boolean"},"debug_logging":{"type":"boolean"},"enabled":{"type":"boolean"},"goroutine_profiling":{"type":"boolean"},"heap_profiling":{"type":"boolean"},"instance":{"type":"string"},"mutex_profiling":{"type":"boolean"},"service":{"type":"string"},"service_version":{"type":"string"},"zone":{"type":"string"}}},"project_id":{"type":"string"}}},"trace":{"type":"object","properties":{"enabled":{"type":"boolean"},"sampling_rate":{"type":"number"}}}}},"podAnnotations":{"type":"object"},"podPriority":{"type":"object","properties":{"enabled":{"type":"boolean"},"value":{"type":"integer"}}},"podSecurityContext":{"type":"object"},"progressDeadlineSeconds":{"type":"integer"},"resources":{"type":"object","properties":{"limits":{"type":"object"},"requests":{"type":"object"}}},"revisionHistoryLimit":{"type":"integer","minimum":0},"rollingUpdate":{"type":"object","properties":{"maxSurge":{"type":"string"},"maxUnavailable":{"type":"string"}}},"securityContext":{"type":"object"},"server_config":{"type":"object","properties":{"full_shutdown_duration":{"type":"string"},"healths":{"type":"object","properties":{"liveness":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"livenessProbe":{"type":"object","properties":{"failureThreshold":{"type":"integer"},"httpGet":{"type":"object","properties":{"path":{"type":"string"},"port":{"type":"string"},"scheme":{"type":"string"}}},"initialDelaySeconds":{"type":"integer"},"periodSeconds":{"type":"integer"},"successThreshold":{"type":"integer"},"timetoutSeconds":{"type":"integer"}}},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}},"readiness":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"readinessProbe":{"type":"object","properties":{"failureThreshold":{"type":"integer"},"httpGet":{"type":"object","properties":{"path":{"type":"string"},"port":{"type":"string"},"scheme":{"type":"string"}}},"initialDelaySeconds":{"type":"integer"},"periodSeconds":{"type":"integer"},"successThreshold":{"type":"integer"},"timeoutSeconds":{"type":"integer"}}},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}}}},"metrics":{"type":"object","properties":{"pprof":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}},"prometheus":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}}}},"servers":{"type":"object","properties":{"grpc":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"grpc":{"type":"object","properties":{"bidirectional_stream_concurrency":{"type":"integer"},"connection_timeout":{"type":"string"},"header_table_size":{"type":"integer"},"initial_conn_window_size":{"type":"integer"},"initial_window_size":{"type":"integer"},"interceptors":{"type":"array","items":{"type":"string","enum":["RecoverInterceptor","AccessLogInterceptor","TracePayloadInterceptor"]}},"keepalive":{"type":"object","properties":{"max_conn_age":{"type":"string"},"max_conn_age_grace":{"type":"string"},"max_conn_idle":{"type":"string"},"time":{"type":"string"},"timeout":{"type":"string"}}},"max_header_list_size":{"type":"integer"},"max_receive_message_size":{"type":"integer"},"max_send_message_size":{"type":"integer"},"read_buffer_size":{"type":"integer"},"write_buffer_size":{"type":"integer"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"},"restart":{"type":"boolean"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}},"rest":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"handler_timeout":{"type":"string"},"http":{"type":"object"},"idle_timeout":{"type":"string"},"mode":{"type":"string"},"probe_wait_time":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}}}},"service":{"type":"object","properties":{"annotations":{"type":"object"},"labels":{"type":"object"}}},"serviceType":{"type":"string","enum":["ClusterIP","LoadBalancer","NodePort"]},"terminationGracePeriodSeconds":{"type":"integer","minimum":0},"time_zone":{"type":"string"},"tolerations":{"type":"array","items":{"type":"object"}},"topologySpreadConstraints":{"type":"array","items":{"type":"object"}},"version":{"type":"string","pattern":"^v[0-9]+\\.[0-9]+\\.[0-9]$"},"volumeMounts":{"type":"array","items":{"type":"object"}},"volumes":{"type":"array","items":{"type":"object"}}}}}},"manager":{"type":"object","properties":{"backup":{"type":"object","properties":{"affinity":{"type":"object","properties":{"nodeAffinity":{"type":"object","properties":{"preferredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}},"requiredDuringSchedulingIgnoredDuringExecution":{"type":"object","properties":{"nodeSelectorTerms":{"type":"array","items":{"type":"object"}}}}}},"podAffinity":{"type":"object","properties":{"preferredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}},"requiredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}}}},"podAntiAffinity":{"type":"object","properties":{"preferredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}},"requiredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}}}}}},"annotations":{"type":"object"},"cassandra":{"type":"object","properties":{"config":{"type":"object","properties":{"connect_timeout":{"type":"string"},"consistency":{"type":"string","enum":["any","one","two","three","all","quorum","localquorum","eachquorum","localone"]},"cql_version":{"type":"string"},"default_idempotence":{"type":"boolean"},"default_timestamp":{"type":"boolean"},"disable_initial_host_lookup":{"type":"boolean"},"disable_node_status_events":{"type":"boolean"},"disable_skip_metadata":{"type":"boolean"},"disable_topology_events":{"type":"boolean"},"enable_host_verification":{"type":"boolean"},"host_filter":{"type":"object","properties":{"data_center":{"type":"string"},"enabled":{"type":"boolean"},"white_list":{"type":"array","items":{"type":"string"}}}},"hosts":{"type":"array","items":{"type":"string"}},"ignore_peer_addr":{"type":"boolean"},"keyspace":{"type":"string"},"max_prepared_stmts":{"type":"integer"},"max_routing_key_info":{"type":"integer"},"max_wait_schema_agreement":{"type":"string"},"num_conns":{"type":"integer"},"page_size":{"type":"integer"},"password":{"type":"string"},"pool_config":{"type":"object","properties":{"data_center":{"type":"string"},"dc_aware_routing":{"type":"boolean"},"non_local_replicas_fallback":{"type":"boolean"},"shuffle_replicas":{"type":"boolean"},"token_aware_host_policy":{"type":"boolean"}}},"port":{"type":"integer"},"proto_version":{"type":"integer"},"reconnect_interval":{"type":"string"},"reconnection_policy":{"type":"object","properties":{"initial_interval":{"type":"string"},"max_retries":{"type":"integer"}}},"retry_policy":{"type":"object","properties":{"max_duration":{"type":"string"},"min_duration":{"type":"string"},"num_retries":{"type":"integer"}}},"serial_consistency":{"type":"string","enum":["localserial","serial"]},"socket_keepalive":{"type":"string"},"tcp":{"type":"object","properties":{"dialer":{"type":"object","properties":{"dual_stack_enabled":{"type":"boolean"},"keep_alive":{"type":"string"},"timeout":{"type":"string"}}},"dns":{"type":"object","properties":{"cache_enabled":{"type":"boolean"},"cache_expiration":{"type":"string"},"refresh_duration":{"type":"string"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}}}},"timeout":{"type":"string"},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}},"username":{"type":"string"},"vector_backup_table":{"type":"string"},"write_coalesce_wait_time":{"type":"string"}}},"enabled":{"type":"boolean"}}},"enabled":{"type":"boolean"},"env":{"type":"array","items":{"type":"object"}},"externalTrafficPolicy":{"type":"string"},"hpa":{"type":"object","properties":{"enabled":{"type":"boolean"},"targetCPUUtilizationPercentage":{"type":"integer"}}},"image":{"type":"object","properties":{"pullPolicy":{"type":"string","enum":["Always","Never","IfNotPresent"]},"repository":{"type":"string"},"tag":{"type":"string"}}},"initContainers":{"type":"array","items":{"type":"object"}},"kind":{"type":"string","enum":["Deployment","DaemonSet"]},"logging":{"type":"object","properties":{"format":{"type":"string","enum":["raw","json"]},"level":{"type":"string","enum":["debug","info","warn","error","fatal"]},"logger":{"type":"string","enum":["glg","zap"]}}},"maxReplicas":{"type":"integer","minimum":0},"maxUnavailable":{"type":"string"},"minReplicas":{"type":"integer","minimum":0},"mysql":{"type":"object","properties":{"config":{"type":"object","properties":{"conn_max_life_time":{"type":"string"},"db":{"type":"string","enum":["mysql","postgres","sqlite3"]},"host":{"type":"string"},"max_idle_conns":{"type":"integer"},"max_open_conns":{"type":"integer"},"name":{"type":"string"},"pass":{"type":"string"},"port":{"type":"integer"},"tcp":{"type":"object","properties":{"dialer":{"type":"object","properties":{"dual_stack_enabled":{"type":"boolean"},"keep_alive":{"type":"string"},"timeout":{"type":"string"}}},"dns":{"type":"object","properties":{"cache_enabled":{"type":"boolean"},"cache_expiration":{"type":"string"},"refresh_duration":{"type":"string"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}},"user":{"type":"string"}}},"enabled":{"type":"boolean"}}},"name":{"type":"string"},"nodeName":{"type":"string"},"nodeSelector":{"type":"object"},"observability":{"type":"object","properties":{"collector":{"type":"object","properties":{"duration":{"type":"string"},"metrics":{"type":"object","properties":{"enable_cgo":{"type":"boolean"},"enable_goroutine":{"type":"boolean"},"enable_memory":{"type":"boolean"},"enable_version_info":{"type":"boolean"},"version_info_labels":{"type":"array","items":{"type":"string","enum":["vald_version","server_name","git_commit","build_time","go_version","go_os","go_arch","cgo_enabled","ngt_version","build_cpu_info_flags"]}}}}}},"enabled":{"type":"boolean"},"jaeger":{"type":"object","properties":{"agent_endpoint":{"type":"string"},"buffer_max_count":{"type":"integer"},"collector_endpoint":{"type":"string"},"enabled":{"type":"boolean"},"password":{"type":"string"},"service_name":{"type":"string"},"username":{"type":"string"}}},"prometheus":{"type":"object","properties":{"enabled":{"type":"boolean"},"endpoint":{"type":"string"},"namespace":{"type":"string"}}},"stackdriver":{"type":"object","properties":{"client":{"type":"object","properties":{"api_key":{"type":"string"},"audiences":{"type":"array","items":{"type":"string"}},"authentication_enabled":{"type":"boolean"},"credentials_file":{"type":"string"},"credentials_json":{"type":"string"},"endpoint":{"type":"string"},"quota_project":{"type":"string"},"request_reason":{"type":"string"},"scopes":{"type":"array","items":{"type":"string"}},"telemetry_enabled":{"type":"boolean"},"user_agent":{"type":"string"}}},"exporter":{"type":"object","properties":{"bundle_count_threshold":{"type":"integer"},"bundle_delay_threshold":{"type":"string"},"location":{"type":"string"},"metric_prefix":{"type":"string"},"monitoring_enabled":{"type":"boolean"},"number_of_workers":{"type":"integer"},"reporting_interval":{"type":"string"},"skip_cmd":{"type":"boolean"},"timeout":{"type":"string"},"trace_spans_buffer_max_bytes":{"type":"integer"},"tracing_enabled":{"type":"boolean"}}},"profiler":{"type":"object","properties":{"alloc_force_gc":{"type":"boolean"},"alloc_profiling":{"type":"boolean"},"api_addr":{"type":"string"},"cpu_profiling":{"type":"boolean"},"debug_logging":{"type":"boolean"},"enabled":{"type":"boolean"},"goroutine_profiling":{"type":"boolean"},"heap_profiling":{"type":"boolean"},"instance":{"type":"string"},"mutex_profiling":{"type":"boolean"},"service":{"type":"string"},"service_version":{"type":"string"},"zone":{"type":"string"}}},"project_id":{"type":"string"}}},"trace":{"type":"object","properties":{"enabled":{"type":"boolean"},"sampling_rate":{"type":"number"}}}}},"podAnnotations":{"type":"object"},"podPriority":{"type":"object","properties":{"enabled":{"type":"boolean"},"value":{"type":"integer"}}},"podSecurityContext":{"type":"object"},"progressDeadlineSeconds":{"type":"integer"},"resources":{"type":"object","properties":{"limits":{"type":"object"},"requests":{"type":"object"}}},"revisionHistoryLimit":{"type":"integer","minimum":0},"rollingUpdate":{"type":"object","properties":{"maxSurge":{"type":"string"},"maxUnavailable":{"type":"string"}}},"securityContext":{"type":"object"},"server_config":{"type":"object","properties":{"full_shutdown_duration":{"type":"string"},"healths":{"type":"object","properties":{"liveness":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"livenessProbe":{"type":"object","properties":{"failureThreshold":{"type":"integer"},"httpGet":{"type":"object","properties":{"path":{"type":"string"},"port":{"type":"string"},"scheme":{"type":"string"}}},"initialDelaySeconds":{"type":"integer"},"periodSeconds":{"type":"integer"},"successThreshold":{"type":"integer"},"timetoutSeconds":{"type":"integer"}}},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}},"readiness":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"readinessProbe":{"type":"object","properties":{"failureThreshold":{"type":"integer"},"httpGet":{"type":"object","properties":{"path":{"type":"string"},"port":{"type":"string"},"scheme":{"type":"string"}}},"initialDelaySeconds":{"type":"integer"},"periodSeconds":{"type":"integer"},"successThreshold":{"type":"integer"},"timeoutSeconds":{"type":"integer"}}},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}}}},"metrics":{"type":"object","properties":{"pprof":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}},"prometheus":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}}}},"servers":{"type":"object","properties":{"grpc":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"grpc":{"type":"object","properties":{"bidirectional_stream_concurrency":{"type":"integer"},"connection_timeout":{"type":"string"},"header_table_size":{"type":"integer"},"initial_conn_window_size":{"type":"integer"},"initial_window_size":{"type":"integer"},"interceptors":{"type":"array","items":{"type":"string","enum":["RecoverInterceptor","AccessLogInterceptor","TracePayloadInterceptor"]}},"keepalive":{"type":"object","properties":{"max_conn_age":{"type":"string"},"max_conn_age_grace":{"type":"string"},"max_conn_idle":{"type":"string"},"time":{"type":"string"},"timeout":{"type":"string"}}},"max_header_list_size":{"type":"integer"},"max_receive_message_size":{"type":"integer"},"max_send_message_size":{"type":"integer"},"read_buffer_size":{"type":"integer"},"write_buffer_size":{"type":"integer"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"},"restart":{"type":"boolean"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}},"rest":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"handler_timeout":{"type":"string"},"http":{"type":"object"},"idle_timeout":{"type":"string"},"mode":{"type":"string"},"probe_wait_time":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}}}},"service":{"type":"object","properties":{"annotations":{"type":"object"},"labels":{"type":"object"}}},"serviceType":{"type":"string","enum":["ClusterIP","LoadBalancer","NodePort"]},"terminationGracePeriodSeconds":{"type":"integer","minimum":0},"time_zone":{"type":"string"},"tolerations":{"type":"array","items":{"type":"object"}},"topologySpreadConstraints":{"type":"array","items":{"type":"object"}},"version":{"type":"string","pattern":"^v[0-9]+\\.[0-9]+\\.[0-9]$"},"volumeMounts":{"type":"array","items":{"type":"object"}},"volumes":{"type":"array","items":{"type":"object"}}}},"compressor":{"type":"object","properties":{"affinity":{"type":"object","properties":{"nodeAffinity":{"type":"object","properties":{"preferredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}},"requiredDuringSchedulingIgnoredDuringExecution":{"type":"object","properties":{"nodeSelectorTerms":{"type":"array","items":{"type":"object"}}}}}},"podAffinity":{"type":"object","properties":{"preferredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}},"requiredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}}}},"podAntiAffinity":{"type":"object","properties":{"preferredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}},"requiredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}}}}}},"annotations":{"type":"object"},"backup":{"type":"object","properties":{"client":{"type":"object","properties":{"addrs":{"type":"array","items":{"type":"string"}},"backoff":{"type":"object","properties":{"backoff_factor":{"type":"number"},"backoff_time_limit":{"type":"string"},"enable_error_log":{"type":"boolean"},"initial_duration":{"type":"string"},"jitter_limit":{"type":"string"},"maximum_duration":{"type":"string"},"retry_count":{"type":"integer"}}},"call_option":{"type":"object"},"connection_pool":{"type":"object","properties":{"enable_dns_resolver":{"type":"boolean"},"enable_rebalance":{"type":"boolean"},"old_conn_close_duration":{"type":"string"},"rebalance_duration":{"type":"string"},"size":{"type":"integer"}}},"dial_option":{"type":"object","properties":{"backoff_base_delay":{"type":"string"},"backoff_jitter":{"type":"number"},"backoff_max_delay":{"type":"string"},"backoff_multiplier":{"type":"number"},"enable_backoff":{"type":"boolean"},"initial_connection_window_size":{"type":"integer"},"initial_window_size":{"type":"integer"},"insecure":{"type":"boolean"},"keep_alive":{"type":"object","properties":{"permit_without_stream":{"type":"boolean"},"time":{"type":"string"},"timeout":{"type":"string"}}},"max_msg_size":{"type":"integer"},"min_connection_timeout":{"type":"string"},"read_buffer_size":{"type":"integer"},"tcp":{"type":"object","properties":{"dialer":{"type":"object","properties":{"dual_stack_enabled":{"type":"boolean"},"keep_alive":{"type":"string"},"timeout":{"type":"string"}}},"dns":{"type":"object","properties":{"cache_enabled":{"type":"boolean"},"cache_expiration":{"type":"string"},"refresh_duration":{"type":"string"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}}}},"timeout":{"type":"string"},"write_buffer_size":{"type":"integer"}}},"health_check_duration":{"type":"string"},"max_recv_msg_size":{"type":"integer"},"max_retry_rpc_buffer_size":{"type":"integer"},"max_send_msg_size":{"type":"integer"},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}},"wait_for_ready":{"type":"boolean"}}}}},"compress":{"type":"object","properties":{"compress_algorithm":{"type":"string","enum":["gob","gzip","lz4","zstd"]},"compression_level":{"type":"integer"},"concurrent_limit":{"type":"integer"},"queue_check_duration":{"type":"string"}}},"enabled":{"type":"boolean"},"env":{"type":"array","items":{"type":"object"}},"externalTrafficPolicy":{"type":"string"},"hpa":{"type":"object","properties":{"enabled":{"type":"boolean"},"targetCPUUtilizationPercentage":{"type":"integer"}}},"image":{"type":"object","properties":{"pullPolicy":{"type":"string","enum":["Always","Never","IfNotPresent"]},"repository":{"type":"string"},"tag":{"type":"string"}}},"initContainers":{"type":"array","items":{"type":"object"}},"kind":{"type":"string","enum":["Deployment","DaemonSet"]},"logging":{"type":"object","properties":{"format":{"type":"string","enum":["raw","json"]},"level":{"type":"string","enum":["debug","info","warn","error","fatal"]},"logger":{"type":"string","enum":["glg","zap"]}}},"maxReplicas":{"type":"integer","minimum":0},"maxUnavailable":{"type":"string"},"minReplicas":{"type":"integer","minimum":0},"name":{"type":"string"},"nodeName":{"type":"string"},"nodeSelector":{"type":"object"},"observability":{"type":"object","properties":{"collector":{"type":"object","properties":{"duration":{"type":"string"},"metrics":{"type":"object","properties":{"enable_cgo":{"type":"boolean"},"enable_goroutine":{"type":"boolean"},"enable_memory":{"type":"boolean"},"enable_version_info":{"type":"boolean"},"version_info_labels":{"type":"array","items":{"type":"string","enum":["vald_version","server_name","git_commit","build_time","go_version","go_os","go_arch","cgo_enabled","ngt_version","build_cpu_info_flags"]}}}}}},"enabled":{"type":"boolean"},"jaeger":{"type":"object","properties":{"agent_endpoint":{"type":"string"},"buffer_max_count":{"type":"integer"},"collector_endpoint":{"type":"string"},"enabled":{"type":"boolean"},"password":{"type":"string"},"service_name":{"type":"string"},"username":{"type":"string"}}},"prometheus":{"type":"object","properties":{"enabled":{"type":"boolean"},"endpoint":{"type":"string"},"namespace":{"type":"string"}}},"stackdriver":{"type":"object","properties":{"client":{"type":"object","properties":{"api_key":{"type":"string"},"audiences":{"type":"array","items":{"type":"string"}},"authentication_enabled":{"type":"boolean"},"credentials_file":{"type":"string"},"credentials_json":{"type":"string"},"endpoint":{"type":"string"},"quota_project":{"type":"string"},"request_reason":{"type":"string"},"scopes":{"type":"array","items":{"type":"string"}},"telemetry_enabled":{"type":"boolean"},"user_agent":{"type":"string"}}},"exporter":{"type":"object","properties":{"bundle_count_threshold":{"type":"integer"},"bundle_delay_threshold":{"type":"string"},"location":{"type":"string"},"metric_prefix":{"type":"string"},"monitoring_enabled":{"type":"boolean"},"number_of_workers":{"type":"integer"},"reporting_interval":{"type":"string"},"skip_cmd":{"type":"boolean"},"timeout":{"type":"string"},"trace_spans_buffer_max_bytes":{"type":"integer"},"tracing_enabled":{"type":"boolean"}}},"profiler":{"type":"object","properties":{"alloc_force_gc":{"type":"boolean"},"alloc_profiling":{"type":"boolean"},"api_addr":{"type":"string"},"cpu_profiling":{"type":"boolean"},"debug_logging":{"type":"boolean"},"enabled":{"type":"boolean"},"goroutine_profiling":{"type":"boolean"},"heap_profiling":{"type":"boolean"},"instance":{"type":"string"},"mutex_profiling":{"type":"boolean"},"service":{"type":"string"},"service_version":{"type":"string"},"zone":{"type":"string"}}},"project_id":{"type":"string"}}},"trace":{"type":"object","properties":{"enabled":{"type":"boolean"},"sampling_rate":{"type":"number"}}}}},"podAnnotations":{"type":"object"},"podPriority":{"type":"object","properties":{"enabled":{"type":"boolean"},"value":{"type":"integer"}}},"podSecurityContext":{"type":"object"},"progressDeadlineSeconds":{"type":"integer"},"registerer":{"type":"object","properties":{"compressor":{"type":"object","properties":{"client":{"type":"object","properties":{"addrs":{"type":"array","items":{"type":"string"}},"backoff":{"type":"object","properties":{"backoff_factor":{"type":"number"},"backoff_time_limit":{"type":"string"},"enable_error_log":{"type":"boolean"},"initial_duration":{"type":"string"},"jitter_limit":{"type":"string"},"maximum_duration":{"type":"string"},"retry_count":{"type":"integer"}}},"call_option":{"type":"object"},"connection_pool":{"type":"object","properties":{"enable_dns_resolver":{"type":"boolean"},"enable_rebalance":{"type":"boolean"},"old_conn_close_duration":{"type":"string"},"rebalance_duration":{"type":"string"},"size":{"type":"integer"}}},"dial_option":{"type":"object","properties":{"backoff_base_delay":{"type":"string"},"backoff_jitter":{"type":"number"},"backoff_max_delay":{"type":"string"},"backoff_multiplier":{"type":"number"},"enable_backoff":{"type":"boolean"},"initial_connection_window_size":{"type":"integer"},"initial_window_size":{"type":"integer"},"insecure":{"type":"boolean"},"keep_alive":{"type":"object","properties":{"permit_without_stream":{"type":"boolean"},"time":{"type":"string"},"timeout":{"type":"string"}}},"max_msg_size":{"type":"integer"},"min_connection_timeout":{"type":"string"},"read_buffer_size":{"type":"integer"},"tcp":{"type":"object","properties":{"dialer":{"type":"object","properties":{"dual_stack_enabled":{"type":"boolean"},"keep_alive":{"type":"string"},"timeout":{"type":"string"}}},"dns":{"type":"object","properties":{"cache_enabled":{"type":"boolean"},"cache_expiration":{"type":"string"},"refresh_duration":{"type":"string"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}}}},"timeout":{"type":"string"},"write_buffer_size":{"type":"integer"}}},"health_check_duration":{"type":"string"},"max_recv_msg_size":{"type":"integer"},"max_retry_rpc_buffer_size":{"type":"integer"},"max_send_msg_size":{"type":"integer"},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}},"wait_for_ready":{"type":"boolean"}}}}},"concurrent_limit":{"type":"integer"},"queue_check_duration":{"type":"string"}}},"resources":{"type":"object","properties":{"limits":{"type":"object"},"requests":{"type":"object"}}},"revisionHistoryLimit":{"type":"integer","minimum":0},"rollingUpdate":{"type":"object","properties":{"maxSurge":{"type":"string"},"maxUnavailable":{"type":"string"}}},"securityContext":{"type":"object"},"server_config":{"type":"object","properties":{"full_shutdown_duration":{"type":"string"},"healths":{"type":"object","properties":{"liveness":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"livenessProbe":{"type":"object","properties":{"failureThreshold":{"type":"integer"},"httpGet":{"type":"object","properties":{"path":{"type":"string"},"port":{"type":"string"},"scheme":{"type":"string"}}},"initialDelaySeconds":{"type":"integer"},"periodSeconds":{"type":"integer"},"successThreshold":{"type":"integer"},"timetoutSeconds":{"type":"integer"}}},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}},"readiness":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"readinessProbe":{"type":"object","properties":{"failureThreshold":{"type":"integer"},"httpGet":{"type":"object","properties":{"path":{"type":"string"},"port":{"type":"string"},"scheme":{"type":"string"}}},"initialDelaySeconds":{"type":"integer"},"periodSeconds":{"type":"integer"},"successThreshold":{"type":"integer"},"timeoutSeconds":{"type":"integer"}}},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}}}},"metrics":{"type":"object","properties":{"pprof":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}},"prometheus":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}}}},"servers":{"type":"object","properties":{"grpc":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"grpc":{"type":"object","properties":{"bidirectional_stream_concurrency":{"type":"integer"},"connection_timeout":{"type":"string"},"header_table_size":{"type":"integer"},"initial_conn_window_size":{"type":"integer"},"initial_window_size":{"type":"integer"},"interceptors":{"type":"array","items":{"type":"string","enum":["RecoverInterceptor","AccessLogInterceptor","TracePayloadInterceptor"]}},"keepalive":{"type":"object","properties":{"max_conn_age":{"type":"string"},"max_conn_age_grace":{"type":"string"},"max_conn_idle":{"type":"string"},"time":{"type":"string"},"timeout":{"type":"string"}}},"max_header_list_size":{"type":"integer"},"max_receive_message_size":{"type":"integer"},"max_send_message_size":{"type":"integer"},"read_buffer_size":{"type":"integer"},"write_buffer_size":{"type":"integer"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"},"restart":{"type":"boolean"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}},"rest":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"handler_timeout":{"type":"string"},"http":{"type":"object"},"idle_timeout":{"type":"string"},"mode":{"type":"string"},"probe_wait_time":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}}}},"service":{"type":"object","properties":{"annotations":{"type":"object"},"labels":{"type":"object"}}},"serviceType":{"type":"string","enum":["ClusterIP","LoadBalancer","NodePort"]},"terminationGracePeriodSeconds":{"type":"integer","minimum":0},"time_zone":{"type":"string"},"tolerations":{"type":"array","items":{"type":"object"}},"topologySpreadConstraints":{"type":"array","items":{"type":"object"}},"version":{"type":"string","pattern":"^v[0-9]+\\.[0-9]+\\.[0-9]$"},"volumeMounts":{"type":"array","items":{"type":"object"}},"volumes":{"type":"array","items":{"type":"object"}}}},"index":{"type":"object","properties":{"affinity":{"type":"object","properties":{"nodeAffinity":{"type":"object","properties":{"preferredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}},"requiredDuringSchedulingIgnoredDuringExecution":{"type":"object","properties":{"nodeSelectorTerms":{"type":"array","items":{"type":"object"}}}}}},"podAffinity":{"type":"object","properties":{"preferredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}},"requiredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}}}},"podAntiAffinity":{"type":"object","properties":{"preferredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}},"requiredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}}}}}},"annotations":{"type":"object"},"enabled":{"type":"boolean"},"env":{"type":"array","items":{"type":"object"}},"externalTrafficPolicy":{"type":"string"},"image":{"type":"object","properties":{"pullPolicy":{"type":"string","enum":["Always","Never","IfNotPresent"]},"repository":{"type":"string"},"tag":{"type":"string"}}},"indexer":{"type":"object","properties":{"agent_namespace":{"type":"string"},"auto_index_check_duration":{"type":"string"},"auto_index_duration_limit":{"type":"string"},"auto_index_length":{"type":"integer"},"concurrency":{"type":"integer","minimum":1},"creation_pool_size":{"type":"integer"},"discoverer":{"type":"object","properties":{"agent_client_options":{"type":"object","properties":{"addrs":{"type":"array","items":{"type":"string"}},"backoff":{"type":"object","properties":{"backoff_factor":{"type":"number"},"backoff_time_limit":{"type":"string"},"enable_error_log":{"type":"boolean"},"initial_duration":{"type":"string"},"jitter_limit":{"type":"string"},"maximum_duration":{"type":"string"},"retry_count":{"type":"integer"}}},"call_option":{"type":"object"},"connection_pool":{"type":"object","properties":{"enable_dns_resolver":{"type":"boolean"},"enable_rebalance":{"type":"boolean"},"old_conn_close_duration":{"type":"string"},"rebalance_duration":{"type":"string"},"size":{"type":"integer"}}},"dial_option":{"type":"object","properties":{"backoff_base_delay":{"type":"string"},"backoff_jitter":{"type":"number"},"backoff_max_delay":{"type":"string"},"backoff_multiplier":{"type":"number"},"enable_backoff":{"type":"boolean"},"initial_connection_window_size":{"type":"integer"},"initial_window_size":{"type":"integer"},"insecure":{"type":"boolean"},"keep_alive":{"type":"object","properties":{"permit_without_stream":{"type":"boolean"},"time":{"type":"string"},"timeout":{"type":"string"}}},"max_msg_size":{"type":"integer"},"min_connection_timeout":{"type":"string"},"read_buffer_size":{"type":"integer"},"tcp":{"type":"object","properties":{"dialer":{"type":"object","properties":{"dual_stack_enabled":{"type":"boolean"},"keep_alive":{"type":"string"},"timeout":{"type":"string"}}},"dns":{"type":"object","properties":{"cache_enabled":{"type":"boolean"},"cache_expiration":{"type":"string"},"refresh_duration":{"type":"string"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}}}},"timeout":{"type":"string"},"write_buffer_size":{"type":"integer"}}},"health_check_duration":{"type":"string"},"max_recv_msg_size":{"type":"integer"},"max_retry_rpc_buffer_size":{"type":"integer"},"max_send_msg_size":{"type":"integer"},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}},"wait_for_ready":{"type":"boolean"}}},"client":{"type":"object","properties":{"addrs":{"type":"array","items":{"type":"string"}},"backoff":{"type":"object","properties":{"backoff_factor":{"type":"number"},"backoff_time_limit":{"type":"string"},"enable_error_log":{"type":"boolean"},"initial_duration":{"type":"string"},"jitter_limit":{"type":"string"},"maximum_duration":{"type":"string"},"retry_count":{"type":"integer"}}},"call_option":{"type":"object"},"connection_pool":{"type":"object","properties":{"enable_dns_resolver":{"type":"boolean"},"enable_rebalance":{"type":"boolean"},"old_conn_close_duration":{"type":"string"},"rebalance_duration":{"type":"string"},"size":{"type":"integer"}}},"dial_option":{"type":"object","properties":{"backoff_base_delay":{"type":"string"},"backoff_jitter":{"type":"number"},"backoff_max_delay":{"type":"string"},"backoff_multiplier":{"type":"number"},"enable_backoff":{"type":"boolean"},"initial_connection_window_size":{"type":"integer"},"initial_window_size":{"type":"integer"},"insecure":{"type":"boolean"},"keep_alive":{"type":"object","properties":{"permit_without_stream":{"type":"boolean"},"time":{"type":"string"},"timeout":{"type":"string"}}},"max_msg_size":{"type":"integer"},"min_connection_timeout":{"type":"string"},"read_buffer_size":{"type":"integer"},"tcp":{"type":"object","properties":{"dialer":{"type":"object","properties":{"dual_stack_enabled":{"type":"boolean"},"keep_alive":{"type":"string"},"timeout":{"type":"string"}}},"dns":{"type":"object","properties":{"cache_enabled":{"type":"boolean"},"cache_expiration":{"type":"string"},"refresh_duration":{"type":"string"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}}}},"timeout":{"type":"string"},"write_buffer_size":{"type":"integer"}}},"health_check_duration":{"type":"string"},"max_recv_msg_size":{"type":"integer"},"max_retry_rpc_buffer_size":{"type":"integer"},"max_send_msg_size":{"type":"integer"},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}},"wait_for_ready":{"type":"boolean"}}},"duration":{"type":"string"}}},"node_name":{"type":"string"}}},"initContainers":{"type":"array","items":{"type":"object"}},"kind":{"type":"string","enum":["Deployment","DaemonSet"]},"logging":{"type":"object","properties":{"format":{"type":"string","enum":["raw","json"]},"level":{"type":"string","enum":["debug","info","warn","error","fatal"]},"logger":{"type":"string","enum":["glg","zap"]}}},"maxUnavailable":{"type":"string"},"name":{"type":"string"},"nodeName":{"type":"string"},"nodeSelector":{"type":"object"},"observability":{"type":"object","properties":{"collector":{"type":"object","properties":{"duration":{"type":"string"},"metrics":{"type":"object","properties":{"enable_cgo":{"type":"boolean"},"enable_goroutine":{"type":"boolean"},"enable_memory":{"type":"boolean"},"enable_version_info":{"type":"boolean"},"version_info_labels":{"type":"array","items":{"type":"string","enum":["vald_version","server_name","git_commit","build_time","go_version","go_os","go_arch","cgo_enabled","ngt_version","build_cpu_info_flags"]}}}}}},"enabled":{"type":"boolean"},"jaeger":{"type":"object","properties":{"agent_endpoint":{"type":"string"},"buffer_max_count":{"type":"integer"},"collector_endpoint":{"type":"string"},"enabled":{"type":"boolean"},"password":{"type":"string"},"service_name":{"type":"string"},"username":{"type":"string"}}},"prometheus":{"type":"object","properties":{"enabled":{"type":"boolean"},"endpoint":{"type":"string"},"namespace":{"type":"string"}}},"stackdriver":{"type":"object","properties":{"client":{"type":"object","properties":{"api_key":{"type":"string"},"audiences":{"type":"array","items":{"type":"string"}},"authentication_enabled":{"type":"boolean"},"credentials_file":{"type":"string"},"credentials_json":{"type":"string"},"endpoint":{"type":"string"},"quota_project":{"type":"string"},"request_reason":{"type":"string"},"scopes":{"type":"array","items":{"type":"string"}},"telemetry_enabled":{"type":"boolean"},"user_agent":{"type":"string"}}},"exporter":{"type":"object","properties":{"bundle_count_threshold":{"type":"integer"},"bundle_delay_threshold":{"type":"string"},"location":{"type":"string"},"metric_prefix":{"type":"string"},"monitoring_enabled":{"type":"boolean"},"number_of_workers":{"type":"integer"},"reporting_interval":{"type":"string"},"skip_cmd":{"type":"boolean"},"timeout":{"type":"string"},"trace_spans_buffer_max_bytes":{"type":"integer"},"tracing_enabled":{"type":"boolean"}}},"profiler":{"type":"object","properties":{"alloc_force_gc":{"type":"boolean"},"alloc_profiling":{"type":"boolean"},"api_addr":{"type":"string"},"cpu_profiling":{"type":"boolean"},"debug_logging":{"type":"boolean"},"enabled":{"type":"boolean"},"goroutine_profiling":{"type":"boolean"},"heap_profiling":{"type":"boolean"},"instance":{"type":"string"},"mutex_profiling":{"type":"boolean"},"service":{"type":"string"},"service_version":{"type":"string"},"zone":{"type":"string"}}},"project_id":{"type":"string"}}},"trace":{"type":"object","properties":{"enabled":{"type":"boolean"},"sampling_rate":{"type":"number"}}}}},"podAnnotations":{"type":"object"},"podPriority":{"type":"object","properties":{"enabled":{"type":"boolean"},"value":{"type":"integer"}}},"progressDeadlineSeconds":{"type":"integer"},"replicas":{"type":"integer","minimum":0},"resources":{"type":"object","properties":{"limits":{"type":"object"},"requests":{"type":"object"}}},"revisionHistoryLimit":{"type":"integer","minimum":0},"rollingUpdate":{"type":"object","properties":{"maxSurge":{"type":"string"},"maxUnavailable":{"type":"string"}}},"securityContext":{"type":"object"},"server_config":{"type":"object","properties":{"full_shutdown_duration":{"type":"string"},"healths":{"type":"object","properties":{"liveness":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"livenessProbe":{"type":"object","properties":{"failureThreshold":{"type":"integer"},"httpGet":{"type":"object","properties":{"path":{"type":"string"},"port":{"type":"string"},"scheme":{"type":"string"}}},"initialDelaySeconds":{"type":"integer"},"periodSeconds":{"type":"integer"},"successThreshold":{"type":"integer"},"timetoutSeconds":{"type":"integer"}}},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}},"readiness":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"readinessProbe":{"type":"object","properties":{"failureThreshold":{"type":"integer"},"httpGet":{"type":"object","properties":{"path":{"type":"string"},"port":{"type":"string"},"scheme":{"type":"string"}}},"initialDelaySeconds":{"type":"integer"},"periodSeconds":{"type":"integer"},"successThreshold":{"type":"integer"},"timeoutSeconds":{"type":"integer"}}},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}}}},"metrics":{"type":"object","properties":{"pprof":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}},"prometheus":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}}}},"servers":{"type":"object","properties":{"grpc":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"grpc":{"type":"object","properties":{"bidirectional_stream_concurrency":{"type":"integer"},"connection_timeout":{"type":"string"},"header_table_size":{"type":"integer"},"initial_conn_window_size":{"type":"integer"},"initial_window_size":{"type":"integer"},"interceptors":{"type":"array","items":{"type":"string","enum":["RecoverInterceptor","AccessLogInterceptor","TracePayloadInterceptor"]}},"keepalive":{"type":"object","properties":{"max_conn_age":{"type":"string"},"max_conn_age_grace":{"type":"string"},"max_conn_idle":{"type":"string"},"time":{"type":"string"},"timeout":{"type":"string"}}},"max_header_list_size":{"type":"integer"},"max_receive_message_size":{"type":"integer"},"max_send_message_size":{"type":"integer"},"read_buffer_size":{"type":"integer"},"write_buffer_size":{"type":"integer"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"},"restart":{"type":"boolean"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}},"rest":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"handler_timeout":{"type":"string"},"http":{"type":"object"},"idle_timeout":{"type":"string"},"mode":{"type":"string"},"probe_wait_time":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}}}},"service":{"type":"object","properties":{"annotations":{"type":"object"},"labels":{"type":"object"}}},"serviceType":{"type":"string","enum":["ClusterIP","LoadBalancer","NodePort"]},"terminationGracePeriodSeconds":{"type":"integer","minimum":0},"time_zone":{"type":"string"},"tolerations":{"type":"array","items":{"type":"object"}},"topologySpreadConstraints":{"type":"array","items":{"type":"object"}},"version":{"type":"string","pattern":"^v[0-9]+\\.[0-9]+\\.[0-9]$"},"volumeMounts":{"type":"array","items":{"type":"object"}},"volumes":{"type":"array","items":{"type":"object"}}}}}},"mangaer":{"type":"object"},"meta":{"type":"object","properties":{"affinity":{"type":"object","properties":{"nodeAffinity":{"type":"object","properties":{"preferredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}},"requiredDuringSchedulingIgnoredDuringExecution":{"type":"object","properties":{"nodeSelectorTerms":{"type":"array","items":{"type":"object"}}}}}},"podAffinity":{"type":"object","properties":{"preferredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}},"requiredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}}}},"podAntiAffinity":{"type":"object","properties":{"preferredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}},"requiredDuringSchedulingIgnoredDuringExecution":{"type":"array","items":{"type":"object"}}}}}},"annotations":{"type":"object"},"cassandra":{"type":"object","properties":{"config":{"type":"object","properties":{"connect_timeout":{"type":"string"},"consistency":{"type":"string","enum":["any","one","two","three","all","quorum","localquorum","eachquorum","localone"]},"cql_version":{"type":"string"},"default_idempotence":{"type":"boolean"},"default_timestamp":{"type":"boolean"},"disable_initial_host_lookup":{"type":"boolean"},"disable_node_status_events":{"type":"boolean"},"disable_skip_metadata":{"type":"boolean"},"disable_topology_events":{"type":"boolean"},"enable_host_verification":{"type":"boolean"},"host_filter":{"type":"object","properties":{"data_center":{"type":"string"},"enabled":{"type":"boolean"},"white_list":{"type":"array","items":{"type":"string"}}}},"hosts":{"type":"array","items":{"type":"string"}},"ignore_peer_addr":{"type":"boolean"},"keyspace":{"type":"string"},"max_prepared_stmts":{"type":"integer"},"max_routing_key_info":{"type":"integer"},"max_wait_schema_agreement":{"type":"string"},"num_conns":{"type":"integer"},"page_size":{"type":"integer"},"password":{"type":"string"},"pool_config":{"type":"object","properties":{"data_center":{"type":"string"},"dc_aware_routing":{"type":"boolean"},"non_local_replicas_fallback":{"type":"boolean"},"shuffle_replicas":{"type":"boolean"},"token_aware_host_policy":{"type":"boolean"}}},"port":{"type":"integer"},"proto_version":{"type":"integer"},"reconnect_interval":{"type":"string"},"reconnection_policy":{"type":"object","properties":{"initial_interval":{"type":"string"},"max_retries":{"type":"integer"}}},"retry_policy":{"type":"object","properties":{"max_duration":{"type":"string"},"min_duration":{"type":"string"},"num_retries":{"type":"integer"}}},"serial_consistency":{"type":"string","enum":["localserial","serial"]},"socket_keepalive":{"type":"string"},"tcp":{"type":"object","properties":{"dialer":{"type":"object","properties":{"dual_stack_enabled":{"type":"boolean"},"keep_alive":{"type":"string"},"timeout":{"type":"string"}}},"dns":{"type":"object","properties":{"cache_enabled":{"type":"boolean"},"cache_expiration":{"type":"string"},"refresh_duration":{"type":"string"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}}}},"timeout":{"type":"string"},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}},"username":{"type":"string"},"vector_backup_table":{"type":"string"},"write_coalesce_wait_time":{"type":"string"}}},"enabled":{"type":"boolean"}}},"enabled":{"type":"boolean"},"env":{"type":"array","items":{"type":"object"}},"externalTrafficPolicy":{"type":"string"},"hpa":{"type":"object","properties":{"enabled":{"type":"boolean"},"targetCPUUtilizationPercentage":{"type":"integer"}}},"image":{"type":"object","properties":{"pullPolicy":{"type":"string","enum":["Always","Never","IfNotPresent"]},"repository":{"type":"string"},"tag":{"type":"string"}}},"initContainers":{"type":"array","items":{"type":"object"}},"kind":{"type":"string","enum":["Deployment","DaemonSet"]},"logging":{"type":"object","properties":{"format":{"type":"string","enum":["raw","json"]},"level":{"type":"string","enum":["debug","info","warn","error","fatal"]},"logger":{"type":"string","enum":["glg","zap"]}}},"maxReplicas":{"type":"integer","minimum":0},"maxUnavailable":{"type":"string"},"minReplicas":{"type":"integer","minimum":0},"name":{"type":"string"},"nodeName":{"type":"string"},"nodeSelector":{"type":"object"},"observability":{"type":"object","properties":{"collector":{"type":"object","properties":{"duration":{"type":"string"},"metrics":{"type":"object","properties":{"enable_cgo":{"type":"boolean"},"enable_goroutine":{"type":"boolean"},"enable_memory":{"type":"boolean"},"enable_version_info":{"type":"boolean"},"version_info_labels":{"type":"array","items":{"type":"string","enum":["vald_version","server_name","git_commit","build_time","go_version","go_os","go_arch","cgo_enabled","ngt_version","build_cpu_info_flags"]}}}}}},"enabled":{"type":"boolean"},"jaeger":{"type":"object","properties":{"agent_endpoint":{"type":"string"},"buffer_max_count":{"type":"integer"},"collector_endpoint":{"type":"string"},"enabled":{"type":"boolean"},"password":{"type":"string"},"service_name":{"type":"string"},"username":{"type":"string"}}},"prometheus":{"type":"object","properties":{"enabled":{"type":"boolean"},"endpoint":{"type":"string"},"namespace":{"type":"string"}}},"stackdriver":{"type":"object","properties":{"client":{"type":"object","properties":{"api_key":{"type":"string"},"audiences":{"type":"array","items":{"type":"string"}},"authentication_enabled":{"type":"boolean"},"credentials_file":{"type":"string"},"credentials_json":{"type":"string"},"endpoint":{"type":"string"},"quota_project":{"type":"string"},"request_reason":{"type":"string"},"scopes":{"type":"array","items":{"type":"string"}},"telemetry_enabled":{"type":"boolean"},"user_agent":{"type":"string"}}},"exporter":{"type":"object","properties":{"bundle_count_threshold":{"type":"integer"},"bundle_delay_threshold":{"type":"string"},"location":{"type":"string"},"metric_prefix":{"type":"string"},"monitoring_enabled":{"type":"boolean"},"number_of_workers":{"type":"integer"},"reporting_interval":{"type":"string"},"skip_cmd":{"type":"boolean"},"timeout":{"type":"string"},"trace_spans_buffer_max_bytes":{"type":"integer"},"tracing_enabled":{"type":"boolean"}}},"profiler":{"type":"object","properties":{"alloc_force_gc":{"type":"boolean"},"alloc_profiling":{"type":"boolean"},"api_addr":{"type":"string"},"cpu_profiling":{"type":"boolean"},"debug_logging":{"type":"boolean"},"enabled":{"type":"boolean"},"goroutine_profiling":{"type":"boolean"},"heap_profiling":{"type":"boolean"},"instance":{"type":"string"},"mutex_profiling":{"type":"boolean"},"service":{"type":"string"},"service_version":{"type":"string"},"zone":{"type":"string"}}},"project_id":{"type":"string"}}},"trace":{"type":"object","properties":{"enabled":{"type":"boolean"},"sampling_rate":{"type":"number"}}}}},"podAnnotations":{"type":"object"},"podPriority":{"type":"object","properties":{"enabled":{"type":"boolean"},"value":{"type":"integer"}}},"podSecurityContext":{"type":"object"},"progressDeadlineSeconds":{"type":"integer"},"redis":{"type":"object","properties":{"config":{"type":"object","properties":{"addrs":{"type":"array","items":{"type":"string"}},"db":{"type":"integer"},"dial_timeout":{"type":"string"},"idle_check_frequency":{"type":"string"},"idle_timeout":{"type":"string"},"key_pref":{"type":"string"},"kv_prefix":{"type":"string"},"max_conn_age":{"type":"string"},"max_redirects":{"type":"integer"},"max_retries":{"type":"integer"},"max_retry_backoff":{"type":"string"},"min_idle_conns":{"type":"integer"},"min_retry_backoff":{"type":"string"},"network":{"type":"string"},"password":{"type":"string"},"pool_size":{"type":"integer"},"pool_timeout":{"type":"string"},"prefix_delimiter":{"type":"string"},"read_only":{"type":"boolean"},"read_timeout":{"type":"string"},"route_by_latency":{"type":"boolean"},"route_randomly":{"type":"boolean"},"sentinel_master_name":{"type":"string"},"sentinel_password":{"type":"string"},"tcp":{"type":"object","properties":{"dialer":{"type":"object","properties":{"dual_stack_enabled":{"type":"boolean"},"keep_alive":{"type":"string"},"timeout":{"type":"string"}}},"dns":{"type":"object","properties":{"cache_enabled":{"type":"boolean"},"cache_expiration":{"type":"string"},"refresh_duration":{"type":"string"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}},"vk_prefix":{"type":"string"},"write_timeout":{"type":"string"}}},"enabled":{"type":"boolean"}}},"resources":{"type":"object","properties":{"limits":{"type":"object"},"requests":{"type":"object"}}},"revisionHistoryLimit":{"type":"integer","minimum":0},"rollingUpdate":{"type":"object","properties":{"maxSurge":{"type":"string"},"maxUnavailable":{"type":"string"}}},"securityContext":{"type":"object"},"server_config":{"type":"object","properties":{"full_shutdown_duration":{"type":"string"},"healths":{"type":"object","properties":{"liveness":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"livenessProbe":{"type":"object","properties":{"failureThreshold":{"type":"integer"},"httpGet":{"type":"object","properties":{"path":{"type":"string"},"port":{"type":"string"},"scheme":{"type":"string"}}},"initialDelaySeconds":{"type":"integer"},"periodSeconds":{"type":"integer"},"successThreshold":{"type":"integer"},"timetoutSeconds":{"type":"integer"}}},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}},"readiness":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"readinessProbe":{"type":"object","properties":{"failureThreshold":{"type":"integer"},"httpGet":{"type":"object","properties":{"path":{"type":"string"},"port":{"type":"string"},"scheme":{"type":"string"}}},"initialDelaySeconds":{"type":"integer"},"periodSeconds":{"type":"integer"},"successThreshold":{"type":"integer"},"timeoutSeconds":{"type":"integer"}}},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}}}},"metrics":{"type":"object","properties":{"pprof":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}},"prometheus":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"http":{"type":"object","properties":{"handler_timeout":{"type":"string"},"idle_timeout":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}}}},"servers":{"type":"object","properties":{"grpc":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"grpc":{"type":"object","properties":{"bidirectional_stream_concurrency":{"type":"integer"},"connection_timeout":{"type":"string"},"header_table_size":{"type":"integer"},"initial_conn_window_size":{"type":"integer"},"initial_window_size":{"type":"integer"},"interceptors":{"type":"array","items":{"type":"string","enum":["RecoverInterceptor","AccessLogInterceptor","TracePayloadInterceptor"]}},"keepalive":{"type":"object","properties":{"max_conn_age":{"type":"string"},"max_conn_age_grace":{"type":"string"},"max_conn_idle":{"type":"string"},"time":{"type":"string"},"timeout":{"type":"string"}}},"max_header_list_size":{"type":"integer"},"max_receive_message_size":{"type":"integer"},"max_send_message_size":{"type":"integer"},"read_buffer_size":{"type":"integer"},"write_buffer_size":{"type":"integer"}}},"mode":{"type":"string"},"probe_wait_time":{"type":"string"},"restart":{"type":"boolean"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}},"rest":{"type":"object","properties":{"enabled":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","maximum":65535,"minimum":0},"server":{"type":"object","properties":{"handler_timeout":{"type":"string"},"http":{"type":"object"},"idle_timeout":{"type":"string"},"mode":{"type":"string"},"probe_wait_time":{"type":"string"},"read_header_timeout":{"type":"string"},"read_timeout":{"type":"string"},"shutdown_duration":{"type":"string"},"write_timeout":{"type":"string"}}},"servicePort":{"type":"integer","maximum":65535,"minimum":0}}}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}}}},"service":{"type":"object","properties":{"annotations":{"type":"object"},"labels":{"type":"object"}}},"serviceType":{"type":"string","enum":["ClusterIP","LoadBalancer","NodePort"]},"terminationGracePeriodSeconds":{"type":"integer","minimum":0},"time_zone":{"type":"string"},"tolerations":{"type":"array","items":{"type":"object"}},"topologySpreadConstraints":{"type":"array","items":{"type":"object"}},"version":{"type":"string","pattern":"^v[0-9]+\\.[0-9]+\\.[0-9]$"},"volumeMounts":{"type":"array","items":{"type":"object"}},"volumes":{"type":"array","items":{"type":"object"}}}}}} diff --git a/charts/vald/values.yaml b/charts/vald/values.yaml index 95cfcc0210c..02f25be4cc1 100644 --- a/charts/vald/values.yaml +++ b/charts/vald/values.yaml @@ -408,6 +408,9 @@ defaults: # @schema {"name": "defaults.server_config.tls.ca", "type": "string"} # defaults.server_config.tls.ca -- TLS ca path ca: /path/to/ca + # @schema {"name": "defaults.server_config.tls.insecure_skip_verify", "type": "boolean"} + # defaults.server_config.tls.insecure_skip_verify -- enable/disable skip SSL certificate verification + insecure_skip_verify: false # @schema {"name": "defaults.grpc", "type": "object"} grpc: # @schema {"name": "defaults.grpc.client", "type": "object", "anchor": "grpc.client"} @@ -539,14 +542,16 @@ defaults: dual_stack_enabled: true # @schema {"name": "defaults.grpc.client.dial_option.tcp.tls", "alias": "tls"} tls: - # defaults.grpc.client.dial_option.tcp.tls.enabled -- gRPC client TCP TLS enabled + # defaults.grpc.client.dial_option.tcp.tls.enabled -- TLS enabled enabled: false - # defaults.grpc.client.dial_option.tcp.tls.cert -- gRPC client TCP TLS cert path + # defaults.grpc.client.dial_option.tcp.tls.cert -- TLS cert path cert: /path/to/cert - # defaults.grpc.client.dial_option.tcp.tls.key -- gRPC client TCP TLS key path + # defaults.grpc.client.dial_option.tcp.tls.key -- TLS key path key: /path/to/key - # defaults.grpc.client.dial_option.tcp.tls.ca -- gRPC client TCP TLS ca path + # defaults.grpc.client.dial_option.tcp.tls.ca -- TLS ca path ca: /path/to/ca + # defaults.grpc.client.dial_option.tcp.tls.insecure_skip_verify -- enable/disable skip SSL certificate verification + insecure_skip_verify: false # @schema {"name": "defaults.grpc.client.dial_option.keep_alive", "type": "object"} keep_alive: # @schema {"name": "defaults.grpc.client.dial_option.keep_alive.time", "type": "string"} @@ -560,14 +565,16 @@ defaults: permit_without_stream: false # @schema {"name": "defaults.grpc.client.tls", "alias": "tls"} tls: - # defaults.grpc.client.tls.enabled -- gRPC client TLS enabled + # defaults.grpc.client.tls.enabled -- TLS enabled enabled: false - # defaults.grpc.client.tls.cert -- gRPC client TLS cert path + # defaults.grpc.client.tls.cert -- TLS cert path cert: /path/to/cert - # defaults.grpc.client.tls.key -- gRPC client TLS key path + # defaults.grpc.client.tls.key -- TLS key path key: /path/to/key - # defaults.grpc.client.tls.ca -- gRPC client TLS ca path + # defaults.grpc.client.tls.ca -- TLS ca path ca: /path/to/ca + # defaults.grpc.client.tls.insecure_skip_verify -- enable/disable skip SSL certificate verification + insecure_skip_verify: false # @schema {"name": "defaults.observability", "type": "object", "anchor": "observability"} observability: # @schema {"name": "defaults.observability.enabled", "type": "boolean"} @@ -2608,14 +2615,16 @@ agent: # agent.sidecar.config.client.tcp.dialer.dual_stack_enabled -- HTTP client TCP dialer dual stack enabled dual_stack_enabled: false tls: - # agent.sidecar.config.client.tcp.tls.enabled -- HTTP client TCP TLS enabled + # agent.sidecar.config.client.tcp.tls.enabled -- TLS enabled enabled: false - # agent.sidecar.config.client.tcp.tls.cert -- HTTP client TCP TLS cert path + # agent.sidecar.config.client.tcp.tls.cert -- TLS cert path cert: /path/to/cert - # agent.sidecar.config.client.tcp.tls.key -- HTTP client TCP TLS key path + # agent.sidecar.config.client.tcp.tls.key -- TLS key path key: /path/to/key - # agent.sidecar.config.client.tcp.tls.ca -- HTTP client TCP TLS ca path + # agent.sidecar.config.client.tcp.tls.ca -- TLS ca path ca: /path/to/ca + # agent.sidecar.config.client.tcp.tls.insecure_skip_verify -- enable/disable skip SSL certificate verification + insecure_skip_verify: false # @schema {"name": "agent.sidecar.config.client.transport", "type": "object"} transport: # @schema {"name": "agent.sidecar.config.client.transport.round_tripper", "type": "object"} @@ -2887,6 +2896,33 @@ discoverer: # @schema {"name": "discoverer.discoverer.discovery_duration", "type": "string"} # discoverer.discoverer.discovery_duration -- duration to discovery discovery_duration: 3s + # @schema {"name": "discoverer.discoverer.tcp", "alias": "tcp"} + tcp: + dns: + # discoverer.discoverer.tcp.dns.cache_enabled -- TCP DNS cache enabled + cache_enabled: true + # discoverer.discoverer.tcp.dns.refresh_duration -- TCP DNS cache refresh duration + refresh_duration: 5m + # discoverer.discoverer.tcp.dns.cache_expiration -- TCP DNS cache expiration + cache_expiration: 24h + dialer: + # discoverer.discoverer.tcp.dialer.timeout -- TCP dialer timeout + timeout: 30s + # discoverer.discoverer.tcp.dialer.keep_alive -- TCP dialer keep alive + keep_alive: 10m + # discoverer.discoverer.tcp.dialer.dual_stack_enabled -- TCP dialer dual stack enabled + dual_stack_enabled: false + tls: + # discoverer.discoverer.tcp.tls.enabled -- TLS enabled + enabled: false + # discoverer.discoverer.tcp.tls.cert -- TLS cert path + cert: /path/to/cert + # discoverer.discoverer.tcp.tls.key -- TLS key path + key: /path/to/key + # discoverer.discoverer.tcp.tls.ca -- TLS ca path + ca: /path/to/ca + # discoverer.discoverer.tcp.tls.insecure_skip_verify -- enable/disable skip SSL certificate verification + insecure_skip_verify: false # @schema {"name": "discoverer.clusterRole", "type": "object"} clusterRole: # @schema {"name": "discoverer.clusterRole.enabled", "type": "boolean"} @@ -3407,13 +3443,15 @@ manager: tls: # manager.backup.mysql.config.tls.enabled -- TLS enabled enabled: false - # manager.backup.mysql.config.tls.cert -- path to TLS cert + # manager.backup.mysql.config.tls.cert -- TLS cert path cert: /path/to/cert - # manager.backup.mysql.config.tls.key -- path to TLS key + # manager.backup.mysql.config.tls.key -- TLS key path key: /path/to/key - # manager.backup.mysql.config.tls.ca -- path to TLS ca + # manager.backup.mysql.config.tls.ca -- TLS ca path ca: /path/to/ca - # @schema {"name": "manager.backup.mysql.config.tls", "alias": "tcp"} + # manager.backup.mysql.config.tls.insecure_skip_verify -- enable/disable skip SSL certificate verification + insecure_skip_verify: false + # @schema {"name": "manager.backup.mysql.config.tcp", "alias": "tcp"} tcp: dns: # manager.backup.mysql.config.tcp.dns.cache_enabled -- TCP DNS cache enabled @@ -3430,14 +3468,16 @@ manager: # manager.backup.mysql.config.tcp.dialer.dual_stack_enabled -- TCP dialer dual stack enabled dual_stack_enabled: false tls: - # manager.backup.mysql.config.tcp.tls.enabled -- TCP TLS enabled + # manager.backup.mysql.config.tcp.tls.enabled -- TLS enabled enabled: false - # manager.backup.mysql.config.tcp.tls.cert -- path to TCP TLS cert + # manager.backup.mysql.config.tcp.tls.cert -- TLS cert path cert: /path/to/cert - # manager.backup.mysql.config.tcp.tls.key -- path to TCP TLS key + # manager.backup.mysql.config.tcp.tls.key -- TLS key path key: /path/to/key - # manager.backup.mysql.config.tcp.tls.ca -- path to TCP TLS ca + # manager.backup.mysql.config.tcp.tls.ca -- TLS ca path ca: /path/to/ca + # manager.backup.mysql.config.tcp.tls.insecure_skip_verify -- enable/disable skip SSL certificate verification + insecure_skip_verify: false # @schema {"name": "manager.backup.cassandra", "type": "object", "anchor": "cassandra"} cassandra: # @schema {"name": "manager.backup.cassandra.enabled", "type": "boolean"} @@ -3522,12 +3562,14 @@ manager: tls: # manager.backup.cassandra.config.tls.enabled -- TLS enabled enabled: false - # manager.backup.cassandra.config.tls.cert -- path to TLS cert + # manager.backup.cassandra.config.tls.cert -- TLS cert path cert: /path/to/cert - # manager.backup.cassandra.config.tls.key -- path to TLS key + # manager.backup.cassandra.config.tls.key -- TLS key path key: /path/to/key - # manager.backup.cassandra.config.tls.ca -- path to TLS ca + # manager.backup.cassandra.config.tls.ca -- TLS ca path ca: /path/to/ca + # manager.backup.cassandra.config.tls.insecure_skip_verify -- enable/disable skip SSL certificate verification + insecure_skip_verify: false # @schema {"name": "manager.backup.cassandra.config.tcp", "alias": "tcp"} tcp: dns: @@ -3544,6 +3586,17 @@ manager: keep_alive: 10m # manager.backup.cassandra.config.tcp.dialer.dual_stack_enabled -- TCP dialer dual stack enabled dual_stack_enabled: false + tls: + # manager.backup.cassandra.config.tcp.tls.enabled -- TLS enabled + enabled: false + # manager.backup.cassandra.config.tcp.tls.cert -- TLS cert path + cert: /path/to/cert + # manager.backup.cassandra.config.tcp.tls.key -- TLS key path + key: /path/to/key + # manager.backup.cassandra.config.tcp.tls.ca -- TLS ca path + ca: /path/to/ca + # manager.backup.cassandra.config.tcp.tls.insecure_skip_verify -- enable/disable skip SSL certificate verification + insecure_skip_verify: false # @schema {"name": "manager.backup.cassandra.config.enable_host_verification", "type": "boolean"} # manager.backup.cassandra.config.enable_host_verification -- host verification enabled enable_host_verification: false @@ -4139,12 +4192,14 @@ meta: tls: # meta.redis.config.tls.enabled -- TLS enabled enabled: false - # meta.redis.config.tls.cert -- path to TLS cert + # meta.redis.config.tls.cert -- TLS cert path cert: /path/to/cert - # meta.redis.config.tls.key -- path to TLS key + # meta.redis.config.tls.key -- TLS key path key: /path/to/key - # meta.redis.config.tls.ca -- path to TLS ca + # meta.redis.config.tls.ca -- TLS ca path ca: /path/to/ca + # meta.redis.config.tls.insecure_skip_verify -- enable/disable skip SSL certificate verification + insecure_skip_verify: false # @schema {"name": "meta.redis.config.tcp", "alias": "tcp"} tcp: dns: @@ -4162,14 +4217,16 @@ meta: # meta.redis.config.tcp.dialer.dual_stack_enabled -- TCP dialer dual stack enabled dual_stack_enabled: false tls: - # meta.redis.config.tcp.tls.enabled -- TCP TLS enabled + # meta.redis.config.tcp.tls.enabled -- TLS enabled enabled: false - # meta.redis.config.tcp.tls.cert -- path to TCP TLS cert + # meta.redis.config.tcp.tls.cert -- TLS cert path cert: /path/to/cert - # meta.redis.config.tcp.tls.key -- path to TCP TLS key + # meta.redis.config.tcp.tls.key -- TLS key path key: /path/to/key - # meta.redis.config.tcp.tls.ca -- path to TCP TLS ca + # meta.redis.config.tcp.tls.ca -- TLS ca path ca: /path/to/ca + # meta.redis.config.tcp.tls.insecure_skip_verify -- enable/disable skip SSL certificate verification + insecure_skip_verify: false # @schema {"name": "meta.redis.config.kv_prefix", "type": "string"} # meta.redis.config.kv_prefix -- KV prefix kv_prefix: "" @@ -4234,15 +4291,19 @@ meta: max_routing_key_info: 1000 # meta.cassandra.config.page_size -- page size page_size: 5000 + # @schema {"name": "meta.cassandra.config.tls", "alias": "tls"} tls: # meta.cassandra.config.tls.enabled -- TLS enabled enabled: false - # meta.cassandra.config.tls.cert -- path to TLS cert + # meta.cassandra.config.tls.cert -- TLS cert path cert: /path/to/cert - # meta.cassandra.config.tls.key -- path to TLS key + # meta.cassandra.config.tls.key -- TLS key path key: /path/to/key - # meta.cassandra.config.tls.ca -- path to TLS ca + # meta.cassandra.config.tls.ca -- TLS ca path ca: /path/to/ca + # meta.cassandra.config.tls.insecure_skip_verify -- enable/disable skip SSL certificate verification + insecure_skip_verify: false + # @schema {"name": "meta.cassandra.config.tcp", "alias": "tcp"} tcp: dns: # meta.cassandra.config.tcp.dns.cache_enabled -- TCP DNS cache enabled @@ -4258,6 +4319,17 @@ meta: keep_alive: 10m # meta.cassandra.config.tcp.dialer.dual_stack_enabled -- TCP dialer dual stack enabled dual_stack_enabled: false + tls: + # meta.cassandra.config.tcp.tls.enabled -- TLS enabled + enabled: false + # meta.cassandra.config.tcp.tls.cert -- TLS cert path + cert: /path/to/cert + # meta.cassandra.config.tcp.tls.key -- TLS key path + key: /path/to/key + # meta.cassandra.config.tcp.tls.ca -- TLS ca path + ca: /path/to/ca + # meta.cassandra.config.tcp.tls.insecure_skip_verify -- enable/disable skip SSL certificate verification + insecure_skip_verify: false # meta.cassandra.config.enable_host_verification -- host verification enabled enable_host_verification: false # meta.cassandra.config.default_timestamp -- default timestamp enabled diff --git a/cmd/discoverer/k8s/sample.yaml b/cmd/discoverer/k8s/sample.yaml index b8f19ba5fb1..f43773a63be 100644 --- a/cmd/discoverer/k8s/sample.yaml +++ b/cmd/discoverer/k8s/sample.yaml @@ -13,26 +13,25 @@ # See the License for the specific language governing permissions and # limitations under the License. # - ---- version: v0.0.0 time_zone: JST logging: format: raw - level: debug + level: info logger: glg server_config: servers: - name: grpc host: 0.0.0.0 - port: 8081 + port: 8082 grpc: bidirectional_stream_concurrency: 20 connection_timeout: "" header_table_size: 0 initial_conn_window_size: 0 initial_window_size: 0 - interceptors: [] + interceptors: + - RecoverInterceptor keepalive: max_conn_age: "" max_conn_age_grace: "" @@ -82,6 +81,7 @@ server_config: ca: /path/to/ca cert: /path/to/cert enabled: false + insecure_skip_verify: false key: /path/to/key observability: enabled: false @@ -160,3 +160,18 @@ discoverer: discovery_duration: 3s name: "" namespace: _MY_POD_NAMESPACE_ + tcp: + dialer: + dual_stack_enabled: false + keep_alive: 10m + timeout: 30s + dns: + cache_enabled: true + cache_expiration: 24h + refresh_duration: 5m + tls: + enabled: false + ca: /path/to/ca + cert: /path/to/cert + key: /path/to/key + insecure_skip_verify: false diff --git a/go.mod b/go.mod index 229f0b4502f..5147e9dd4ab 100755 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.15 replace ( cloud.google.com/go => cloud.google.com/go v0.76.0 github.com/Azure/go-autorest => github.com/Azure/go-autorest v14.2.0+incompatible - github.com/aws/aws-sdk-go => github.com/aws/aws-sdk-go v1.37.3 + github.com/aws/aws-sdk-go => github.com/aws/aws-sdk-go v1.37.7 github.com/boltdb/bolt => github.com/boltdb/bolt v1.3.1 github.com/chzyer/logex => github.com/chzyer/logex v1.1.11-0.20170329064859-445be9e134b2 github.com/coreos/etcd => go.etcd.io/etcd v3.3.25+incompatible @@ -16,12 +16,12 @@ replace ( github.com/gogo/googleapis => github.com/gogo/googleapis v1.4.0 github.com/gogo/protobuf => github.com/gogo/protobuf v1.3.2 github.com/google/go-cmp => github.com/google/go-cmp v0.5.4 - github.com/google/pprof => github.com/google/pprof v0.0.0-20210125172800-10e9aeb4a998 + github.com/google/pprof => github.com/google/pprof v0.0.0-20210208152844-1612e9be7af6 github.com/googleapis/gnostic => github.com/googleapis/gnostic v0.5.4 github.com/gophercloud/gophercloud => github.com/gophercloud/gophercloud v0.15.0 github.com/gorilla/websocket => github.com/gorilla/websocket v1.4.2 github.com/hailocab/go-hostpool => github.com/monzo/go-hostpool v0.0.0-20200724120130-287edbb29340 - github.com/klauspost/compress => github.com/klauspost/compress v1.11.8-0.20210203154158-6c96f3e2a592 + github.com/klauspost/compress => github.com/klauspost/compress v1.11.8-0.20210205131735-b5cd74455ec9 github.com/tensorflow/tensorflow => github.com/tensorflow/tensorflow v2.1.2+incompatible golang.org/x/crypto => golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad google.golang.org/grpc => google.golang.org/grpc v1.35.0 @@ -45,7 +45,7 @@ require ( github.com/cespare/xxhash/v2 v2.1.1 github.com/envoyproxy/protoc-gen-validate v0.1.0 github.com/fsnotify/fsnotify v1.4.9 - github.com/go-redis/redis/v8 v8.4.11 + github.com/go-redis/redis/v8 v8.5.0 github.com/go-sql-driver/mysql v1.5.0 github.com/gocql/gocql v0.0.0-20200131111108-92af2e088537 github.com/gocraft/dbr/v2 v2.7.1 @@ -78,8 +78,8 @@ require ( golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c gonum.org/v1/hdf5 v0.0.0-20200504100616-496fefe91614 gonum.org/v1/plot v0.8.1 - google.golang.org/api v0.38.0 - google.golang.org/genproto v0.0.0-20210203152818-3206188e46ba + google.golang.org/api v0.39.0 + google.golang.org/genproto v0.0.0-20210207032614-bba0dbe2a9ea google.golang.org/grpc v1.35.0 gopkg.in/yaml.v2 v2.4.0 k8s.io/api v0.20.2 diff --git a/go.sum b/go.sum index ad612284bfd..7ff9ee225aa 100644 --- a/go.sum +++ b/go.sum @@ -60,8 +60,8 @@ github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hC github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/aws/aws-sdk-go v1.37.3 h1:1f0groABc4AuapskpHf6EBRaG2tqw0Sx3ebCMwfp1Ys= -github.com/aws/aws-sdk-go v1.37.3/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= +github.com/aws/aws-sdk-go v1.37.7 h1:vfald/ssuWaA2HgJ9DrieVVXVE9eD0Kly/9kl0hofbE= +github.com/aws/aws-sdk-go v1.37.7/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= @@ -164,8 +164,8 @@ github.com/go-openapi/swag v0.19.5 h1:lTz6Ys4CmqqCQmZPBlbQENR1/GucA2bzYTE12Pw4tF github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-redis/redis v6.15.2+incompatible h1:9SpNVG76gr6InJGxoZ6IuuxaCOQwDAhzyXg+Bs+0Sb4= github.com/go-redis/redis v6.15.2+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= -github.com/go-redis/redis/v8 v8.4.11 h1:t2lToev01VTrqYQcv+QFbxtGgcf64K+VUMgf9Ap6A/E= -github.com/go-redis/redis/v8 v8.4.11/go.mod h1:d5yY/TlkQyYBSBHnXUmnf1OrHbyQere5JV4dLKwvXmo= +github.com/go-redis/redis/v8 v8.5.0 h1:L3r1Q3I5WOUdXZGCP6g44EruKh0u3n6co5Hl5xWkdGA= +github.com/go-redis/redis/v8 v8.5.0/go.mod h1:YmEcgBDttjnkbMzDAhDtQxY9yVA7jMN6PCR5HeMvqFE= github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= @@ -218,8 +218,8 @@ github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian/v3 v3.1.0 h1:wCKgOCHuUEVfsaQLpPSJb7VdYCdTVZQAuOdYm1yc/60= github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/pprof v0.0.0-20210125172800-10e9aeb4a998 h1:ruQkWz0PK91vTVrWtzAgv3VqTMgIN1FAIvwWr5MY+GQ= -github.com/google/pprof v0.0.0-20210125172800-10e9aeb4a998/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210208152844-1612e9be7af6 h1:38TDCVodvyooskjOFh+Ve8EY37rS8ZNzEIPHMWZaY/Y= +github.com/google/pprof v0.0.0-20210208152844-1612e9be7af6/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -296,8 +296,8 @@ github.com/jung-kurt/gofpdf v1.16.2 h1:jgbatWHfRlPYiK85qgevsZTHviWXKwB1TTiKdz5Pt github.com/jung-kurt/gofpdf v1.16.2/go.mod h1:1hl7y57EsiPAkLbOwzpzqgx1A30nQCk/YmFV8S2vmK0= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.11.8-0.20210203154158-6c96f3e2a592 h1:NmvlF3t5svvdvoaViVoVWQf1Lj1yZK/uIsoAFUmnlEA= -github.com/klauspost/compress v1.11.8-0.20210203154158-6c96f3e2a592/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.11.8-0.20210205131735-b5cd74455ec9 h1:OAhCmjDqWViQo/ZB+YeKShJ4DFrkmVRWRUGgzzJLs28= +github.com/klauspost/compress v1.11.8-0.20210205131735-b5cd74455ec9/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -379,8 +379,8 @@ github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+W github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.14.1/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/ginkgo v1.14.2 h1:8mVmC9kjFFmA8H4pKMUhcblgifdkOIXPvbhN1T36q1M= -github.com/onsi/ginkgo v1.14.2/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= +github.com/onsi/ginkgo v1.15.0 h1:1V1NfVQR87RtWAgp1lv9JZJ5Jap+XFGKPi00andXGi4= +github.com/onsi/ginkgo v1.15.0/go.mod h1:hF8qUzuuC8DJGygJH3726JnCZX4MYbRB8yFfISqnKUg= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= @@ -388,8 +388,8 @@ github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1Cpa github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.10.2/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.10.4 h1:NiTx7EEvBzu9sFOD1zORteLSt3o8gnlvZZwSE9TnY9U= -github.com/onsi/gomega v1.10.4/go.mod h1:g/HbgYopi++010VEqkFgJHKC09uJiW9UkXvMUuKHUCQ= +github.com/onsi/gomega v1.10.5 h1:7n6FEkpFmfCoo2t+YYqXH0evK+a9ICQz0xcAy9dYcaQ= +github.com/onsi/gomega v1.10.5/go.mod h1:gza4q3jKQJijlu05nKWRCW/GavJumGt8aNRxWg7mt48= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= @@ -678,6 +678,7 @@ golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c h1:VwygUrnw9jn88c4u8GD3rZQbqrP/tgas88tPUbBxQrk= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -737,6 +738,7 @@ golang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20200616133436-c1934b75d054/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0 h1:po9/4sTYwZU9lPhi1tOrb4hCv3qrhiQ77LZfGa2OjwY= @@ -772,8 +774,9 @@ google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/ google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.38.0 h1:vDyWk6eup8eQAidaZ31sNWIn8tZEL8qpbtGkBD4ytQo= google.golang.org/api v0.38.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= +google.golang.org/api v0.39.0 h1:zHCTXf0NeDdKTgcSQpT+ZflWAqHsEp1GmdpxW09f3YM= +google.golang.org/api v0.39.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.2/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= @@ -807,8 +810,8 @@ google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210202153253-cf70463f6119/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210203152818-3206188e46ba h1:np3A9jnmE/eMtrOwwvUycmQ1XoLyj5nqZ41bAyYLqJ0= -google.golang.org/genproto v0.0.0-20210203152818-3206188e46ba/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210207032614-bba0dbe2a9ea h1:N98SvVh7Hdle2lgUVFuIkf0B3u29CUakMUQa7Hwz8Wc= +google.golang.org/genproto v0.0.0-20210207032614-bba0dbe2a9ea/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/grpc v1.35.0 h1:TwIQcH3es+MojMVojxxfQ3l3OF2KzlRxML2xZq0kRo8= google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c= diff --git a/internal/client/v1/client/compressor/client_test.go b/internal/client/v1/client/compressor/client_test.go index 43473791800..416bca6a1b6 100644 --- a/internal/client/v1/client/compressor/client_test.go +++ b/internal/client/v1/client/compressor/client_test.go @@ -1000,3 +1000,79 @@ func Test_client_RemoveIPs(t *testing.T) { }) } } + +func Test_client_GRPCClient(t *testing.T) { + t.Parallel() + type fields struct { + client grpc.Client + } + type want struct { + want grpc.Client + } + type test struct { + name string + fields fields + want want + checkFunc func(want, grpc.Client) error + beforeFunc func() + afterFunc func() + } + defaultCheckFunc := func(w want, got grpc.Client) error { + if !reflect.DeepEqual(got, w.want) { + return errors.Errorf("got: \"%#v\",\n\t\t\t\twant: \"%#v\"", got, w.want) + } + return nil + } + tests := []test{ + // TODO test cases + /* + { + name: "test_case_1", + fields: fields { + client: nil, + }, + want: want{}, + checkFunc: defaultCheckFunc, + }, + */ + + // TODO test cases + /* + func() test { + return test { + name: "test_case_2", + fields: fields { + client: nil, + }, + want: want{}, + checkFunc: defaultCheckFunc, + } + }(), + */ + } + + for _, tc := range tests { + test := tc + t.Run(test.name, func(tt *testing.T) { + tt.Parallel() + defer goleak.VerifyNone(tt, goleak.IgnoreCurrent()) + if test.beforeFunc != nil { + test.beforeFunc() + } + if test.afterFunc != nil { + defer test.afterFunc() + } + if test.checkFunc == nil { + test.checkFunc = defaultCheckFunc + } + c := &client{ + client: test.fields.client, + } + + got := c.GRPCClient() + if err := test.checkFunc(test.want, got); err != nil { + tt.Errorf("error = %v", err) + } + }) + } +} diff --git a/internal/config/discoverer.go b/internal/config/discoverer.go index 26b16f11915..ca834229623 100644 --- a/internal/config/discoverer.go +++ b/internal/config/discoverer.go @@ -21,12 +21,18 @@ type Discoverer struct { Name string `json:"name" yaml:"name"` Namespace string `json:"namespace" yaml:"namespace"` DiscoveryDuration string `json:"discovery_duration" yaml:"discovery_duration"` + TCP *TCP `json:"tcp" yaml:"tcp"` } func (d *Discoverer) Bind() *Discoverer { d.Name = GetActualValue(d.Name) d.Namespace = GetActualValue(d.Namespace) d.DiscoveryDuration = GetActualValue(d.DiscoveryDuration) + if d.TCP != nil { + d.TCP.Bind() + } else { + d.TCP = new(TCP) + } return d } diff --git a/internal/config/meta.go b/internal/config/meta.go index 726cc0e0fab..df27812d4ac 100644 --- a/internal/config/meta.go +++ b/internal/config/meta.go @@ -17,7 +17,11 @@ // Package config providers configuration type and load configuration logic package config -import "fmt" +import ( + "strconv" + + "github.com/vdaas/vald/internal/net" +) type Meta struct { Host string `json:"host" yaml:"host"` @@ -39,7 +43,7 @@ func (m *Meta) Bind() *Meta { m.Client = newGRPCClientConfig() } if len(m.Host) != 0 { - m.Client.Addrs = append(m.Client.Addrs, fmt.Sprintf("%s:%d", m.Host, m.Port)) + m.Client.Addrs = append(m.Client.Addrs, net.JoinHostPort(m.Host, strconv.FormatInt(int64(m.Port), 10))) } return m } diff --git a/internal/config/tcp.go b/internal/config/tcp.go index c825f087d2b..b36f37a1ccb 100644 --- a/internal/config/tcp.go +++ b/internal/config/tcp.go @@ -32,6 +32,7 @@ type TCP struct { type Dialer struct { Timeout string `yaml:"timeout" json:"timeout"` KeepAlive string `yaml:"keep_alive" json:"keep_alive"` + FallbackDelay string `yaml:"fallback_delay" json:"fallback_delay"` DualStackEnabled bool `yaml:"dual_stack_enabled" json:"dual_stack_enabled"` } @@ -50,6 +51,7 @@ func (d *DNS) Bind() *DNS { func (d *Dialer) Bind() *Dialer { d.Timeout = GetActualValue(d.Timeout) d.KeepAlive = GetActualValue(d.KeepAlive) + d.FallbackDelay = GetActualValue(d.FallbackDelay) return d } @@ -84,6 +86,7 @@ func (t *TCP) Opts() []tcp.DialerOption { opts = append(opts, tcp.WithDialerKeepAlive(t.Dialer.KeepAlive), tcp.WithDialerTimeout(t.Dialer.Timeout), + tcp.WithDialerFallbackDelay(t.Dialer.FallbackDelay), ) if t.Dialer.DualStackEnabled { opts = append(opts, diff --git a/internal/config/tls.go b/internal/config/tls.go index 20531e23135..ace45089fbf 100644 --- a/internal/config/tls.go +++ b/internal/config/tls.go @@ -32,6 +32,9 @@ type TLS struct { // CA represent the CA certificate environment variable key used to start server. CA string `yaml:"ca" json:"ca"` + + // InsecureSkipVerify represent enable/disable skip SSL certificate verification + InsecureSkipVerify bool `yaml:"insecure_skip_verify" json:"insecure_skip_verify"` } // Bind returns TLS object whose every value except Enabled is field value of environment value. @@ -48,5 +51,6 @@ func (t *TLS) Opts() []tls.Option { tls.WithCa(t.CA), tls.WithCert(t.Cert), tls.WithKey(t.Key), + tls.WithInsecureSkipVerify(t.InsecureSkipVerify), } } diff --git a/internal/config/tls_test.go b/internal/config/tls_test.go index 4dff891df0c..0f441a2ff8d 100644 --- a/internal/config/tls_test.go +++ b/internal/config/tls_test.go @@ -179,6 +179,7 @@ func TestTLS_Opts(t *testing.T) { tls.WithCa("ca"), tls.WithCert("cert"), tls.WithKey("key"), + tls.WithInsecureSkipVerify(false), }, }, }, @@ -189,6 +190,7 @@ func TestTLS_Opts(t *testing.T) { tls.WithCa(""), tls.WithCert(""), tls.WithKey(""), + tls.WithInsecureSkipVerify(false), }, }, }, diff --git a/internal/db/nosql/cassandra/cassandra.go b/internal/db/nosql/cassandra/cassandra.go index 43d39d735b0..6e2ea672572 100644 --- a/internal/db/nosql/cassandra/cassandra.go +++ b/internal/db/nosql/cassandra/cassandra.go @@ -27,6 +27,7 @@ import ( "github.com/scylladb/gocqlx/qb" "github.com/vdaas/vald/internal/errors" "github.com/vdaas/vald/internal/log" + "github.com/vdaas/vald/internal/net/tcp" ) var ( @@ -156,6 +157,7 @@ type ( connectObserver ConnectObserver frameHeaderObserver FrameHeaderObserver defaultIdempotence bool + rawDialer tcp.Dialer dialer gocql.Dialer writeCoalesceWaitTime time.Duration @@ -305,6 +307,9 @@ func (c *client) Open(ctx context.Context) (err error) { log.Debugf("failed to create session %#v", c) return errors.ErrCassandraFailedToCreateSession(err, c.hosts, c.port, c.cqlVersion) } + if c.rawDialer != nil { + c.rawDialer.StartDialerCache(ctx) + } return nil } diff --git a/internal/db/nosql/cassandra/cassandra_mock_test.go b/internal/db/nosql/cassandra/cassandra_mock_test.go index b03757a7f6d..564211ac559 100644 --- a/internal/db/nosql/cassandra/cassandra_mock_test.go +++ b/internal/db/nosql/cassandra/cassandra_mock_test.go @@ -34,6 +34,11 @@ func (dm *DialerMock) DialContext(ctx context.Context, network, addr string) (ne return dm.DialContextFunc(ctx, network, addr) } +func (dm *DialerMock) GetDialer() func(ctx context.Context, network, addr string) (net.Conn, error) { + return dm.DialContextFunc +} +func (dm *DialerMock) StartDialerCache(ctx context.Context) {} + func TestMockClusterConfig_CreateSession(t *testing.T) { t.Parallel() type fields struct { diff --git a/internal/db/nosql/cassandra/conviction.go b/internal/db/nosql/cassandra/conviction.go index aa6f336ebc4..ff1e57675e9 100644 --- a/internal/db/nosql/cassandra/conviction.go +++ b/internal/db/nosql/cassandra/conviction.go @@ -37,5 +37,5 @@ func (c *convictionPolicy) AddFailure(err error, host *gocql.HostInfo) bool { // Reset clears the conviction state. func (c *convictionPolicy) Reset(host *gocql.HostInfo) { - log.Info("cassandra host %s reset detected\t%s", host.HostnameAndPort(), host.String()) + log.Infof("cassandra host %s reset detected\t%s", host.HostnameAndPort(), host.String()) } diff --git a/internal/db/nosql/cassandra/option.go b/internal/db/nosql/cassandra/option.go index e7eda57b89b..150d6524459 100644 --- a/internal/db/nosql/cassandra/option.go +++ b/internal/db/nosql/cassandra/option.go @@ -25,6 +25,7 @@ import ( "github.com/gocql/gocql" "github.com/vdaas/vald/internal/errors" + "github.com/vdaas/vald/internal/net/tcp" "github.com/vdaas/vald/internal/timeutil" ) @@ -79,11 +80,12 @@ func WithHosts(hosts ...string) Option { } // WithDialer returns the option to set the dialer. -func WithDialer(der gocql.Dialer) Option { +func WithDialer(der tcp.Dialer) Option { return func(c *client) error { if der == nil { return errors.NewErrInvalidOption("dialer", der) } + c.rawDialer = der c.dialer = der return nil } diff --git a/internal/db/nosql/cassandra/option_test.go b/internal/db/nosql/cassandra/option_test.go index 874b2f56adb..9dc5c284844 100644 --- a/internal/db/nosql/cassandra/option_test.go +++ b/internal/db/nosql/cassandra/option_test.go @@ -26,6 +26,7 @@ import ( "github.com/gocql/gocql" "github.com/vdaas/vald/internal/errors" + "github.com/vdaas/vald/internal/net/tcp" "github.com/vdaas/vald/internal/test/comparator" "go.uber.org/goleak" ) @@ -147,7 +148,7 @@ func TestWithHosts(t *testing.T) { func TestWithDialer(t *testing.T) { type T = client type args struct { - der gocql.Dialer + der tcp.Dialer } type want struct { obj *T @@ -181,7 +182,8 @@ func TestWithDialer(t *testing.T) { }, want: want{ obj: &T{ - dialer: dm, + dialer: dm, + rawDialer: dm, }, }, } diff --git a/internal/errors/net.go b/internal/errors/net.go index 1a146601e75..1e17afc5027 100644 --- a/internal/errors/net.go +++ b/internal/errors/net.go @@ -36,4 +36,9 @@ var ( ErrNoPortAvailable = func(host string, start, end uint16) error { return Errorf("no port available for Host: %s\tbetween %d ~ %d", host, start, end) } + + // ErrLookupIPAddrNotFound represents a function to generate an error that the host's ip address could not discovererd from DNS. + ErrLookupIPAddrNotFound = func(host string) error { + return Errorf("failed to lookup ip addrs for host: %s", host) + } ) diff --git a/internal/k8s/option.go b/internal/k8s/option.go index b346cfb1832..ba5a8ab94eb 100644 --- a/internal/k8s/option.go +++ b/internal/k8s/option.go @@ -19,6 +19,7 @@ package k8s import ( "github.com/vdaas/vald/internal/errgroup" + "github.com/vdaas/vald/internal/net/tcp" "sigs.k8s.io/controller-runtime/pkg/manager" ) @@ -81,3 +82,12 @@ func WithDisableLeaderElection() Option { return nil } } + +func WithDialer(der tcp.Dialer) Option { + return func(c *controller) error { + if der != nil { + c.der = der + } + return nil + } +} diff --git a/internal/k8s/option_test.go b/internal/k8s/option_test.go index f4db7697938..16cb56cea56 100644 --- a/internal/k8s/option_test.go +++ b/internal/k8s/option_test.go @@ -21,6 +21,7 @@ import ( "testing" "github.com/vdaas/vald/internal/errgroup" + "github.com/vdaas/vald/internal/net/tcp" "go.uber.org/goleak" "sigs.k8s.io/controller-runtime/pkg/manager" ) @@ -823,3 +824,120 @@ func TestWithDisableLeaderElection(t *testing.T) { }) } } + +func TestWithDialer(t *testing.T) { + t.Parallel() + // Change interface type to the type of object you are testing + type T = interface{} + type args struct { + der tcp.Dialer + } + type want struct { + obj *T + // Uncomment this line if the option returns an error, otherwise delete it + // err error + } + type test struct { + name string + args args + want want + // Use the first line if the option returns an error. otherwise use the second line + // checkFunc func(want, *T, error) error + // checkFunc func(want, *T) error + beforeFunc func(args) + afterFunc func(args) + } + + // Uncomment this block if the option returns an error, otherwise delete it + /* + defaultCheckFunc := func(w want, obj *T, err error) error { + if !errors.Is(err, w.err) { + return errors.Errorf("got_error: \"%#v\",\n\t\t\t\twant: \"%#v\"", err, w.err) + } + if !reflect.DeepEqual(obj, w.obj) { + return errors.Errorf("got: \"%#v\",\n\t\t\t\twant: \"%#v\"", obj, w.obj) + } + return nil + } + */ + + // Uncomment this block if the option do not returns an error, otherwise delete it + /* + defaultCheckFunc := func(w want, obj *T) error { + if !reflect.DeepEqual(obj, w.obj) { + return errors.Errorf("got: \"%#v\",\n\t\t\t\twant: \"%#v\"", obj, w.obj) + } + return nil + } + */ + + tests := []test{ + // TODO test cases + /* + { + name: "test_case_1", + args: args { + der: nil, + }, + want: want { + obj: new(T), + }, + }, + */ + + // TODO test cases + /* + func() test { + return test { + name: "test_case_2", + args: args { + der: nil, + }, + want: want { + obj: new(T), + }, + } + }(), + */ + } + + for _, tc := range tests { + test := tc + t.Run(test.name, func(tt *testing.T) { + tt.Parallel() + defer goleak.VerifyNone(tt, goleak.IgnoreCurrent()) + if test.beforeFunc != nil { + test.beforeFunc(test.args) + } + if test.afterFunc != nil { + defer test.afterFunc(test.args) + } + + // Uncomment this block if the option returns an error, otherwise delete it + /* + if test.checkFunc == nil { + test.checkFunc = defaultCheckFunc + } + + got := WithDialer(test.args.der) + obj := new(T) + if err := test.checkFunc(test.want, obj, got(obj)); err != nil { + tt.Errorf("error = %v", err) + } + */ + + // Uncomment this block if the option do not return an error, otherwise delete it + /* + if test.checkFunc == nil { + test.checkFunc = defaultCheckFunc + } + got := WithDialer(test.args.der) + obj := new(T) + got(obj) + if err := test.checkFunc(test.want, obj); err != nil { + tt.Errorf("error = %v", err) + } + */ + }) + } +} diff --git a/internal/k8s/reconciler.go b/internal/k8s/reconciler.go index bdb25a116c3..e4e20b351b5 100644 --- a/internal/k8s/reconciler.go +++ b/internal/k8s/reconciler.go @@ -23,6 +23,7 @@ import ( "github.com/vdaas/vald/internal/errgroup" "github.com/vdaas/vald/internal/errors" + "github.com/vdaas/vald/internal/net/tcp" "github.com/vdaas/vald/internal/safety" "k8s.io/apimachinery/pkg/runtime" "sigs.k8s.io/controller-runtime/pkg/builder" @@ -53,6 +54,7 @@ type controller struct { leaderElection bool mgr manager.Manager rcs []ResourceController + der tcp.Dialer } func New(opts ...Option) (cl Controller, err error) { @@ -72,6 +74,9 @@ func New(opts ...Option) (cl Controller, err error) { if cfg == nil { return nil, errors.ErrInvalidReconcilerConfig } + if c.der != nil { + cfg.Dial = c.der.GetDialer() + } c.mgr, err = manager.New( cfg, manager.Options{ @@ -114,6 +119,9 @@ func New(opts ...Option) (cl Controller, err error) { } func (c *controller) Start(ctx context.Context) (<-chan error, error) { + if c.der != nil { + c.der.StartDialerCache(ctx) + } ech := make(chan error, 1) c.eg.Go(safety.RecoverFunc(func() error { defer close(ech) diff --git a/internal/net/grpc/client.go b/internal/net/grpc/client.go index bd7de25ab91..a80584ca225 100644 --- a/internal/net/grpc/client.go +++ b/internal/net/grpc/client.go @@ -30,6 +30,7 @@ import ( "github.com/vdaas/vald/internal/errors" "github.com/vdaas/vald/internal/log" "github.com/vdaas/vald/internal/net/grpc/pool" + "github.com/vdaas/vald/internal/net/tcp" "github.com/vdaas/vald/internal/observability/trace" "github.com/vdaas/vald/internal/safety" "github.com/vdaas/vald/internal/singleflight" @@ -93,6 +94,7 @@ type gRPCClient struct { conns grpcConns hcDur time.Duration prDur time.Duration + dialer tcp.Dialer enablePoolRebalance bool resolveDNS bool dopts []DialOption @@ -138,6 +140,10 @@ func (g *gRPCClient) StartConnectionMonitor(ctx context.Context) (<-chan error, return nil, errors.ErrGRPCTargetAddrNotFound } + if g.dialer != nil { + g.dialer.StartDialerCache(ctx) + } + ech := make(chan error, len(addrs)) for _, addr := range addrs { if len(addr) != 0 { diff --git a/internal/net/grpc/errdetails/errdetails_test.go b/internal/net/grpc/errdetails/errdetails_test.go new file mode 100644 index 00000000000..f65e5861799 --- /dev/null +++ b/internal/net/grpc/errdetails/errdetails_test.go @@ -0,0 +1,492 @@ +// +// Copyright (C) 2019-2021 vdaas.org vald team +// +// 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 +// +// https://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. +// + +// Package errdetails provides error detail for grpc status +package errdetails + +import ( + "reflect" + "testing" + + "github.com/vdaas/vald/internal/errors" + "github.com/vdaas/vald/internal/net/grpc/types" + "go.uber.org/goleak" +) + +func TestErrorDetails_String(t *testing.T) { + t.Parallel() + type fields struct { + Code int32 + Message string + Error error + Details []*ErrorDetails + } + type want struct { + want string + } + type test struct { + name string + fields fields + want want + checkFunc func(want, string) error + beforeFunc func() + afterFunc func() + } + defaultCheckFunc := func(w want, got string) error { + if !reflect.DeepEqual(got, w.want) { + return errors.Errorf("got: \"%#v\",\n\t\t\t\twant: \"%#v\"", got, w.want) + } + return nil + } + tests := []test{ + // TODO test cases + /* + { + name: "test_case_1", + fields: fields { + Code: 0, + Message: "", + Error: nil, + Details: nil, + }, + want: want{}, + checkFunc: defaultCheckFunc, + }, + */ + + // TODO test cases + /* + func() test { + return test { + name: "test_case_2", + fields: fields { + Code: 0, + Message: "", + Error: nil, + Details: nil, + }, + want: want{}, + checkFunc: defaultCheckFunc, + } + }(), + */ + } + + for _, tc := range tests { + test := tc + t.Run(test.name, func(tt *testing.T) { + tt.Parallel() + defer goleak.VerifyNone(tt, goleak.IgnoreCurrent()) + if test.beforeFunc != nil { + test.beforeFunc() + } + if test.afterFunc != nil { + defer test.afterFunc() + } + if test.checkFunc == nil { + test.checkFunc = defaultCheckFunc + } + e := &ErrorDetails{ + Code: test.fields.Code, + Message: test.fields.Message, + Error: test.fields.Error, + Details: test.fields.Details, + } + + got := e.String() + if err := test.checkFunc(test.want, got); err != nil { + tt.Errorf("error = %v", err) + } + }) + } +} + +func TestDecodeErrorDetails(t *testing.T) { + t.Parallel() + type args struct { + objs []interface{} + } + type want struct { + wantEs []*ErrorDetails + } + type test struct { + name string + args args + want want + checkFunc func(want, []*ErrorDetails) error + beforeFunc func(args) + afterFunc func(args) + } + defaultCheckFunc := func(w want, gotEs []*ErrorDetails) error { + if !reflect.DeepEqual(gotEs, w.wantEs) { + return errors.Errorf("got: \"%#v\",\n\t\t\t\twant: \"%#v\"", gotEs, w.wantEs) + } + return nil + } + tests := []test{ + // TODO test cases + /* + { + name: "test_case_1", + args: args { + objs: nil, + }, + want: want{}, + checkFunc: defaultCheckFunc, + }, + */ + + // TODO test cases + /* + func() test { + return test { + name: "test_case_2", + args: args { + objs: nil, + }, + want: want{}, + checkFunc: defaultCheckFunc, + } + }(), + */ + } + + for _, tc := range tests { + test := tc + t.Run(test.name, func(tt *testing.T) { + tt.Parallel() + defer goleak.VerifyNone(tt, goleak.IgnoreCurrent()) + if test.beforeFunc != nil { + test.beforeFunc(test.args) + } + if test.afterFunc != nil { + defer test.afterFunc(test.args) + } + if test.checkFunc == nil { + test.checkFunc = defaultCheckFunc + } + + gotEs := DecodeErrorDetails(test.args.objs...) + if err := test.checkFunc(test.want, gotEs); err != nil { + tt.Errorf("error = %v", err) + } + }) + } +} + +func TestSerialize(t *testing.T) { + t.Parallel() + type args struct { + objs []interface{} + } + type want struct { + want string + } + type test struct { + name string + args args + want want + checkFunc func(want, string) error + beforeFunc func(args) + afterFunc func(args) + } + defaultCheckFunc := func(w want, got string) error { + if !reflect.DeepEqual(got, w.want) { + return errors.Errorf("got: \"%#v\",\n\t\t\t\twant: \"%#v\"", got, w.want) + } + return nil + } + tests := []test{ + // TODO test cases + /* + { + name: "test_case_1", + args: args { + objs: nil, + }, + want: want{}, + checkFunc: defaultCheckFunc, + }, + */ + + // TODO test cases + /* + func() test { + return test { + name: "test_case_2", + args: args { + objs: nil, + }, + want: want{}, + checkFunc: defaultCheckFunc, + } + }(), + */ + } + + for _, tc := range tests { + test := tc + t.Run(test.name, func(tt *testing.T) { + tt.Parallel() + defer goleak.VerifyNone(tt, goleak.IgnoreCurrent()) + if test.beforeFunc != nil { + test.beforeFunc(test.args) + } + if test.afterFunc != nil { + defer test.afterFunc(test.args) + } + if test.checkFunc == nil { + test.checkFunc = defaultCheckFunc + } + + got := Serialize(test.args.objs...) + if err := test.checkFunc(test.want, got); err != nil { + tt.Errorf("error = %v", err) + } + }) + } +} + +func TestDecodeDetail(t *testing.T) { + t.Parallel() + type args struct { + detail *types.Any + } + type want struct { + wantData interface{} + err error + } + type test struct { + name string + args args + want want + checkFunc func(want, interface{}, error) error + beforeFunc func(args) + afterFunc func(args) + } + defaultCheckFunc := func(w want, gotData interface{}, err error) error { + if !errors.Is(err, w.err) { + return errors.Errorf("got_error: \"%#v\",\n\t\t\t\twant: \"%#v\"", err, w.err) + } + if !reflect.DeepEqual(gotData, w.wantData) { + return errors.Errorf("got: \"%#v\",\n\t\t\t\twant: \"%#v\"", gotData, w.wantData) + } + return nil + } + tests := []test{ + // TODO test cases + /* + { + name: "test_case_1", + args: args { + detail: nil, + }, + want: want{}, + checkFunc: defaultCheckFunc, + }, + */ + + // TODO test cases + /* + func() test { + return test { + name: "test_case_2", + args: args { + detail: nil, + }, + want: want{}, + checkFunc: defaultCheckFunc, + } + }(), + */ + } + + for _, tc := range tests { + test := tc + t.Run(test.name, func(tt *testing.T) { + tt.Parallel() + defer goleak.VerifyNone(tt, goleak.IgnoreCurrent()) + if test.beforeFunc != nil { + test.beforeFunc(test.args) + } + if test.afterFunc != nil { + defer test.afterFunc(test.args) + } + if test.checkFunc == nil { + test.checkFunc = defaultCheckFunc + } + + gotData, err := DecodeDetail(test.args.detail) + if err := test.checkFunc(test.want, gotData, err); err != nil { + tt.Errorf("error = %v", err) + } + }) + } +} + +func TestDecodeDetails(t *testing.T) { + t.Parallel() + type args struct { + details []*types.Any + } + type want struct { + wantDs []interface{} + err error + } + type test struct { + name string + args args + want want + checkFunc func(want, []interface{}, error) error + beforeFunc func(args) + afterFunc func(args) + } + defaultCheckFunc := func(w want, gotDs []interface{}, err error) error { + if !errors.Is(err, w.err) { + return errors.Errorf("got_error: \"%#v\",\n\t\t\t\twant: \"%#v\"", err, w.err) + } + if !reflect.DeepEqual(gotDs, w.wantDs) { + return errors.Errorf("got: \"%#v\",\n\t\t\t\twant: \"%#v\"", gotDs, w.wantDs) + } + return nil + } + tests := []test{ + // TODO test cases + /* + { + name: "test_case_1", + args: args { + details: nil, + }, + want: want{}, + checkFunc: defaultCheckFunc, + }, + */ + + // TODO test cases + /* + func() test { + return test { + name: "test_case_2", + args: args { + details: nil, + }, + want: want{}, + checkFunc: defaultCheckFunc, + } + }(), + */ + } + + for _, tc := range tests { + test := tc + t.Run(test.name, func(tt *testing.T) { + tt.Parallel() + defer goleak.VerifyNone(tt, goleak.IgnoreCurrent()) + if test.beforeFunc != nil { + test.beforeFunc(test.args) + } + if test.afterFunc != nil { + defer test.afterFunc(test.args) + } + if test.checkFunc == nil { + test.checkFunc = defaultCheckFunc + } + + gotDs, err := DecodeDetails(test.args.details...) + if err := test.checkFunc(test.want, gotDs, err); err != nil { + tt.Errorf("error = %v", err) + } + }) + } +} + +func TestDecodeDetailsToString(t *testing.T) { + t.Parallel() + type args struct { + details []*types.Any + } + type want struct { + wantMsg string + err error + } + type test struct { + name string + args args + want want + checkFunc func(want, string, error) error + beforeFunc func(args) + afterFunc func(args) + } + defaultCheckFunc := func(w want, gotMsg string, err error) error { + if !errors.Is(err, w.err) { + return errors.Errorf("got_error: \"%#v\",\n\t\t\t\twant: \"%#v\"", err, w.err) + } + if !reflect.DeepEqual(gotMsg, w.wantMsg) { + return errors.Errorf("got: \"%#v\",\n\t\t\t\twant: \"%#v\"", gotMsg, w.wantMsg) + } + return nil + } + tests := []test{ + // TODO test cases + /* + { + name: "test_case_1", + args: args { + details: nil, + }, + want: want{}, + checkFunc: defaultCheckFunc, + }, + */ + + // TODO test cases + /* + func() test { + return test { + name: "test_case_2", + args: args { + details: nil, + }, + want: want{}, + checkFunc: defaultCheckFunc, + } + }(), + */ + } + + for _, tc := range tests { + test := tc + t.Run(test.name, func(tt *testing.T) { + tt.Parallel() + defer goleak.VerifyNone(tt, goleak.IgnoreCurrent()) + if test.beforeFunc != nil { + test.beforeFunc(test.args) + } + if test.afterFunc != nil { + defer test.afterFunc(test.args) + } + if test.checkFunc == nil { + test.checkFunc = defaultCheckFunc + } + + gotMsg, err := DecodeDetailsToString(test.args.details...) + if err := test.checkFunc(test.want, gotMsg, err); err != nil { + tt.Errorf("error = %v", err) + } + }) + } +} diff --git a/internal/net/grpc/option.go b/internal/net/grpc/option.go index b5aa7df8a45..fdb07e18aab 100644 --- a/internal/net/grpc/option.go +++ b/internal/net/grpc/option.go @@ -322,6 +322,7 @@ func WithKeepaliveParams(t, to string, permitWithoutStream bool) Option { func WithDialer(der tcp.Dialer) Option { return func(g *gRPCClient) { if der != nil { + g.dialer = der g.dopts = append(g.dopts, grpc.WithContextDialer(func(ctx context.Context, addr string) (net.Conn, error) { return der.GetDialer()(ctx, "tcp", addr) diff --git a/internal/net/grpc/pool/pool.go b/internal/net/grpc/pool/pool.go index 0287ca09064..1e329f64b7a 100644 --- a/internal/net/grpc/pool/pool.go +++ b/internal/net/grpc/pool/pool.go @@ -21,6 +21,7 @@ import ( "context" "fmt" "sort" + "strconv" "strings" "sync/atomic" "time" @@ -97,7 +98,7 @@ func New(ctx context.Context, opts ...Option) (c Conn, err error) { if err != nil { return nil, err } - p.addr = fmt.Sprintf("%s:%d", p.host, p.port) + p.addr = net.JoinHostPort(p.host, strconv.FormatInt(int64(p.port), 10)) } conn, err := grpc.DialContext(ctx, p.addr, p.dopts...) @@ -107,7 +108,7 @@ func New(ctx context.Context, opts ...Option) (c Conn, err error) { if err != nil { return nil, err } - p.addr = fmt.Sprintf("%s:%d", p.host, p.port) + p.addr = net.JoinHostPort(p.host, strconv.FormatInt(int64(p.port), 10)) } if conn != nil { err = conn.Close() @@ -144,7 +145,7 @@ func (p *pool) Connect(ctx context.Context) (c Conn, err error) { default: var ( conn *ClientConn - addr = fmt.Sprintf("%s:%d", ips[i%len(ips)], p.port) + addr = net.JoinHostPort(ips[i%len(ips)], strconv.FormatInt(int64(p.port), 10)) pc, ok = p.load(i) ) if ok && pc != nil && pc.addr == addr && isHealthy(pc.conn) { @@ -387,7 +388,7 @@ func (p *pool) lookupIPAddr(ctx context.Context) (ips []string, err error) { ipStr = fmt.Sprintf("[%s]", ipStr) } var conn net.Conn - addr := fmt.Sprintf("%s:%d", ipStr, p.port) + addr := net.JoinHostPort(ipStr, strconv.FormatInt(int64(p.port), 10)) if net.DefaultResolver.Dial != nil { ctx, cancel := context.WithTimeout(ctx, time.Millisecond*10) conn, err = net.DefaultResolver.Dial(ctx, network, addr) @@ -470,7 +471,8 @@ func (p *pool) scanGRPCPort(ctx context.Context) (err error) { func isGRPCPort(ctx context.Context, host string, port uint16) bool { ctx, cancel := context.WithTimeout(ctx, time.Millisecond*5) defer cancel() - conn, err := grpc.DialContext(ctx, fmt.Sprintf("%s:%d", host, port), + conn, err := grpc.DialContext(ctx, + net.JoinHostPort(host, strconv.FormatInt(int64(port), 10)), grpc.WithInsecure(), grpc.WithBlock(), ) diff --git a/internal/net/grpc/types/types_test.go b/internal/net/grpc/types/types_test.go new file mode 100644 index 00000000000..430a209c568 --- /dev/null +++ b/internal/net/grpc/types/types_test.go @@ -0,0 +1,102 @@ +// +// Copyright (C) 2019-2021 vdaas.org vald team +// +// 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 +// +// https://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. +// + +// Package types provides alias of protobuf library types +package types + +import ( + "testing" + + "github.com/gogo/protobuf/proto" + "github.com/vdaas/vald/internal/errors" + "go.uber.org/goleak" +) + +func TestUnmarshalAny(t *testing.T) { + t.Parallel() + type args struct { + any *Any + pb proto.Message + } + type want struct { + err error + } + type test struct { + name string + args args + want want + checkFunc func(want, error) error + beforeFunc func(args) + afterFunc func(args) + } + defaultCheckFunc := func(w want, err error) error { + if !errors.Is(err, w.err) { + return errors.Errorf("got_error: \"%#v\",\n\t\t\t\twant: \"%#v\"", err, w.err) + } + return nil + } + tests := []test{ + // TODO test cases + /* + { + name: "test_case_1", + args: args { + any: nil, + pb: nil, + }, + want: want{}, + checkFunc: defaultCheckFunc, + }, + */ + + // TODO test cases + /* + func() test { + return test { + name: "test_case_2", + args: args { + any: nil, + pb: nil, + }, + want: want{}, + checkFunc: defaultCheckFunc, + } + }(), + */ + } + + for _, tc := range tests { + test := tc + t.Run(test.name, func(tt *testing.T) { + tt.Parallel() + defer goleak.VerifyNone(tt, goleak.IgnoreCurrent()) + if test.beforeFunc != nil { + test.beforeFunc(test.args) + } + if test.afterFunc != nil { + defer test.afterFunc(test.args) + } + if test.checkFunc == nil { + test.checkFunc = defaultCheckFunc + } + + err := UnmarshalAny(test.args.any, test.args.pb) + if err := test.checkFunc(test.want, err); err != nil { + tt.Errorf("error = %v", err) + } + }) + } +} diff --git a/internal/net/net.go b/internal/net/net.go index 3637597b39e..658c0753fad 100644 --- a/internal/net/net.go +++ b/internal/net/net.go @@ -19,7 +19,6 @@ package net import ( "context" - "fmt" "net" "strconv" "strings" @@ -29,6 +28,7 @@ import ( "github.com/vdaas/vald/internal/errgroup" "github.com/vdaas/vald/internal/errors" "github.com/vdaas/vald/internal/log" + "github.com/vdaas/vald/internal/safety" ) const ( @@ -97,6 +97,11 @@ func IsIPv4(addr string) bool { return net.ParseIP(addr) != nil && strings.Count(addr, ":") < 2 } +// JoinHostPort joins the host/IP address and the port number, +func JoinHostPort(host, port string) string { + return net.JoinHostPort(host, port) +} + // SplitHostPort splits the address, and return the host/IP address and the port number, // and any error occurred. // If it is the loopback address, it will return the loopback address and corresponding port number. @@ -136,14 +141,15 @@ func ScanPorts(ctx context.Context, start, end uint16, host string) (ports []uin var mu sync.Mutex + var der net.Dialer for i := start; i >= start && i <= end; i++ { port := i - eg.Go(func() error { + eg.Go(safety.RecoverFunc(func() error { select { case <-egctx.Done(): return egctx.Err() default: - conn, err := net.Dial("tcp", fmt.Sprintf("%s:%d", host, port)) + conn, err := der.DialContext(ctx, "tcp", JoinHostPort(host, strconv.FormatInt(int64(port), 10))) if err != nil { log.Warn(err) return nil @@ -158,7 +164,7 @@ func ScanPorts(ctx context.Context, start, end uint16, host string) (ports []uin } return nil } - }) + })) } if err = eg.Wait(); err != nil { diff --git a/internal/net/net_test.go b/internal/net/net_test.go index 80306883402..a00f4f50826 100644 --- a/internal/net/net_test.go +++ b/internal/net/net_test.go @@ -943,3 +943,79 @@ func TestLoadLocalIP(t *testing.T) { }) } } + +func TestJoinHostPort(t *testing.T) { + t.Parallel() + type args struct { + host string + port string + } + type want struct { + want string + } + type test struct { + name string + args args + want want + checkFunc func(want, string) error + beforeFunc func(args) + afterFunc func(args) + } + defaultCheckFunc := func(w want, got string) error { + if !reflect.DeepEqual(got, w.want) { + return errors.Errorf("got: \"%#v\",\n\t\t\t\twant: \"%#v\"", got, w.want) + } + return nil + } + tests := []test{ + // TODO test cases + /* + { + name: "test_case_1", + args: args { + host: "", + port: "", + }, + want: want{}, + checkFunc: defaultCheckFunc, + }, + */ + + // TODO test cases + /* + func() test { + return test { + name: "test_case_2", + args: args { + host: "", + port: "", + }, + want: want{}, + checkFunc: defaultCheckFunc, + } + }(), + */ + } + + for _, tc := range tests { + test := tc + t.Run(test.name, func(tt *testing.T) { + tt.Parallel() + defer goleak.VerifyNone(tt, goleak.IgnoreCurrent()) + if test.beforeFunc != nil { + test.beforeFunc(test.args) + } + if test.afterFunc != nil { + defer test.afterFunc(test.args) + } + if test.checkFunc == nil { + test.checkFunc = defaultCheckFunc + } + + got := JoinHostPort(test.args.host, test.args.port) + if err := test.checkFunc(test.want, got); err != nil { + tt.Errorf("error = %v", err) + } + }) + } +} diff --git a/internal/net/tcp/dialer.go b/internal/net/tcp/dialer.go index ad3b611f7e0..8175ceffaa1 100644 --- a/internal/net/tcp/dialer.go +++ b/internal/net/tcp/dialer.go @@ -19,17 +19,18 @@ package tcp import ( "context" - "crypto/tls" "strconv" "sync" "sync/atomic" "time" "github.com/vdaas/vald/internal/cache" + "github.com/vdaas/vald/internal/errgroup" "github.com/vdaas/vald/internal/errors" "github.com/vdaas/vald/internal/log" "github.com/vdaas/vald/internal/net" "github.com/vdaas/vald/internal/safety" + "github.com/vdaas/vald/internal/tls" ) // Dialer is an interface to get the dialer instance to connect to an address. @@ -42,6 +43,7 @@ type Dialer interface { type dialer struct { cache cache.Cache dnsCache bool + dnsCachedOnce sync.Once tlsConfig *tls.Config dnsRefreshDurationStr string dnsCacheExpirationStr string @@ -49,16 +51,18 @@ type dialer struct { dnsCacheExpiration time.Duration dialerTimeout time.Duration dialerKeepAlive time.Duration + dialerFallbackDelay time.Duration dialerDualStack bool addrs sync.Map der *net.Dialer dialer func(ctx context.Context, network, addr string) (net.Conn, error) + eg errgroup.Group } type addrInfo struct { addr string host string - port uint16 + port string isIP bool } @@ -90,10 +94,11 @@ func NewDialer(opts ...DialerOption) (der Dialer, err error) { } d.der = &net.Dialer{ - Timeout: d.dialerTimeout, - KeepAlive: d.dialerKeepAlive, - DualStack: d.dialerDualStack, - Control: Control, + Timeout: d.dialerTimeout, + KeepAlive: d.dialerKeepAlive, + DualStack: d.dialerDualStack, + FallbackDelay: d.dialerFallbackDelay, + Control: Control, } d.dialer = d.dial @@ -138,13 +143,19 @@ func (d *dialer) lookup(ctx context.Context, host string) (*dialerCache, error) return nil, err } + if len(r) == 0 { + return nil, errors.ErrLookupIPAddrNotFound(host) + } + dc := &dialerCache{ ips: make([]string, 0, len(r)), } + for _, ip := range r { dc.ips = append(dc.ips, ip.String()) } + log.Infof("lookup succeed %v", dc.ips) d.cache.Set(host, dc) return dc, nil } @@ -152,7 +163,9 @@ func (d *dialer) lookup(ctx context.Context, host string) (*dialerCache, error) // StartDialerCache starts the dialer cache to expire the cache automatically. func (d *dialer) StartDialerCache(ctx context.Context) { if d.dnsCache && d.cache != nil { - d.cache.Start(ctx) + d.dnsCachedOnce.Do(func() { + d.cache.Start(ctx) + }) } } @@ -166,16 +179,18 @@ func (d *dialer) DialContext(ctx context.Context, network, address string) (net. func (d *dialer) cachedDialer(dctx context.Context, network, addr string) (conn net.Conn, err error) { var ( host string - port uint16 + port string isIP bool ) ai, ok := d.addrs.Load(addr) if !ok { - host, port, isIP, err = net.Parse(addr) + var nport uint16 + host, nport, isIP, err = net.Parse(addr) if err != nil { d.addrs.Delete(addr) return nil, err } + port = strconv.FormatUint(uint64(nport), 10) d.addrs.Store(addr, &addrInfo{ host: host, port: port, @@ -194,10 +209,12 @@ func (d *dialer) cachedDialer(dctx context.Context, network, addr string) (conn if d.dnsCache && !isIP { if dc, err := d.lookup(dctx, host); err == nil { for i := uint32(0); i < dc.Len(); i++ { - hostIP := dc.IP() + ":" + strconv.FormatUint(uint64(port), 10) - if conn, err := d.dial(dctx, network, hostIP); err == nil { + hostIP := net.JoinHostPort(dc.IP(), port) + conn, err := d.dial(dctx, network, hostIP) + if err == nil && conn != nil { return conn, nil } + log.Debugf("failed to dial connection to %s\terror: %v", hostIP, err) } d.cache.Delete(host) } @@ -206,6 +223,7 @@ func (d *dialer) cachedDialer(dctx context.Context, network, addr string) (conn } func (d *dialer) dial(ctx context.Context, network, addr string) (conn net.Conn, err error) { + log.Debugf("%s connection dialing to addr %s", network, addr) conn, err = d.der.DialContext(ctx, network, addr) if err != nil { defer func(conn net.Conn) { @@ -221,16 +239,87 @@ func (d *dialer) dial(ctx context.Context, network, addr string) (conn net.Conn, } if d.tlsConfig != nil { - return tls.Client(conn, d.tlsConfig), nil + return d.tlsHandshake(ctx, conn, addr) } + log.Infof("connected to addr %s succeed from %s://%s to %s://%s", + addr, + conn.LocalAddr().Network(), conn.LocalAddr().String(), + conn.RemoteAddr().Network(), conn.RemoteAddr().String(), + ) return conn, nil } +func (d *dialer) tlsHandshake(ctx context.Context, conn net.Conn, addr string) (*tls.Conn, error) { + var err error + if d.tlsConfig.ServerName == "" { + var host string + host, _, err = net.SplitHostPort(addr) + if err == nil { + d.tlsConfig.ServerName = host + } + } + tconn := tls.Client(conn, d.tlsConfig) + ech := make(chan error) + if d.eg == nil { + d.eg = errgroup.Get() + } + var tctx context.Context + if d.der.Timeout > 0 { + var cancel context.CancelFunc + tctx, cancel = context.WithTimeout(ctx, d.der.Timeout) + defer cancel() + } else { + tctx = ctx + } + d.eg.Go(safety.RecoverFunc(func() error { + defer close(ech) + select { + case <-tctx.Done(): + case ech <- tconn.Handshake(): // wait for tls handshake connection + } + return nil + })) + select { + case <-tctx.Done(): + err = tctx.Err() // if Handshake timeout we should cancel rawconnection + case err = <-ech: + if err != nil { + terr := tctx.Err() + if terr != nil { + err = terr + } + } + } + if err != nil { + defer func(conn net.Conn) { + if conn != nil { + if err != nil { + err = errors.Wrap(conn.Close(), err.Error()) + return + } + err = conn.Close() + } + }(conn) + return nil, err + } + log.Infof("tls handshake addr %s succeed from %s://%s to %s://%s,\tconnectionstate: [ Version:%s, ServerName: %s, HandshakeComplete: %v, DidResume: %v, NegotiatedProtocol: %s ]", + addr, + tconn.LocalAddr().Network(), tconn.LocalAddr().String(), + tconn.RemoteAddr().Network(), tconn.RemoteAddr().String(), + tconn.ConnectionState().Version, + tconn.ConnectionState().ServerName, + tconn.ConnectionState().HandshakeComplete, + tconn.ConnectionState().DidResume, + tconn.ConnectionState().NegotiatedProtocol, + ) + return tconn, nil +} + func (d *dialer) cacheExpireHook(ctx context.Context, addr string) { if err := safety.RecoverFunc(func() (err error) { _, err = d.lookup(ctx, addr) return })(); err != nil { - log.Errorf("DNS cacheExpireHook error occurred: %v", err) + log.Errorf("dns cacheExpireHook error occurred: %v\taddr:\t%s", err, addr) } } diff --git a/internal/net/tcp/dialer_test.go b/internal/net/tcp/dialer_test.go index b9b361951bd..bbdba405a35 100644 --- a/internal/net/tcp/dialer_test.go +++ b/internal/net/tcp/dialer_test.go @@ -19,7 +19,6 @@ package tcp import ( "context" - "crypto/tls" stderrors "errors" "fmt" "io/ioutil" @@ -27,9 +26,11 @@ import ( stdnet "net" "net/http" "net/http/httptest" + "os" "reflect" "strconv" "strings" + "sync" "sync/atomic" "testing" "time" @@ -38,9 +39,11 @@ import ( "github.com/google/go-cmp/cmp/cmpopts" "github.com/vdaas/vald/internal/cache" "github.com/vdaas/vald/internal/cache/gache" + "github.com/vdaas/vald/internal/errgroup" "github.com/vdaas/vald/internal/errors" "github.com/vdaas/vald/internal/log" "github.com/vdaas/vald/internal/net" + "github.com/vdaas/vald/internal/tls" "go.uber.org/goleak" ) @@ -50,6 +53,11 @@ var goleakIgnoreOptions = []goleak.Option{ goleak.IgnoreTopFunction("net._C2func_getaddrinfo"), } +func TestMain(m *testing.M) { + log.Init() + os.Exit(m.Run()) +} + func Test_dialerCache_IP(t *testing.T) { type fields struct { ips []string @@ -263,7 +271,7 @@ func TestNewDialer(t *testing.T) { got := gotDer.(*dialer) opts := []cmp.Option{ cmp.AllowUnexported(*want), - cmpopts.IgnoreFields(*want, "dialer", "der", "addrs"), + cmpopts.IgnoreFields(*want, "dialer", "der", "addrs", "eg", "dnsCachedOnce"), cmp.Comparer(func(x, y cache.Cache) bool { if x == nil && y == nil { return true @@ -289,10 +297,11 @@ func TestNewDialer(t *testing.T) { tests := []test{ func() test { d := &net.Dialer{ - Timeout: time.Second * 30, - KeepAlive: time.Second * 30, - DualStack: true, - Control: Control, + Timeout: 0, + KeepAlive: time.Second * 30, + FallbackDelay: time.Millisecond * 300, + DualStack: true, + Control: Control, } d.Resolver = &net.Resolver{ PreferGo: false, @@ -303,11 +312,13 @@ func TestNewDialer(t *testing.T) { name: "returns dialer when option is empty", want: want{ wantDer: &dialer{ - dialerKeepAlive: time.Second * 30, - dialerTimeout: time.Second * 30, - dialerDualStack: true, - der: d, - dialer: d.DialContext, + dialerKeepAlive: time.Second * 30, + dialerTimeout: 0, + dialerFallbackDelay: time.Millisecond * 300, + dialerDualStack: true, + der: d, + dialer: d.DialContext, + eg: errgroup.Get(), }, }, } @@ -339,7 +350,8 @@ func TestNewDialer(t *testing.T) { want: want{ wantDer: &dialer{ dialerKeepAlive: time.Second * 30, - dialerTimeout: time.Second * 30, + dialerTimeout: 0, + dialerFallbackDelay: time.Millisecond * 300, dnsRefreshDuration: time.Second * 5, dnsCacheExpiration: time.Second * 10, dnsRefreshDurationStr: "5s", @@ -791,7 +803,6 @@ func Test_dialer_StartDialerCache(t *testing.T) { }(), } - log.Init() for _, test := range tests { t.Run(test.name, func(tt *testing.T) { defer goleak.VerifyNone(tt, goleakIgnoreOptions...) @@ -974,7 +985,7 @@ func Test_dialer_cachedDialer(t *testing.T) { args: args{ dctx: context.Background(), network: "tcp", - addr: "google.com:80", + addr: "google.com:443", }, fields: fields{ der: &net.Dialer{ @@ -1075,25 +1086,27 @@ func Test_dialer_cachedDialer(t *testing.T) { srv := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(200) })) - host, port, _ := net.SplitHostPort(srv.URL[len("https://"):]) - addr := "invalid_ip" - + addr := host + ":" + strconv.FormatUint(uint64(port), 10) // set the hostname 'invalid_ip' to the host name of the cache with the test server ip address - cache, _ := cache.New() + cache, err := cache.New() + if err != nil { + t.Error(err) + } cache.Set(addr, &dialerCache{ ips: []string{ host, }, }) + tcfg, _ := tls.NewClientConfig(tls.WithInsecureSkipVerify(true)) return test{ name: "return cached ip tls connection", args: args{ dctx: context.Background(), network: "tcp", - addr: addr + ":" + strconv.FormatUint(uint64(port), 10), + addr: addr, }, fields: fields{ der: &net.Dialer{ @@ -1101,13 +1114,14 @@ func Test_dialer_cachedDialer(t *testing.T) { PreferGo: false, }, }, - cache: cache, - dnsCache: true, - tlsConfig: new(tls.Config), + cache: cache, + dnsCache: true, + // tlsConfig: srv.Config.TLSConfig, + tlsConfig: tcfg, }, checkFunc: func(d *dialer, w want, gotConn net.Conn, err error) error { if err != nil { - return errors.New("err is not nil") + return errors.Wrap(err, "err is not nil") } if gotConn == nil { return errors.New("conn is nil") @@ -1396,6 +1410,7 @@ func Test_dialer_cachedDialer(t *testing.T) { dialerDualStack: test.fields.dialerDualStack, der: test.fields.der, dialer: test.fields.dialer, + eg: errgroup.Get(), } gotConn, gotErr := d.cachedDialer(test.args.dctx, test.args.network, test.args.addr) @@ -1460,7 +1475,7 @@ func Test_dialer_dial(t *testing.T) { args: args{ ctx: context.Background(), network: "tcp", - addr: "google.com:80", + addr: "google.com:443", }, fields: fields{ tlsConfig: new(tls.Config), @@ -1600,6 +1615,7 @@ func Test_dialer_dial(t *testing.T) { d := &dialer{ tlsConfig: test.fields.tlsConfig, der: test.fields.der, + eg: errgroup.Get(), } got, err := d.dial(test.args.ctx, test.args.network, test.args.addr) @@ -1716,3 +1732,159 @@ func Test_dialer_cacheExpireHook(t *testing.T) { }) } } + +func Test_dialer_tlsHandshake(t *testing.T) { + t.Parallel() + type args struct { + ctx context.Context + conn net.Conn + addr string + } + type fields struct { + cache cache.Cache + dnsCache bool + dnsCachedOnce sync.Once + tlsConfig *tls.Config + dnsRefreshDurationStr string + dnsCacheExpirationStr string + dnsRefreshDuration time.Duration + dnsCacheExpiration time.Duration + dialerTimeout time.Duration + dialerKeepAlive time.Duration + dialerFallbackDelay time.Duration + dialerDualStack bool + addrs sync.Map + der *net.Dialer + dialer func(ctx context.Context, network, addr string) (net.Conn, error) + eg errgroup.Group + } + type want struct { + want *tls.Conn + err error + } + type test struct { + name string + args args + fields fields + want want + checkFunc func(want, *tls.Conn, error) error + beforeFunc func(args) + afterFunc func(args) + } + defaultCheckFunc := func(w want, got *tls.Conn, err error) error { + if !errors.Is(err, w.err) { + return errors.Errorf("got_error: \"%#v\",\n\t\t\t\twant: \"%#v\"", err, w.err) + } + if !reflect.DeepEqual(got, w.want) { + return errors.Errorf("got: \"%#v\",\n\t\t\t\twant: \"%#v\"", got, w.want) + } + return nil + } + tests := []test{ + // TODO test cases + /* + { + name: "test_case_1", + args: args { + ctx: nil, + conn: nil, + addr: "", + }, + fields: fields { + cache: nil, + dnsCache: false, + dnsCachedOnce: sync.Once{}, + tlsConfig: nil, + dnsRefreshDurationStr: "", + dnsCacheExpirationStr: "", + dnsRefreshDuration: nil, + dnsCacheExpiration: nil, + dialerTimeout: nil, + dialerKeepAlive: nil, + dialerFallbackDelay: nil, + dialerDualStack: false, + addrs: sync.Map{}, + der: nil, + dialer: nil, + eg: nil, + }, + want: want{}, + checkFunc: defaultCheckFunc, + }, + */ + + // TODO test cases + /* + func() test { + return test { + name: "test_case_2", + args: args { + ctx: nil, + conn: nil, + addr: "", + }, + fields: fields { + cache: nil, + dnsCache: false, + dnsCachedOnce: sync.Once{}, + tlsConfig: nil, + dnsRefreshDurationStr: "", + dnsCacheExpirationStr: "", + dnsRefreshDuration: nil, + dnsCacheExpiration: nil, + dialerTimeout: nil, + dialerKeepAlive: nil, + dialerFallbackDelay: nil, + dialerDualStack: false, + addrs: sync.Map{}, + der: nil, + dialer: nil, + eg: nil, + }, + want: want{}, + checkFunc: defaultCheckFunc, + } + }(), + */ + } + + for _, tc := range tests { + test := tc + t.Run(test.name, func(tt *testing.T) { + tt.Parallel() + defer goleak.VerifyNone(tt, goleak.IgnoreCurrent()) + if test.beforeFunc != nil { + test.beforeFunc(test.args) + } + if test.afterFunc != nil { + defer test.afterFunc(test.args) + } + if test.checkFunc == nil { + test.checkFunc = defaultCheckFunc + } + d := &dialer{ + cache: test.fields.cache, + dnsCache: test.fields.dnsCache, + dnsCachedOnce: test.fields.dnsCachedOnce, + tlsConfig: test.fields.tlsConfig, + dnsRefreshDurationStr: test.fields.dnsRefreshDurationStr, + dnsCacheExpirationStr: test.fields.dnsCacheExpirationStr, + dnsRefreshDuration: test.fields.dnsRefreshDuration, + dnsCacheExpiration: test.fields.dnsCacheExpiration, + dialerTimeout: test.fields.dialerTimeout, + dialerKeepAlive: test.fields.dialerKeepAlive, + dialerFallbackDelay: test.fields.dialerFallbackDelay, + dialerDualStack: test.fields.dialerDualStack, + addrs: test.fields.addrs, + der: test.fields.der, + dialer: test.fields.dialer, + eg: test.fields.eg, + } + + got, err := d.tlsHandshake(test.args.ctx, test.args.conn, test.args.addr) + if err := test.checkFunc(test.want, got, err); err != nil { + tt.Errorf("error = %v", err) + } + }) + } +} diff --git a/internal/net/tcp/option.go b/internal/net/tcp/option.go index b8004f00999..4f8de66704c 100644 --- a/internal/net/tcp/option.go +++ b/internal/net/tcp/option.go @@ -22,6 +22,7 @@ import ( "time" "github.com/vdaas/vald/internal/cache" + "github.com/vdaas/vald/internal/errgroup" "github.com/vdaas/vald/internal/timeutil" ) @@ -30,9 +31,11 @@ type DialerOption func(*dialer) var defaultDialerOptions = []DialerOption{ WithDialerKeepAlive("30s"), - WithDialerTimeout("30s"), + WithDialerTimeout("0s"), + WithDialerFallbackDelay("300ms"), WithEnableDialerDualStack(), WithDisableDNSCache(), + WithErrGroup(errgroup.Get()), } // WithCache returns the functional option to set the cache. @@ -105,6 +108,20 @@ func WithDialerKeepAlive(dur string) DialerOption { } } +// WithDialerFallbackDelay returns the functional option to set the DialerFallbackDelay. +func WithDialerFallbackDelay(dur string) DialerOption { + return func(d *dialer) { + if dur == "" { + return + } + pd, err := timeutil.Parse(dur) + if err != nil { + pd = time.Millisecond * 300 + } + d.dialerFallbackDelay = pd + } +} + // WithTLS returns the functional option to set the DialerTLS. func WithTLS(cfg *tls.Config) DialerOption { return func(d *dialer) { @@ -139,3 +156,11 @@ func WithDisableDialerDualStack() DialerOption { d.dialerDualStack = false } } + +func WithErrGroup(eg errgroup.Group) DialerOption { + return func(d *dialer) { + if eg != nil { + d.eg = eg + } + } +} diff --git a/internal/net/tcp/option_test.go b/internal/net/tcp/option_test.go index f711cb6f80a..daad0bf3501 100644 --- a/internal/net/tcp/option_test.go +++ b/internal/net/tcp/option_test.go @@ -25,6 +25,7 @@ import ( "github.com/vdaas/vald/internal/cache" "github.com/vdaas/vald/internal/cache/gache" + "github.com/vdaas/vald/internal/errgroup" "github.com/vdaas/vald/internal/errors" "go.uber.org/goleak" ) @@ -702,3 +703,237 @@ func TestWithDisableDialerDualStack(t *testing.T) { }) } } + +func TestWithDialerFallbackDelay(t *testing.T) { + t.Parallel() + // Change interface type to the type of object you are testing + type T = interface{} + type args struct { + dur string + } + type want struct { + obj *T + // Uncomment this line if the option returns an error, otherwise delete it + // err error + } + type test struct { + name string + args args + want want + // Use the first line if the option returns an error. otherwise use the second line + // checkFunc func(want, *T, error) error + // checkFunc func(want, *T) error + beforeFunc func(args) + afterFunc func(args) + } + + // Uncomment this block if the option returns an error, otherwise delete it + /* + defaultCheckFunc := func(w want, obj *T, err error) error { + if !errors.Is(err, w.err) { + return errors.Errorf("got_error: \"%#v\",\n\t\t\t\twant: \"%#v\"", err, w.err) + } + if !reflect.DeepEqual(obj, w.obj) { + return errors.Errorf("got: \"%#v\",\n\t\t\t\twant: \"%#v\"", obj, w.obj) + } + return nil + } + */ + + // Uncomment this block if the option do not returns an error, otherwise delete it + /* + defaultCheckFunc := func(w want, obj *T) error { + if !reflect.DeepEqual(obj, w.obj) { + return errors.Errorf("got: \"%#v\",\n\t\t\t\twant: \"%#v\"", obj, w.obj) + } + return nil + } + */ + + tests := []test{ + // TODO test cases + /* + { + name: "test_case_1", + args: args { + dur: "", + }, + want: want { + obj: new(T), + }, + }, + */ + + // TODO test cases + /* + func() test { + return test { + name: "test_case_2", + args: args { + dur: "", + }, + want: want { + obj: new(T), + }, + } + }(), + */ + } + + for _, tc := range tests { + test := tc + t.Run(test.name, func(tt *testing.T) { + tt.Parallel() + defer goleak.VerifyNone(tt, goleak.IgnoreCurrent()) + if test.beforeFunc != nil { + test.beforeFunc(test.args) + } + if test.afterFunc != nil { + defer test.afterFunc(test.args) + } + + // Uncomment this block if the option returns an error, otherwise delete it + /* + if test.checkFunc == nil { + test.checkFunc = defaultCheckFunc + } + + got := WithDialerFallbackDelay(test.args.dur) + obj := new(T) + if err := test.checkFunc(test.want, obj, got(obj)); err != nil { + tt.Errorf("error = %v", err) + } + */ + + // Uncomment this block if the option do not return an error, otherwise delete it + /* + if test.checkFunc == nil { + test.checkFunc = defaultCheckFunc + } + got := WithDialerFallbackDelay(test.args.dur) + obj := new(T) + got(obj) + if err := test.checkFunc(test.want, obj); err != nil { + tt.Errorf("error = %v", err) + } + */ + }) + } +} + +func TestWithErrGroup(t *testing.T) { + t.Parallel() + // Change interface type to the type of object you are testing + type T = interface{} + type args struct { + eg errgroup.Group + } + type want struct { + obj *T + // Uncomment this line if the option returns an error, otherwise delete it + // err error + } + type test struct { + name string + args args + want want + // Use the first line if the option returns an error. otherwise use the second line + // checkFunc func(want, *T, error) error + // checkFunc func(want, *T) error + beforeFunc func(args) + afterFunc func(args) + } + + // Uncomment this block if the option returns an error, otherwise delete it + /* + defaultCheckFunc := func(w want, obj *T, err error) error { + if !errors.Is(err, w.err) { + return errors.Errorf("got_error: \"%#v\",\n\t\t\t\twant: \"%#v\"", err, w.err) + } + if !reflect.DeepEqual(obj, w.obj) { + return errors.Errorf("got: \"%#v\",\n\t\t\t\twant: \"%#v\"", obj, w.obj) + } + return nil + } + */ + + // Uncomment this block if the option do not returns an error, otherwise delete it + /* + defaultCheckFunc := func(w want, obj *T) error { + if !reflect.DeepEqual(obj, w.obj) { + return errors.Errorf("got: \"%#v\",\n\t\t\t\twant: \"%#v\"", obj, w.obj) + } + return nil + } + */ + + tests := []test{ + // TODO test cases + /* + { + name: "test_case_1", + args: args { + eg: nil, + }, + want: want { + obj: new(T), + }, + }, + */ + + // TODO test cases + /* + func() test { + return test { + name: "test_case_2", + args: args { + eg: nil, + }, + want: want { + obj: new(T), + }, + } + }(), + */ + } + + for _, tc := range tests { + test := tc + t.Run(test.name, func(tt *testing.T) { + tt.Parallel() + defer goleak.VerifyNone(tt, goleak.IgnoreCurrent()) + if test.beforeFunc != nil { + test.beforeFunc(test.args) + } + if test.afterFunc != nil { + defer test.afterFunc(test.args) + } + + // Uncomment this block if the option returns an error, otherwise delete it + /* + if test.checkFunc == nil { + test.checkFunc = defaultCheckFunc + } + + got := WithErrGroup(test.args.eg) + obj := new(T) + if err := test.checkFunc(test.want, obj, got(obj)); err != nil { + tt.Errorf("error = %v", err) + } + */ + + // Uncomment this block if the option do not return an error, otherwise delete it + /* + if test.checkFunc == nil { + test.checkFunc = defaultCheckFunc + } + got := WithErrGroup(test.args.eg) + obj := new(T) + got(obj) + if err := test.checkFunc(test.want, obj); err != nil { + tt.Errorf("error = %v", err) + } + */ + }) + } +} diff --git a/internal/safety/safety.go b/internal/safety/safety.go index 010c90a3fbd..e9f8121cf3c 100644 --- a/internal/safety/safety.go +++ b/internal/safety/safety.go @@ -39,7 +39,7 @@ func recoverFunc(fn func() error, withPanic bool) func() error { defer func() { if r := recover(); r != nil { stack := string(debug.Stack()) - log.Warn("recovered: %+v\nstacktrace:\n%s", r, stack) + log.Warnf("recovered: %+v\nstacktrace:\n%s", r, stack) switch x := r.(type) { case runtime.Error: err = errors.ErrRuntimeError(err, x) diff --git a/internal/servers/server/server.go b/internal/servers/server/server.go index 9201b17807e..2d07b6fbe38 100644 --- a/internal/servers/server/server.go +++ b/internal/servers/server/server.go @@ -20,8 +20,8 @@ package server import ( "context" "crypto/tls" - "fmt" "net/http" + "strconv" "strings" "sync" "time" @@ -228,7 +228,7 @@ func (s *server) ListenAndServe(ctx context.Context, ech chan<- error) (err erro } } - l, err := s.lc.Listen(ctx, "tcp", fmt.Sprintf("%s:%d", s.host, s.port)) + l, err := s.lc.Listen(ctx, "tcp", net.JoinHostPort(s.host, strconv.FormatUint(uint64(s.port), 10))) if err != nil { return err } @@ -251,7 +251,7 @@ func (s *server) ListenAndServe(ctx context.Context, ech chan<- error) (err erro s.mu.Unlock() } - log.Infof("%s server %s starting on %s:%d", s.mode.String(), s.name, s.host, s.port) + log.Infof("%s server %s starting on %s://%s", s.mode.String(), s.name, l.Addr().Network(), l.Addr().String()) switch s.mode { case REST, GQL: @@ -298,22 +298,32 @@ func (s *server) Shutdown(ctx context.Context) (rerr error) { ech := make(chan error, 1) s.wg.Add(1) s.eg.Go(safety.RecoverFunc(func() (err error) { + defer close(ech) log.Infof("server %s executing preStopFunc", s.name) err = s.preStopFunc() if err != nil { - ech <- err + select { + case <-ctx.Done(): + case ech <- nil: + } } - close(ech) s.wg.Done() - return err + select { + case <-ctx.Done(): + case ech <- nil: + } + return nil })) tctx, cancel := context.WithTimeout(ctx, s.pwt) defer cancel() - <-tctx.Done() - err := <-ech - if err != nil { - rerr = err + select { + case <-tctx.Done(): + case err := <-ech: + if err != nil { + rerr = err + } } + } else { tctx, cancel := context.WithTimeout(ctx, s.pwt) defer cancel() diff --git a/internal/tls/option.go b/internal/tls/option.go index 8c63a6b2dd7..06b07e11cb0 100644 --- a/internal/tls/option.go +++ b/internal/tls/option.go @@ -23,6 +23,7 @@ type Option func(*credentials) error var defaultOptions = func() []Option { return []Option{ + WithInsecureSkipVerify(false), WithTLSConfig(&tls.Config{ MinVersion: tls.VersionTLS12, NextProtos: []string{ @@ -96,3 +97,10 @@ func WithTLSConfig(cfg *tls.Config) Option { return nil } } + +func WithInsecureSkipVerify(insecure bool) Option { + return func(c *credentials) error { + c.insecure = insecure + return nil + } +} diff --git a/internal/tls/option_test.go b/internal/tls/option_test.go index 880844112a3..a5b317b49eb 100644 --- a/internal/tls/option_test.go +++ b/internal/tls/option_test.go @@ -77,9 +77,11 @@ func TestWithCert(t *testing.T) { }, } - for _, test := range tests { + for _, tc := range tests { + test := tc t.Run(test.name, func(tt *testing.T) { - defer goleak.VerifyNone(tt, goleakIgnoreOptions...) + tt.Parallel() + defer goleak.VerifyNone(tt, append(goleakIgnoreOptions, goleak.IgnoreCurrent())...) if test.beforeFunc != nil { test.beforeFunc(test.args) } @@ -152,9 +154,11 @@ func TestWithKey(t *testing.T) { }, } - for _, test := range tests { + for _, tc := range tests { + test := tc t.Run(test.name, func(tt *testing.T) { - defer goleak.VerifyNone(tt, goleakIgnoreOptions...) + tt.Parallel() + defer goleak.VerifyNone(tt, append(goleakIgnoreOptions, goleak.IgnoreCurrent())...) if test.beforeFunc != nil { test.beforeFunc(test.args) } @@ -227,9 +231,11 @@ func TestWithCa(t *testing.T) { }, } - for _, test := range tests { + for _, tc := range tests { + test := tc t.Run(test.name, func(tt *testing.T) { - defer goleak.VerifyNone(tt, goleakIgnoreOptions...) + tt.Parallel() + defer goleak.VerifyNone(tt, append(goleakIgnoreOptions, goleak.IgnoreCurrent())...) if test.beforeFunc != nil { test.beforeFunc(test.args) } @@ -303,9 +309,11 @@ func TestWithTLSConfig(t *testing.T) { }, } - for _, test := range tests { + for _, tc := range tests { + test := tc t.Run(test.name, func(tt *testing.T) { - defer goleak.VerifyNone(tt, goleakIgnoreOptions...) + tt.Parallel() + defer goleak.VerifyNone(tt, append(goleakIgnoreOptions, goleak.IgnoreCurrent())...) if test.beforeFunc != nil { test.beforeFunc(test.args) } @@ -325,3 +333,80 @@ func TestWithTLSConfig(t *testing.T) { }) } } + +func TestWithInsecureSkipVerify(t *testing.T) { + type T = credentials + type args struct { + insecure bool + } + type want struct { + obj *T + err error + } + type test struct { + name string + args args + want want + checkFunc func(want, *T, error) error + beforeFunc func(args) + afterFunc func(args) + } + + defaultCheckFunc := func(w want, obj *T, err error) error { + if !errors.Is(err, w.err) { + return errors.Errorf("got_error: \"%#v\",\n\t\t\t\twant: \"%#v\"", err, w.err) + } + if !reflect.DeepEqual(obj, w.obj) { + return errors.Errorf("got: \"%#v\",\n\t\t\t\twant: \"%#v\"", obj, w.obj) + } + return nil + } + tests := []test{ + { + name: "success InsecureSkipVerify when insecure is true", + args: args{ + insecure: true, + }, + want: want{ + obj: &T{ + insecure: true, + }, + }, + }, + { + name: "success InsecureSkipVerify when insecure is false", + args: args{ + insecure: false, + }, + want: want{ + obj: &T{ + insecure: false, + }, + }, + }, + } + + for _, tc := range tests { + test := tc + t.Run(test.name, func(tt *testing.T) { + tt.Parallel() + defer goleak.VerifyNone(tt, append(goleakIgnoreOptions, goleak.IgnoreCurrent())...) + if test.beforeFunc != nil { + test.beforeFunc(test.args) + } + if test.afterFunc != nil { + defer test.afterFunc(test.args) + } + + if test.checkFunc == nil { + test.checkFunc = defaultCheckFunc + } + + got := WithInsecureSkipVerify(test.args.insecure) + obj := new(T) + if err := test.checkFunc(test.want, obj, got(obj)); err != nil { + tt.Errorf("error = %v", err) + } + }) + } +} diff --git a/internal/tls/tls.go b/internal/tls/tls.go index a76fda31040..293e6bc1631 100644 --- a/internal/tls/tls.go +++ b/internal/tls/tls.go @@ -20,19 +20,24 @@ package tls import ( "crypto/tls" "crypto/x509" + "net" "reflect" "github.com/vdaas/vald/internal/errors" "github.com/vdaas/vald/internal/io/ioutil" ) -type Config = tls.Config +type ( + Conn = tls.Conn + Config = tls.Config +) type credentials struct { - cfg *tls.Config - cert string - key string - ca string + cfg *tls.Config + cert string + key string + ca string + insecure bool } // NewTLSConfig returns a *tls.Config struct or error @@ -40,13 +45,9 @@ type credentials struct { // This function initialize TLS configuration, for example the CA certificate and key to start TLS server. // Server and CA Certificate, and private key will read from a file from the file path definied in environment variable. func New(opts ...Option) (*Config, error) { - var err error - c := new(credentials) - - for _, opt := range append(defaultOptions(), opts...) { - if err := opt(c); err != nil { - return nil, errors.ErrOptionFailed(err, reflect.ValueOf(opt)) - } + c, err := newCredential(opts...) + if err != nil { + return nil, err } if c.cert == "" || c.key == "" { @@ -72,13 +73,9 @@ func New(opts ...Option) (*Config, error) { } func NewClientConfig(opts ...Option) (*Config, error) { - var err error - c := new(credentials) - - for _, opt := range append(defaultOptions(), opts...) { - if err := opt(c); err != nil { - return nil, errors.ErrOptionFailed(err, reflect.ValueOf(opt)) - } + c, err := newCredential(opts...) + if err != nil { + return nil, err } if c.ca != "" { @@ -118,3 +115,19 @@ func NewX509CertPool(path string) (pool *x509.CertPool, err error) { } return pool, err } + +func newCredential(opts ...Option) (c *credentials, err error) { + c = new(credentials) + + for _, opt := range append(defaultOptions(), opts...) { + if err := opt(c); err != nil { + return nil, errors.ErrOptionFailed(err, reflect.ValueOf(opt)) + } + } + c.cfg.InsecureSkipVerify = c.insecure + return c, nil +} + +func Client(conn net.Conn, config *Config) *Conn { + return tls.Client(conn, config) +} diff --git a/internal/tls/tls_test.go b/internal/tls/tls_test.go index f6d2245938b..2ddf1a4c79f 100644 --- a/internal/tls/tls_test.go +++ b/internal/tls/tls_test.go @@ -433,3 +433,80 @@ func TestNewX509CertPool(t *testing.T) { }) } } + +func Test_newCredential(t *testing.T) { + t.Parallel() + type args struct { + opts []Option + } + type want struct { + wantC *credentials + err error + } + type test struct { + name string + args args + want want + checkFunc func(want, *credentials, error) error + beforeFunc func(args) + afterFunc func(args) + } + defaultCheckFunc := func(w want, gotC *credentials, err error) error { + if !errors.Is(err, w.err) { + return errors.Errorf("got_error: \"%#v\",\n\t\t\t\twant: \"%#v\"", err, w.err) + } + if !reflect.DeepEqual(gotC, w.wantC) { + return errors.Errorf("got: \"%#v\",\n\t\t\t\twant: \"%#v\"", gotC, w.wantC) + } + return nil + } + tests := []test{ + // TODO test cases + /* + { + name: "test_case_1", + args: args { + opts: nil, + }, + want: want{}, + checkFunc: defaultCheckFunc, + }, + */ + + // TODO test cases + /* + func() test { + return test { + name: "test_case_2", + args: args { + opts: nil, + }, + want: want{}, + checkFunc: defaultCheckFunc, + } + }(), + */ + } + + for _, tc := range tests { + test := tc + t.Run(test.name, func(tt *testing.T) { + tt.Parallel() + defer goleak.VerifyNone(tt, goleak.IgnoreCurrent()) + if test.beforeFunc != nil { + test.beforeFunc(test.args) + } + if test.afterFunc != nil { + defer test.afterFunc(test.args) + } + if test.checkFunc == nil { + test.checkFunc = defaultCheckFunc + } + + gotC, err := newCredential(test.args.opts...) + if err := test.checkFunc(test.want, gotC, err); err != nil { + tt.Errorf("error = %v", err) + } + }) + } +} diff --git a/k8s/agent/configmap.yaml b/k8s/agent/configmap.yaml index b2ca297b498..85c6f2b6c35 100644 --- a/k8s/agent/configmap.yaml +++ b/k8s/agent/configmap.yaml @@ -96,6 +96,7 @@ data: ca: /path/to/ca cert: /path/to/cert enabled: false + insecure_skip_verify: false key: /path/to/key observability: enabled: false diff --git a/k8s/discoverer/configmap.yaml b/k8s/discoverer/configmap.yaml index 03660c02dc2..1cc2c4c8c1b 100644 --- a/k8s/discoverer/configmap.yaml +++ b/k8s/discoverer/configmap.yaml @@ -109,6 +109,7 @@ data: ca: /path/to/ca cert: /path/to/cert enabled: false + insecure_skip_verify: false key: /path/to/key observability: enabled: false @@ -187,3 +188,18 @@ data: discovery_duration: 3s name: "" namespace: _MY_POD_NAMESPACE_ + tcp: + dialer: + dual_stack_enabled: false + keep_alive: 10m + timeout: 30s + dns: + cache_enabled: true + cache_expiration: 24h + refresh_duration: 5m + tls: + ca: /path/to/ca + cert: /path/to/cert + enabled: false + insecure_skip_verify: false + key: /path/to/key diff --git a/k8s/discoverer/deployment.yaml b/k8s/discoverer/deployment.yaml index d72b8927540..e2c4f671b6e 100644 --- a/k8s/discoverer/deployment.yaml +++ b/k8s/discoverer/deployment.yaml @@ -47,7 +47,7 @@ spec: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/component: discoverer annotations: - checksum/configmap: 3136e5175f02a3054fb086e2410e5d68904917048d0c6108f9477190ae661438 + checksum/configmap: c05d484d2f3fe26b686558c5bb9daed8ea26d997875df8d20a73a5f1d15a148f profefe.com/enable: "true" profefe.com/port: "6060" profefe.com/service: vald-discoverer diff --git a/k8s/gateway/backup/configmap.yaml b/k8s/gateway/backup/configmap.yaml index 210cac770ed..ab4acf1184e 100644 --- a/k8s/gateway/backup/configmap.yaml +++ b/k8s/gateway/backup/configmap.yaml @@ -109,6 +109,7 @@ data: ca: /path/to/ca cert: /path/to/cert enabled: false + insecure_skip_verify: false key: /path/to/key observability: enabled: false @@ -235,6 +236,7 @@ data: ca: /path/to/ca cert: /path/to/cert enabled: false + insecure_skip_verify: false key: /path/to/key timeout: "" write_buffer_size: 0 @@ -242,6 +244,7 @@ data: ca: /path/to/ca cert: /path/to/cert enabled: false + insecure_skip_verify: false key: /path/to/key backup: addrs: @@ -295,6 +298,7 @@ data: ca: /path/to/ca cert: /path/to/cert enabled: false + insecure_skip_verify: false key: /path/to/key timeout: "" write_buffer_size: 0 @@ -302,4 +306,5 @@ data: ca: /path/to/ca cert: /path/to/cert enabled: false + insecure_skip_verify: false key: /path/to/key diff --git a/k8s/gateway/backup/deployment.yaml b/k8s/gateway/backup/deployment.yaml index 6e6463bffa7..b3b0058e95c 100644 --- a/k8s/gateway/backup/deployment.yaml +++ b/k8s/gateway/backup/deployment.yaml @@ -46,7 +46,7 @@ spec: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/component: gateway annotations: - checksum/configmap: fcdaf1f2c5cab57482f5c0d718ce6d037a997cac8beeb264fbeb70285edd098f + checksum/configmap: e0880baa51c21ac7efd4419d339170d94082b5b7b7ed8f43f4845175a3963c72 spec: initContainers: - name: wait-for-manager-compressor diff --git a/k8s/gateway/backup/priorityclass.yaml b/k8s/gateway/backup/priorityclass.yaml index 471eafce9a5..f616da9a6cb 100644 --- a/k8s/gateway/backup/priorityclass.yaml +++ b/k8s/gateway/backup/priorityclass.yaml @@ -17,7 +17,7 @@ apiVersion: scheduling.k8s.io/v1 kind: PriorityClass metadata: - name: vald-backup-gateway-priority + name: default-vald-backup-gateway-priority labels: app.kubernetes.io/name: vald helm.sh/chart: vald-v1.0.1 diff --git a/k8s/gateway/lb/configmap.yaml b/k8s/gateway/lb/configmap.yaml index f43026d9437..1f23b445d3a 100644 --- a/k8s/gateway/lb/configmap.yaml +++ b/k8s/gateway/lb/configmap.yaml @@ -109,6 +109,7 @@ data: ca: /path/to/ca cert: /path/to/cert enabled: false + insecure_skip_verify: false key: /path/to/key observability: enabled: false @@ -244,6 +245,7 @@ data: ca: /path/to/ca cert: /path/to/cert enabled: false + insecure_skip_verify: false key: /path/to/key timeout: "" write_buffer_size: 0 @@ -251,6 +253,7 @@ data: ca: /path/to/ca cert: /path/to/cert enabled: false + insecure_skip_verify: false key: /path/to/key agent_client_options: addrs: [] @@ -303,6 +306,7 @@ data: ca: /path/to/ca cert: /path/to/cert enabled: false + insecure_skip_verify: false key: /path/to/key timeout: "" write_buffer_size: 0 @@ -310,4 +314,5 @@ data: ca: /path/to/ca cert: /path/to/cert enabled: false + insecure_skip_verify: false key: /path/to/key diff --git a/k8s/gateway/lb/deployment.yaml b/k8s/gateway/lb/deployment.yaml index 1f7904d0897..6f7f5182df3 100644 --- a/k8s/gateway/lb/deployment.yaml +++ b/k8s/gateway/lb/deployment.yaml @@ -46,7 +46,7 @@ spec: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/component: gateway annotations: - checksum/configmap: d717646102fc21606e695d8612a0a71794da8baefada3df368077278e2b5a861 + checksum/configmap: 85d524cf7a34e9d425a1ea355ee84cdf750e0617f4597ccb82460d0a3a785fbb spec: initContainers: - name: wait-for-discoverer diff --git a/k8s/gateway/lb/priorityclass.yaml b/k8s/gateway/lb/priorityclass.yaml index d66da896f8f..9a4714e62bf 100644 --- a/k8s/gateway/lb/priorityclass.yaml +++ b/k8s/gateway/lb/priorityclass.yaml @@ -17,7 +17,7 @@ apiVersion: scheduling.k8s.io/v1 kind: PriorityClass metadata: - name: vald-lb-gateway-priority + name: default-vald-lb-gateway-priority labels: app.kubernetes.io/name: vald helm.sh/chart: vald-v1.0.1 diff --git a/k8s/gateway/meta/configmap.yaml b/k8s/gateway/meta/configmap.yaml index e9954a59ef0..748e262716e 100644 --- a/k8s/gateway/meta/configmap.yaml +++ b/k8s/gateway/meta/configmap.yaml @@ -109,6 +109,7 @@ data: ca: /path/to/ca cert: /path/to/cert enabled: false + insecure_skip_verify: false key: /path/to/key observability: enabled: false @@ -235,6 +236,7 @@ data: ca: /path/to/ca cert: /path/to/cert enabled: false + insecure_skip_verify: false key: /path/to/key timeout: "" write_buffer_size: 0 @@ -242,6 +244,7 @@ data: ca: /path/to/ca cert: /path/to/cert enabled: false + insecure_skip_verify: false key: /path/to/key meta: client: @@ -296,6 +299,7 @@ data: ca: /path/to/ca cert: /path/to/cert enabled: false + insecure_skip_verify: false key: /path/to/key timeout: "" write_buffer_size: 0 @@ -303,6 +307,7 @@ data: ca: /path/to/ca cert: /path/to/cert enabled: false + insecure_skip_verify: false key: /path/to/key enable_cache: true cache_expiration: 30m diff --git a/k8s/gateway/meta/deployment.yaml b/k8s/gateway/meta/deployment.yaml index c90b48e29b3..cbb664884c4 100644 --- a/k8s/gateway/meta/deployment.yaml +++ b/k8s/gateway/meta/deployment.yaml @@ -46,7 +46,7 @@ spec: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/component: gateway annotations: - checksum/configmap: c43e69b614c58ccb41d743c57293cbc08cf2bac8ce586b5942ba06a4e714964c + checksum/configmap: 13b81813ae4eed5cae1f646c230f12d76cd66fdda2d0f3aa4a8b98537382719e spec: initContainers: - name: wait-for-meta diff --git a/k8s/gateway/meta/priorityclass.yaml b/k8s/gateway/meta/priorityclass.yaml index 42398d3e437..ffdb68430f3 100644 --- a/k8s/gateway/meta/priorityclass.yaml +++ b/k8s/gateway/meta/priorityclass.yaml @@ -17,7 +17,7 @@ apiVersion: scheduling.k8s.io/v1 kind: PriorityClass metadata: - name: vald-meta-gateway-priority + name: default-vald-meta-gateway-priority labels: app.kubernetes.io/name: vald helm.sh/chart: vald-v1.0.1 diff --git a/k8s/manager/backup/configmap.yaml b/k8s/manager/backup/configmap.yaml index db0cf6d691f..d92b099ee9c 100644 --- a/k8s/manager/backup/configmap.yaml +++ b/k8s/manager/backup/configmap.yaml @@ -109,6 +109,7 @@ data: ca: /path/to/ca cert: /path/to/cert enabled: false + insecure_skip_verify: false key: /path/to/key observability: enabled: false @@ -205,10 +206,12 @@ data: ca: /path/to/ca cert: /path/to/cert enabled: false + insecure_skip_verify: false key: /path/to/key tls: ca: /path/to/ca cert: /path/to/cert enabled: false + insecure_skip_verify: false key: /path/to/key user: root diff --git a/k8s/manager/backup/deployment.yaml b/k8s/manager/backup/deployment.yaml index a26b11227b9..557f7a0b3b9 100644 --- a/k8s/manager/backup/deployment.yaml +++ b/k8s/manager/backup/deployment.yaml @@ -46,7 +46,7 @@ spec: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/component: manager-backup annotations: - checksum/configmap: e5f1e9e2f264c3413bf3cafc44bb23bc80ffcd6f9926c4330fff29730953ad59 + checksum/configmap: 23d491a5e00548eb1abbf34fc2ae936b132353f21614b8408e3893296925e8da profefe.com/enable: "true" profefe.com/port: "6060" profefe.com/service: vald-manager-backup diff --git a/k8s/manager/compressor/configmap.yaml b/k8s/manager/compressor/configmap.yaml index e01a47d133e..81374492efb 100644 --- a/k8s/manager/compressor/configmap.yaml +++ b/k8s/manager/compressor/configmap.yaml @@ -109,6 +109,7 @@ data: ca: /path/to/ca cert: /path/to/cert enabled: false + insecure_skip_verify: false key: /path/to/key observability: enabled: false @@ -236,6 +237,7 @@ data: ca: /path/to/ca cert: /path/to/cert enabled: false + insecure_skip_verify: false key: /path/to/key timeout: "" write_buffer_size: 0 @@ -243,6 +245,7 @@ data: ca: /path/to/ca cert: /path/to/cert enabled: false + insecure_skip_verify: false key: /path/to/key compressor: compress_algorithm: "zstd" @@ -305,6 +308,7 @@ data: ca: /path/to/ca cert: /path/to/cert enabled: false + insecure_skip_verify: false key: /path/to/key timeout: "" write_buffer_size: 0 @@ -312,4 +316,5 @@ data: ca: /path/to/ca cert: /path/to/cert enabled: false + insecure_skip_verify: false key: /path/to/key diff --git a/k8s/manager/compressor/deployment.yaml b/k8s/manager/compressor/deployment.yaml index 23c4a595634..e1a35f3e0d2 100644 --- a/k8s/manager/compressor/deployment.yaml +++ b/k8s/manager/compressor/deployment.yaml @@ -46,7 +46,7 @@ spec: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/component: manager-compressor annotations: - checksum/configmap: 34d0e12d847e74fb2bc73a40f897e536a514059972be1e652376bbb363454925 + checksum/configmap: efd969af65e1ba7f80d850b058c635317159d1f521f3271ee9961cf0f073fd93 profefe.com/enable: "true" profefe.com/port: "6060" profefe.com/service: vald-manager-compressor diff --git a/k8s/manager/index/configmap.yaml b/k8s/manager/index/configmap.yaml index 14bf2ba3149..8511cd2892a 100644 --- a/k8s/manager/index/configmap.yaml +++ b/k8s/manager/index/configmap.yaml @@ -109,6 +109,7 @@ data: ca: /path/to/ca cert: /path/to/cert enabled: false + insecure_skip_verify: false key: /path/to/key observability: enabled: false @@ -243,6 +244,7 @@ data: ca: /path/to/ca cert: /path/to/cert enabled: false + insecure_skip_verify: false key: /path/to/key timeout: "" write_buffer_size: 0 @@ -250,6 +252,7 @@ data: ca: /path/to/ca cert: /path/to/cert enabled: false + insecure_skip_verify: false key: /path/to/key agent_client_options: addrs: [] @@ -300,6 +303,7 @@ data: ca: /path/to/ca cert: /path/to/cert enabled: false + insecure_skip_verify: false key: /path/to/key keep_alive: permit_without_stream: false @@ -309,6 +313,7 @@ data: ca: /path/to/ca cert: /path/to/cert enabled: false + insecure_skip_verify: false key: /path/to/key concurrency: 1 auto_index_duration_limit: 30m diff --git a/k8s/manager/index/deployment.yaml b/k8s/manager/index/deployment.yaml index 74f21aacbeb..e925da978b5 100644 --- a/k8s/manager/index/deployment.yaml +++ b/k8s/manager/index/deployment.yaml @@ -47,7 +47,7 @@ spec: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/component: manager-index annotations: - checksum/configmap: ac64bd9a791ac1c7741062b7744bd0290642fbdbe36acc540ed83f8aef1ab4d5 + checksum/configmap: 54c2dc549b942289930a9e84d32982e1013095ac12e6f98e5d2c4065a3463d2c profefe.com/enable: "true" profefe.com/port: "6060" profefe.com/service: vald-manager-index diff --git a/k8s/meta/configmap.yaml b/k8s/meta/configmap.yaml index 221dc21e647..a4ad89676c7 100644 --- a/k8s/meta/configmap.yaml +++ b/k8s/meta/configmap.yaml @@ -109,6 +109,7 @@ data: ca: /path/to/ca cert: /path/to/cert enabled: false + insecure_skip_verify: false key: /path/to/key observability: enabled: false @@ -222,11 +223,13 @@ data: ca: /path/to/ca cert: /path/to/cert enabled: false + insecure_skip_verify: false key: /path/to/key tls: ca: /path/to/ca cert: /path/to/cert enabled: false + insecure_skip_verify: false key: /path/to/key vk_prefix: "" write_timeout: 3s diff --git a/k8s/meta/deployment.yaml b/k8s/meta/deployment.yaml index b0b96d6edb8..52f64c5b44e 100644 --- a/k8s/meta/deployment.yaml +++ b/k8s/meta/deployment.yaml @@ -46,7 +46,7 @@ spec: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/component: meta annotations: - checksum/configmap: 0b9be93c5188425d93c0e81d1cb453c0e43be1092b6736e47b4473d802a3d1bc + checksum/configmap: a3ac23ba594e2b6aa951b14022790cae8effa2e6338aab1ea3f56d1a00c2242f profefe.com/enable: "true" profefe.com/port: "6060" profefe.com/service: vald-meta diff --git a/pkg/agent/core/ngt/handler/grpc/handler.go b/pkg/agent/core/ngt/handler/grpc/handler.go index 7a3263e2876..1742fcb90ef 100644 --- a/pkg/agent/core/ngt/handler/grpc/handler.go +++ b/pkg/agent/core/ngt/handler/grpc/handler.go @@ -990,7 +990,7 @@ func (s *server) StreamGetObject(stream vald.Object_StreamGetObjectServer) (err } }() err = grpc.BidirectionalStream(ctx, stream, s.streamConcurrency, - func() interface{} { return new(payload.Object_ID) }, + func() interface{} { return new(payload.Object_VectorRequest) }, func(ctx context.Context, data interface{}) (interface{}, error) { req := data.(*payload.Object_VectorRequest) ctx, sspan := trace.StartSpan(ctx, apiName+".StreamGetObject/id-"+req.GetId().GetId()) @@ -1061,7 +1061,7 @@ func (s *server) CreateIndex(ctx context.Context, c *payload.Control_CreateIndex }, }, }, info.Get()) - log.Error(err) + log.Warn(err) if span != nil { span.SetStatus(trace.StatusCodeFailedPrecondition(err.Error())) } diff --git a/pkg/discoverer/k8s/service/discover.go b/pkg/discoverer/k8s/service/discover.go index cb84c566213..84578cc303b 100644 --- a/pkg/discoverer/k8s/service/discover.go +++ b/pkg/discoverer/k8s/service/discover.go @@ -34,6 +34,7 @@ import ( "github.com/vdaas/vald/internal/k8s/node" "github.com/vdaas/vald/internal/k8s/pod" "github.com/vdaas/vald/internal/log" + "github.com/vdaas/vald/internal/net/tcp" "github.com/vdaas/vald/internal/safety" ) @@ -57,6 +58,7 @@ type discoverer struct { namespace string name string csd time.Duration + der tcp.Dialer eg errgroup.Group } @@ -72,6 +74,7 @@ func New(opts ...Option) (dsc Discoverer, err error) { d.podsByName.Store(make(map[string][]*payload.Info_Pod)) d.nodeByName.Store(make(map[string]*payload.Info_Node)) d.ctrl, err = k8s.New( + k8s.WithDialer(d.der), k8s.WithControllerName("vald k8s agent discoverer"), k8s.WithDisableLeaderElection(), k8s.WithResourceController(mnode.New( @@ -170,6 +173,7 @@ func (d *discoverer) Start(ctx context.Context) (<-chan error, error) { ech := make(chan error, 2) d.eg.Go(safety.RecoverFunc(func() (err error) { defer close(ech) + d.der.StartDialerCache(ctx) dt := time.NewTicker(d.csd) defer dt.Stop() for { diff --git a/pkg/discoverer/k8s/service/option.go b/pkg/discoverer/k8s/service/option.go index 24891ef652b..1ec31227336 100644 --- a/pkg/discoverer/k8s/service/option.go +++ b/pkg/discoverer/k8s/service/option.go @@ -21,6 +21,7 @@ import ( "time" "github.com/vdaas/vald/internal/errgroup" + "github.com/vdaas/vald/internal/net/tcp" "github.com/vdaas/vald/internal/timeutil" ) @@ -31,6 +32,15 @@ var defaultOptions = []Option{ WithErrGroup(errgroup.Get()), } +func WithDialer(der tcp.Dialer) Option { + return func(d *discoverer) error { + if der != nil { + d.der = der + } + return nil + } +} + func WithName(name string) Option { return func(d *discoverer) error { if len(name) != 0 { diff --git a/pkg/discoverer/k8s/service/option_test.go b/pkg/discoverer/k8s/service/option_test.go index 8bb0551ecd9..5620a1462d8 100644 --- a/pkg/discoverer/k8s/service/option_test.go +++ b/pkg/discoverer/k8s/service/option_test.go @@ -21,6 +21,7 @@ import ( "testing" "github.com/vdaas/vald/internal/errgroup" + "github.com/vdaas/vald/internal/net/tcp" "go.uber.org/goleak" ) @@ -491,3 +492,120 @@ func TestWithErrGroup(t *testing.T) { }) } } + +func TestWithDialer(t *testing.T) { + t.Parallel() + // Change interface type to the type of object you are testing + type T = interface{} + type args struct { + der tcp.Dialer + } + type want struct { + obj *T + // Uncomment this line if the option returns an error, otherwise delete it + // err error + } + type test struct { + name string + args args + want want + // Use the first line if the option returns an error. otherwise use the second line + // checkFunc func(want, *T, error) error + // checkFunc func(want, *T) error + beforeFunc func(args) + afterFunc func(args) + } + + // Uncomment this block if the option returns an error, otherwise delete it + /* + defaultCheckFunc := func(w want, obj *T, err error) error { + if !errors.Is(err, w.err) { + return errors.Errorf("got_error: \"%#v\",\n\t\t\t\twant: \"%#v\"", err, w.err) + } + if !reflect.DeepEqual(obj, w.obj) { + return errors.Errorf("got: \"%#v\",\n\t\t\t\twant: \"%#v\"", obj, w.obj) + } + return nil + } + */ + + // Uncomment this block if the option do not returns an error, otherwise delete it + /* + defaultCheckFunc := func(w want, obj *T) error { + if !reflect.DeepEqual(obj, w.obj) { + return errors.Errorf("got: \"%#v\",\n\t\t\t\twant: \"%#v\"", obj, w.obj) + } + return nil + } + */ + + tests := []test{ + // TODO test cases + /* + { + name: "test_case_1", + args: args { + der: nil, + }, + want: want { + obj: new(T), + }, + }, + */ + + // TODO test cases + /* + func() test { + return test { + name: "test_case_2", + args: args { + der: nil, + }, + want: want { + obj: new(T), + }, + } + }(), + */ + } + + for _, tc := range tests { + test := tc + t.Run(test.name, func(tt *testing.T) { + tt.Parallel() + defer goleak.VerifyNone(tt, goleak.IgnoreCurrent()) + if test.beforeFunc != nil { + test.beforeFunc(test.args) + } + if test.afterFunc != nil { + defer test.afterFunc(test.args) + } + + // Uncomment this block if the option returns an error, otherwise delete it + /* + if test.checkFunc == nil { + test.checkFunc = defaultCheckFunc + } + + got := WithDialer(test.args.der) + obj := new(T) + if err := test.checkFunc(test.want, obj, got(obj)); err != nil { + tt.Errorf("error = %v", err) + } + */ + + // Uncomment this block if the option do not return an error, otherwise delete it + /* + if test.checkFunc == nil { + test.checkFunc = defaultCheckFunc + } + got := WithDialer(test.args.der) + obj := new(T) + got(obj) + if err := test.checkFunc(test.want, obj); err != nil { + tt.Errorf("error = %v", err) + } + */ + }) + } +} diff --git a/pkg/discoverer/k8s/usecase/discovered.go b/pkg/discoverer/k8s/usecase/discovered.go index a589c09b861..f7d0fb1cdd6 100644 --- a/pkg/discoverer/k8s/usecase/discovered.go +++ b/pkg/discoverer/k8s/usecase/discovered.go @@ -22,8 +22,10 @@ import ( "github.com/vdaas/vald/apis/grpc/v1/discoverer" iconf "github.com/vdaas/vald/internal/config" "github.com/vdaas/vald/internal/errgroup" + "github.com/vdaas/vald/internal/log" "github.com/vdaas/vald/internal/net/grpc" "github.com/vdaas/vald/internal/net/grpc/metric" + "github.com/vdaas/vald/internal/net/tcp" "github.com/vdaas/vald/internal/observability" "github.com/vdaas/vald/internal/runner" "github.com/vdaas/vald/internal/safety" @@ -43,13 +45,22 @@ type run struct { h handler.DiscovererServer server starter.Server observability observability.Observability + der tcp.Dialer } func New(cfg *config.Data) (r runner.Runner, err error) { eg := errgroup.Get() + der, err := tcp.NewDialer(cfg.Discoverer.TCP.Opts()...) + if err != nil { + log.Error(err) + return nil, err + } dsc, err := service.New( service.WithDiscoverDuration(cfg.Discoverer.DiscoveryDuration), service.WithErrGroup(eg), + service.WithName(cfg.Discoverer.Name), + service.WithNamespace(cfg.Discoverer.Namespace), + service.WithDialer(der), ) if err != nil { return nil, err @@ -115,6 +126,7 @@ func New(cfg *config.Data) (r runner.Runner, err error) { } return &run{ + der: der, eg: eg, cfg: cfg, dsc: dsc, @@ -125,6 +137,9 @@ func New(cfg *config.Data) (r runner.Runner, err error) { } func (r *run) PreStart(ctx context.Context) error { + if r.der != nil { + r.der.StartDialerCache(ctx) + } if r.observability != nil { return r.observability.PreStart(ctx) } diff --git a/pkg/gateway/backup/handler/grpc/handler.go b/pkg/gateway/backup/handler/grpc/handler.go index 6b4913e6d0b..b5bb642b2b7 100644 --- a/pkg/gateway/backup/handler/grpc/handler.go +++ b/pkg/gateway/backup/handler/grpc/handler.go @@ -1492,7 +1492,7 @@ func (s *server) StreamGetObject(stream vald.Object_StreamGetObjectServer) (err } }() err = grpc.BidirectionalStream(ctx, stream, s.streamConcurrency, - func() interface{} { return new(payload.Object_ID) }, + func() interface{} { return new(payload.Object_VectorRequest) }, func(ctx context.Context, data interface{}) (interface{}, error) { req := data.(*payload.Object_VectorRequest) ctx, sspan := trace.StartSpan(ctx, apiName+".StreamGetObject/id-"+req.GetId().GetId()) diff --git a/pkg/gateway/filter/handler/grpc/handler.go b/pkg/gateway/filter/handler/grpc/handler.go index 5968ed08f79..014fce81651 100644 --- a/pkg/gateway/filter/handler/grpc/handler.go +++ b/pkg/gateway/filter/handler/grpc/handler.go @@ -157,7 +157,7 @@ func (s *server) StreamSearchObject(stream vald.Filter_StreamSearchObjectServer) } }() return grpc.BidirectionalStream(ctx, stream, s.streamConcurrency, - func() interface{} { return new(payload.Search_IDRequest) }, + func() interface{} { return new(payload.Search_ObjectRequest) }, func(ctx context.Context, data interface{}) (interface{}, error) { res, err := s.SearchObject(ctx, data.(*payload.Search_ObjectRequest)) if err != nil { @@ -226,9 +226,10 @@ func (s *server) StreamInsertObject(stream vald.Filter_StreamInsertObjectServer) } }() return grpc.BidirectionalStream(ctx, stream, s.streamConcurrency, - func() interface{} { return new(payload.Search_IDRequest) }, + func() interface{} { return new(payload.Insert_ObjectRequest) }, func(ctx context.Context, data interface{}) (interface{}, error) { - loc, err := s.InsertObject(ctx, data.(*payload.Insert_ObjectRequest)) + req := data.(*payload.Insert_ObjectRequest) + loc, err := s.InsertObject(ctx, req) if err != nil { st, ok := status.FromError(err) if !ok { @@ -341,7 +342,7 @@ func (s *server) StreamUpdateObject(stream vald.Filter_StreamUpdateObjectServer) } }() return grpc.BidirectionalStream(ctx, stream, s.streamConcurrency, - func() interface{} { return new(payload.Search_IDRequest) }, + func() interface{} { return new(payload.Update_ObjectRequest) }, func(ctx context.Context, data interface{}) (interface{}, error) { loc, err := s.UpdateObject(ctx, data.(*payload.Update_ObjectRequest)) if err != nil { @@ -455,7 +456,7 @@ func (s *server) StreamUpsertObject(stream vald.Filter_StreamUpsertObjectServer) } }() return grpc.BidirectionalStream(ctx, stream, s.streamConcurrency, - func() interface{} { return new(payload.Search_IDRequest) }, + func() interface{} { return new(payload.Upsert_ObjectRequest) }, func(ctx context.Context, data interface{}) (interface{}, error) { loc, err := s.UpsertObject(ctx, data.(*payload.Upsert_ObjectRequest)) if err != nil { @@ -618,14 +619,14 @@ func (s *server) SearchByID(ctx context.Context, req *payload.Search_IDRequest) return res, nil } -func (s *server) StreamSearch(stream vald.Search_StreamSearchServer) error { +func (s *server) StreamSearch(stream vald.Search_StreamSearchServer) (err error) { ctx, span := trace.StartSpan(stream.Context(), apiName+".StreamSearch") defer func() { if span != nil { span.End() } }() - return grpc.BidirectionalStream(ctx, stream, s.streamConcurrency, + err = grpc.BidirectionalStream(ctx, stream, s.streamConcurrency, func() interface{} { return new(payload.Search_Request) }, func(ctx context.Context, data interface{}) (interface{}, error) { res, err := s.Search(ctx, data.(*payload.Search_Request)) @@ -647,25 +648,44 @@ func (s *server) StreamSearch(stream vald.Search_StreamSearchServer) error { }, }, nil }) + + if err != nil { + if span != nil { + span.SetStatus(trace.StatusCodeInternal(err.Error())) + } + log.Error(err) + return err + } + return nil } -func (s *server) StreamSearchByID(stream vald.Search_StreamSearchByIDServer) error { +func (s *server) StreamSearchByID(stream vald.Search_StreamSearchByIDServer) (err error) { ctx, span := trace.StartSpan(stream.Context(), apiName+".StreamSearchByID") defer func() { if span != nil { span.End() } }() - return grpc.BidirectionalStream(ctx, stream, s.streamConcurrency, + err = grpc.BidirectionalStream(ctx, stream, s.streamConcurrency, func() interface{} { return new(payload.Search_IDRequest) }, func(ctx context.Context, data interface{}) (interface{}, error) { - res, err := s.SearchByID(ctx, data.(*payload.Search_IDRequest)) + req := data.(*payload.Search_IDRequest) + ctx, sspan := trace.StartSpan(ctx, apiName+".StreamSearchByID/id-"+req.GetId()) + defer func() { + if sspan != nil { + sspan.End() + } + }() + res, err := s.SearchByID(ctx, req) if err != nil { st, ok := status.FromError(err) if !ok { st = status.New(codes.Internal, errors.Wrap(err, "failed to parse grpc status from error").Error()) err = errors.Wrap(st.Err(), err.Error()) } + if sspan != nil { + sspan.SetStatus(trace.StatusCodeInternal(err.Error())) + } return &payload.Search_StreamResponse{ Payload: &payload.Search_StreamResponse_Status{ Status: st.Proto(), @@ -678,6 +698,14 @@ func (s *server) StreamSearchByID(stream vald.Search_StreamSearchByIDServer) err }, }, nil }) + if err != nil { + if span != nil { + span.SetStatus(trace.StatusCodeInternal(err.Error())) + } + log.Error(err) + return err + } + return nil } func (s *server) MultiSearch(ctx context.Context, reqs *payload.Search_MultiRequest) (res *payload.Search_Responses, errs error) { @@ -834,23 +862,33 @@ func (s *server) Insert(ctx context.Context, req *payload.Insert_Request) (loc * return loc, nil } -func (s *server) StreamInsert(stream vald.Insert_StreamInsertServer) error { +func (s *server) StreamInsert(stream vald.Insert_StreamInsertServer) (err error) { ctx, span := trace.StartSpan(stream.Context(), apiName+".StreamInsert") defer func() { if span != nil { span.End() } }() - return grpc.BidirectionalStream(ctx, stream, s.streamConcurrency, + err = grpc.BidirectionalStream(ctx, stream, s.streamConcurrency, func() interface{} { return new(payload.Insert_Request) }, func(ctx context.Context, data interface{}) (interface{}, error) { - res, err := s.Insert(ctx, data.(*payload.Insert_Request)) + req := data.(*payload.Insert_Request) + ctx, sspan := trace.StartSpan(ctx, apiName+".StreamInsert/id-"+req.GetVector().GetId()) + defer func() { + if sspan != nil { + sspan.End() + } + }() + res, err := s.Insert(ctx, req) if err != nil { st, ok := status.FromError(err) if !ok { st = status.New(codes.Internal, errors.Wrap(err, "failed to parse grpc status from error").Error()) err = errors.Wrap(st.Err(), err.Error()) } + if sspan != nil { + sspan.SetStatus(trace.StatusCodeInternal(err.Error())) + } return &payload.Object_StreamLocation{ Payload: &payload.Object_StreamLocation_Status{ Status: st.Proto(), @@ -863,6 +901,15 @@ func (s *server) StreamInsert(stream vald.Insert_StreamInsertServer) error { }, }, nil }) + + if err != nil { + if span != nil { + span.SetStatus(trace.StatusCodeInternal(err.Error())) + } + log.Error(err) + return err + } + return nil } func (s *server) MultiInsert(ctx context.Context, reqs *payload.Insert_MultiRequest) (locs *payload.Object_Locations, errs error) { @@ -975,23 +1022,33 @@ func (s *server) Update(ctx context.Context, req *payload.Update_Request) (loc * return loc, nil } -func (s *server) StreamUpdate(stream vald.Update_StreamUpdateServer) error { +func (s *server) StreamUpdate(stream vald.Update_StreamUpdateServer) (err error) { ctx, span := trace.StartSpan(stream.Context(), apiName+".StreamUpdate") defer func() { if span != nil { span.End() } }() - return grpc.BidirectionalStream(ctx, stream, s.streamConcurrency, + err = grpc.BidirectionalStream(ctx, stream, s.streamConcurrency, func() interface{} { return new(payload.Update_Request) }, func(ctx context.Context, data interface{}) (interface{}, error) { - res, err := s.Update(ctx, data.(*payload.Update_Request)) + req := data.(*payload.Update_Request) + ctx, sspan := trace.StartSpan(ctx, apiName+".StreamUpdate/id-"+req.GetVector().GetId()) + defer func() { + if sspan != nil { + sspan.End() + } + }() + res, err := s.Update(ctx, req) if err != nil { st, ok := status.FromError(err) if !ok { st = status.New(codes.Internal, errors.Wrap(err, "failed to parse grpc status from error").Error()) err = errors.Wrap(st.Err(), err.Error()) } + if sspan != nil { + sspan.SetStatus(trace.StatusCodeInternal(err.Error())) + } return &payload.Object_StreamLocation{ Payload: &payload.Object_StreamLocation_Status{ Status: st.Proto(), @@ -1004,6 +1061,15 @@ func (s *server) StreamUpdate(stream vald.Update_StreamUpdateServer) error { }, }, nil }) + + if err != nil { + if span != nil { + span.SetStatus(trace.StatusCodeInternal(err.Error())) + } + log.Error(err) + return err + } + return nil } func (s *server) MultiUpdate(ctx context.Context, reqs *payload.Update_MultiRequest) (locs *payload.Object_Locations, errs error) { @@ -1116,23 +1182,33 @@ func (s *server) Upsert(ctx context.Context, req *payload.Upsert_Request) (loc * return loc, nil } -func (s *server) StreamUpsert(stream vald.Upsert_StreamUpsertServer) error { +func (s *server) StreamUpsert(stream vald.Upsert_StreamUpsertServer) (err error) { ctx, span := trace.StartSpan(stream.Context(), apiName+".StreamUpsert") defer func() { if span != nil { span.End() } }() - return grpc.BidirectionalStream(ctx, stream, s.streamConcurrency, + err = grpc.BidirectionalStream(ctx, stream, s.streamConcurrency, func() interface{} { return new(payload.Upsert_Request) }, func(ctx context.Context, data interface{}) (interface{}, error) { - res, err := s.Upsert(ctx, data.(*payload.Upsert_Request)) + req := data.(*payload.Upsert_Request) + ctx, sspan := trace.StartSpan(ctx, apiName+".StreamUpsert/id-"+req.GetVector().GetId()) + defer func() { + if sspan != nil { + sspan.End() + } + }() + res, err := s.Upsert(ctx, req) if err != nil { st, ok := status.FromError(err) if !ok { st = status.New(codes.Internal, errors.Wrap(err, "failed to parse grpc status from error").Error()) err = errors.Wrap(st.Err(), err.Error()) } + if sspan != nil { + sspan.SetStatus(trace.StatusCodeInternal(err.Error())) + } return &payload.Object_StreamLocation{ Payload: &payload.Object_StreamLocation_Status{ Status: st.Proto(), @@ -1145,6 +1221,15 @@ func (s *server) StreamUpsert(stream vald.Upsert_StreamUpsertServer) error { }, }, nil }) + + if err != nil { + if span != nil { + span.SetStatus(trace.StatusCodeInternal(err.Error())) + } + log.Error(err) + return err + } + return nil } func (s *server) MultiUpsert(ctx context.Context, reqs *payload.Upsert_MultiRequest) (locs *payload.Object_Locations, errs error) { @@ -1201,23 +1286,33 @@ func (s *server) Remove(ctx context.Context, req *payload.Remove_Request) (loc * return s.gateway.Remove(ctx, req, s.copts...) } -func (s *server) StreamRemove(stream vald.Remove_StreamRemoveServer) error { +func (s *server) StreamRemove(stream vald.Remove_StreamRemoveServer) (err error) { ctx, span := trace.StartSpan(stream.Context(), apiName+".StreamRemove") defer func() { if span != nil { span.End() } }() - return grpc.BidirectionalStream(ctx, stream, s.streamConcurrency, + err = grpc.BidirectionalStream(ctx, stream, s.streamConcurrency, func() interface{} { return new(payload.Remove_Request) }, func(ctx context.Context, data interface{}) (interface{}, error) { - res, err := s.Remove(ctx, data.(*payload.Remove_Request)) + req := data.(*payload.Remove_Request) + ctx, sspan := trace.StartSpan(ctx, apiName+".StreamRemove/id-"+req.GetId().GetId()) + defer func() { + if sspan != nil { + sspan.End() + } + }() + res, err := s.Remove(ctx, req) if err != nil { st, ok := status.FromError(err) if !ok { st = status.New(codes.Internal, errors.Wrap(err, "failed to parse grpc status from error").Error()) err = errors.Wrap(st.Err(), err.Error()) } + if sspan != nil { + sspan.SetStatus(trace.StatusCodeInternal(err.Error())) + } return &payload.Object_StreamLocation{ Payload: &payload.Object_StreamLocation_Status{ Status: st.Proto(), @@ -1230,6 +1325,15 @@ func (s *server) StreamRemove(stream vald.Remove_StreamRemoveServer) error { }, }, nil }) + + if err != nil { + if span != nil { + span.SetStatus(trace.StatusCodeInternal(err.Error())) + } + log.Error(err) + return err + } + return nil } func (s *server) MultiRemove(ctx context.Context, reqs *payload.Remove_MultiRequest) (locs *payload.Object_Locations, errs error) { @@ -1309,23 +1413,33 @@ func (s *server) GetObject(ctx context.Context, req *payload.Object_VectorReques return vec, nil } -func (s *server) StreamGetObject(stream vald.Object_StreamGetObjectServer) error { +func (s *server) StreamGetObject(stream vald.Object_StreamGetObjectServer) (err error) { ctx, span := trace.StartSpan(stream.Context(), apiName+".StreamGetObject") defer func() { if span != nil { span.End() } }() - return grpc.BidirectionalStream(ctx, stream, s.streamConcurrency, - func() interface{} { return new(payload.Object_ID) }, + err = grpc.BidirectionalStream(ctx, stream, s.streamConcurrency, + func() interface{} { return new(payload.Object_VectorRequest) }, func(ctx context.Context, data interface{}) (interface{}, error) { - res, err := s.GetObject(ctx, data.(*payload.Object_VectorRequest)) + req := data.(*payload.Object_VectorRequest) + ctx, sspan := trace.StartSpan(ctx, apiName+".StreamGetObject/id-"+req.GetId().GetId()) + defer func() { + if sspan != nil { + sspan.End() + } + }() + res, err := s.GetObject(ctx, req) if err != nil { st, ok := status.FromError(err) if !ok { st = status.New(codes.Internal, errors.Wrap(err, "failed to parse grpc status from error").Error()) err = errors.Wrap(st.Err(), err.Error()) } + if sspan != nil { + sspan.SetStatus(trace.StatusCodeInternal(err.Error())) + } return &payload.Object_StreamVector{ Payload: &payload.Object_StreamVector_Status{ Status: st.Proto(), @@ -1338,4 +1452,13 @@ func (s *server) StreamGetObject(stream vald.Object_StreamGetObjectServer) error }, }, nil }) + + if err != nil { + if span != nil { + span.SetStatus(trace.StatusCodeInternal(err.Error())) + } + log.Error(err) + return err + } + return nil } diff --git a/pkg/gateway/lb/handler/grpc/handler.go b/pkg/gateway/lb/handler/grpc/handler.go index 2ffff14b38a..6f1fa513fc3 100644 --- a/pkg/gateway/lb/handler/grpc/handler.go +++ b/pkg/gateway/lb/handler/grpc/handler.go @@ -1827,7 +1827,7 @@ func (s *server) StreamGetObject(stream vald.Object_StreamGetObjectServer) (err } }() err = grpc.BidirectionalStream(ctx, stream, s.streamConcurrency, - func() interface{} { return new(payload.Object_ID) }, + func() interface{} { return new(payload.Object_VectorRequest) }, func(ctx context.Context, data interface{}) (interface{}, error) { req := data.(*payload.Object_VectorRequest) ctx, sspan := trace.StartSpan(ctx, apiName+".StreamGetObject/id-"+req.GetId().GetId()) diff --git a/pkg/gateway/lb/service/gateway_test.go b/pkg/gateway/lb/service/gateway_test.go index bf0e15b308e..ed8f848f903 100644 --- a/pkg/gateway/lb/service/gateway_test.go +++ b/pkg/gateway/lb/service/gateway_test.go @@ -479,3 +479,93 @@ func Test_gateway_GetAgentCount(t *testing.T) { }) } } + +func Test_gateway_Addrs(t *testing.T) { + t.Parallel() + type args struct { + ctx context.Context + } + type fields struct { + client discoverer.Client + eg errgroup.Group + } + type want struct { + want []string + } + type test struct { + name string + args args + fields fields + want want + checkFunc func(want, []string) error + beforeFunc func(args) + afterFunc func(args) + } + defaultCheckFunc := func(w want, got []string) error { + if !reflect.DeepEqual(got, w.want) { + return errors.Errorf("got: \"%#v\",\n\t\t\t\twant: \"%#v\"", got, w.want) + } + return nil + } + tests := []test{ + // TODO test cases + /* + { + name: "test_case_1", + args: args { + ctx: nil, + }, + fields: fields { + client: nil, + eg: nil, + }, + want: want{}, + checkFunc: defaultCheckFunc, + }, + */ + + // TODO test cases + /* + func() test { + return test { + name: "test_case_2", + args: args { + ctx: nil, + }, + fields: fields { + client: nil, + eg: nil, + }, + want: want{}, + checkFunc: defaultCheckFunc, + } + }(), + */ + } + + for _, tc := range tests { + test := tc + t.Run(test.name, func(tt *testing.T) { + tt.Parallel() + defer goleak.VerifyNone(tt, goleak.IgnoreCurrent()) + if test.beforeFunc != nil { + test.beforeFunc(test.args) + } + if test.afterFunc != nil { + defer test.afterFunc(test.args) + } + if test.checkFunc == nil { + test.checkFunc = defaultCheckFunc + } + g := &gateway{ + client: test.fields.client, + eg: test.fields.eg, + } + + got := g.Addrs(test.args.ctx) + if err := test.checkFunc(test.want, got); err != nil { + tt.Errorf("error = %v", err) + } + }) + } +} diff --git a/pkg/gateway/meta/handler/grpc/handler.go b/pkg/gateway/meta/handler/grpc/handler.go index e4ccaeb7aaf..fabf0b064fb 100644 --- a/pkg/gateway/meta/handler/grpc/handler.go +++ b/pkg/gateway/meta/handler/grpc/handler.go @@ -169,7 +169,7 @@ func (s *server) SearchByID(ctx context.Context, req *payload.Search_IDRequest) Owner: errdetails.ValdResourceOwner, Description: err.Error(), }, info.Get()) - log.Error("SearchByID API failed to process request uuids:\t%v\terror:\t%s", meta, err.Error()) + log.Errorf("SearchByID API failed to process request uuids:\t%v\terror:\t%s", meta, err.Error()) if span != nil { span.SetStatus(trace.StatusCodeNotFound(err.Error())) } @@ -1571,7 +1571,7 @@ func (s *server) StreamGetObject(stream vald.Object_StreamGetObjectServer) (err } }() err = grpc.BidirectionalStream(ctx, stream, s.streamConcurrency, - func() interface{} { return new(payload.Object_ID) }, + func() interface{} { return new(payload.Object_VectorRequest) }, func(ctx context.Context, data interface{}) (interface{}, error) { req := data.(*payload.Object_VectorRequest) ctx, sspan := trace.StartSpan(ctx, apiName+".StreamGetObject/id-"+req.GetId().GetId()) diff --git a/pkg/gateway/meta/service/meta_test.go b/pkg/gateway/meta/service/meta_test.go index f156cf14d46..0916c12e1e9 100644 --- a/pkg/gateway/meta/service/meta_test.go +++ b/pkg/gateway/meta/service/meta_test.go @@ -1404,3 +1404,95 @@ func Test_meta_DeleteUUIDs(t *testing.T) { }) } } + +func Test_meta_GRPCClient(t *testing.T) { + t.Parallel() + type fields struct { + client grpc.Client + cache cache.Cache + enableCache bool + expireCheckDuration string + expireDuration string + } + type want struct { + want grpc.Client + } + type test struct { + name string + fields fields + want want + checkFunc func(want, grpc.Client) error + beforeFunc func() + afterFunc func() + } + defaultCheckFunc := func(w want, got grpc.Client) error { + if !reflect.DeepEqual(got, w.want) { + return errors.Errorf("got: \"%#v\",\n\t\t\t\twant: \"%#v\"", got, w.want) + } + return nil + } + tests := []test{ + // TODO test cases + /* + { + name: "test_case_1", + fields: fields { + client: nil, + cache: nil, + enableCache: false, + expireCheckDuration: "", + expireDuration: "", + }, + want: want{}, + checkFunc: defaultCheckFunc, + }, + */ + + // TODO test cases + /* + func() test { + return test { + name: "test_case_2", + fields: fields { + client: nil, + cache: nil, + enableCache: false, + expireCheckDuration: "", + expireDuration: "", + }, + want: want{}, + checkFunc: defaultCheckFunc, + } + }(), + */ + } + + for _, tc := range tests { + test := tc + t.Run(test.name, func(tt *testing.T) { + tt.Parallel() + defer goleak.VerifyNone(tt, goleak.IgnoreCurrent()) + if test.beforeFunc != nil { + test.beforeFunc() + } + if test.afterFunc != nil { + defer test.afterFunc() + } + if test.checkFunc == nil { + test.checkFunc = defaultCheckFunc + } + m := &meta{ + client: test.fields.client, + cache: test.fields.cache, + enableCache: test.fields.enableCache, + expireCheckDuration: test.fields.expireCheckDuration, + expireDuration: test.fields.expireDuration, + } + + got := m.GRPCClient() + if err := test.checkFunc(test.want, got); err != nil { + tt.Errorf("error = %v", err) + } + }) + } +} diff --git a/tests/e2e/crud_test.go b/tests/e2e/crud_test.go index e41de01f79d..0651a5edae1 100644 --- a/tests/e2e/crud_test.go +++ b/tests/e2e/crud_test.go @@ -561,10 +561,10 @@ func TestE2EGetObject(t *testing.T) { t.Errorf("an error returned:\tcode: %d\tmessage: %s\tdetails: %s", err.GetCode(), err.GetMessage(), errdetails.Serialize(err.GetDetails())) } } else { - if !reflect.DeepEqual(res.GetVector(), ds.train[resp.GetId()]) { + if !reflect.DeepEqual(res.GetVector().GetVector(), ds.train[resp.GetId()]) { t.Errorf( "result: %#v, expected: %#v", - res.GetVector(), + res.GetVector().GetVector(), ds.train[resp.GetId()], ) } diff --git a/versions/GO_VERSION b/versions/GO_VERSION index 545fd574d35..98e863cdf81 100644 --- a/versions/GO_VERSION +++ b/versions/GO_VERSION @@ -1 +1 @@ -1.15.7 +1.15.8 diff --git a/versions/NGT_VERSION b/versions/NGT_VERSION index b50dd27dd92..81f363239f5 100644 --- a/versions/NGT_VERSION +++ b/versions/NGT_VERSION @@ -1 +1 @@ -1.13.1 +1.12.3