diff --git a/charts/vald/values.schema.json b/charts/vald/values.schema.json index 731608d248..1b1889a1ea 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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"restart":{"type":"boolean"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"type":"string"}}},"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":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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":{"net":{"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"}}},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"restart":{"type":"boolean"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"type":"string"}}},"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":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"net":{"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"}}},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}}}},"read_buffer_size":{"type":"integer"},"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"restart":{"type":"boolean"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"type":"string"}}},"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":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"net":{"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"}}},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"restart":{"type":"boolean"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"type":"string"}}},"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":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"net":{"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"}}},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}}}},"read_buffer_size":{"type":"integer"},"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"},"net":{"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"}}},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}}}},"read_buffer_size":{"type":"integer"},"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"restart":{"type":"boolean"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"type":"string"}}},"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":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"net":{"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"}}},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}}}},"read_buffer_size":{"type":"integer"},"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"},"net":{"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"}}},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}}}},"read_buffer_size":{"type":"integer"},"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"},"net":{"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"}}},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}}}},"read_buffer_size":{"type":"integer"},"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"restart":{"type":"boolean"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"type":"string"}}},"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":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"net":{"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"}}},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}}}},"read_buffer_size":{"type":"integer"},"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"},"net":{"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"}}},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}}}},"read_buffer_size":{"type":"integer"},"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"restart":{"type":"boolean"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"type":"string"}}},"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":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"net":{"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"}}},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}}}},"read_buffer_size":{"type":"integer"},"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"},"net":{"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"}}},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}}}},"read_buffer_size":{"type":"integer"},"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"restart":{"type":"boolean"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"type":"string"}}},"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":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"net":{"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"}}},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}}}},"read_buffer_size":{"type":"integer"},"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"},"net":{"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"}}},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}}}},"read_buffer_size":{"type":"integer"},"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"},"net":{"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"}}},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}}}},"read_buffer_size":{"type":"integer"},"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"},"net":{"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"}}},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}}}},"read_buffer_size":{"type":"integer"},"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"restart":{"type":"boolean"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"type":"string"}}},"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":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"net":{"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"}}},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"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"},"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"},"net":{"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"}}},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}}}},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"pass":{"type":"string"},"port":{"type":"integer"},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"restart":{"type":"boolean"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"type":"string"}}},"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":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"net":{"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"}}},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}}}},"read_buffer_size":{"type":"integer"},"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"},"net":{"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"}}},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}}}},"read_buffer_size":{"type":"integer"},"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"restart":{"type":"boolean"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"type":"string"}}},"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":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"net":{"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"}}},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}}}},"read_buffer_size":{"type":"integer"},"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"},"net":{"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"}}},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}}}},"read_buffer_size":{"type":"integer"},"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"restart":{"type":"boolean"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"type":"string"}}},"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":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"net":{"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"}}},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"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"},"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"},"net":{"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"}}},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}}}},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"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"},"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"restart":{"type":"boolean"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"type":"string"}}},"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":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"}}}}}} +{"$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"},"vqueue":{"type":"object","properties":{"delete_buffer_pool_size":{"type":"integer"},"delete_buffer_size":{"type":"integer"},"insert_buffer_pool_size":{"type":"integer"},"insert_buffer_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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"restart":{"type":"boolean"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"type":"string"}}},"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":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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":{"net":{"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"}}},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"restart":{"type":"boolean"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"type":"string"}}},"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":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"net":{"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"}}},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}}}},"read_buffer_size":{"type":"integer"},"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"restart":{"type":"boolean"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"type":"string"}}},"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":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"net":{"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"}}},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"restart":{"type":"boolean"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"type":"string"}}},"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":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"net":{"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"}}},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}}}},"read_buffer_size":{"type":"integer"},"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"},"net":{"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"}}},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}}}},"read_buffer_size":{"type":"integer"},"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"restart":{"type":"boolean"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"type":"string"}}},"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":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"net":{"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"}}},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}}}},"read_buffer_size":{"type":"integer"},"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"},"net":{"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"}}},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}}}},"read_buffer_size":{"type":"integer"},"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"},"net":{"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"}}},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}}}},"read_buffer_size":{"type":"integer"},"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"restart":{"type":"boolean"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"type":"string"}}},"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":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"net":{"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"}}},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}}}},"read_buffer_size":{"type":"integer"},"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"},"net":{"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"}}},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}}}},"read_buffer_size":{"type":"integer"},"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"restart":{"type":"boolean"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"type":"string"}}},"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":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"net":{"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"}}},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}}}},"read_buffer_size":{"type":"integer"},"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"},"net":{"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"}}},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}}}},"read_buffer_size":{"type":"integer"},"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"restart":{"type":"boolean"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"type":"string"}}},"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":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"net":{"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"}}},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}}}},"read_buffer_size":{"type":"integer"},"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"},"net":{"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"}}},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}}}},"read_buffer_size":{"type":"integer"},"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"},"net":{"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"}}},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}}}},"read_buffer_size":{"type":"integer"},"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"},"net":{"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"}}},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}}}},"read_buffer_size":{"type":"integer"},"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"restart":{"type":"boolean"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"type":"string"}}},"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":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"net":{"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"}}},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"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"},"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"},"net":{"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"}}},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}}}},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"pass":{"type":"string"},"port":{"type":"integer"},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"restart":{"type":"boolean"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"type":"string"}}},"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":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"net":{"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"}}},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}}}},"read_buffer_size":{"type":"integer"},"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"},"net":{"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"}}},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}}}},"read_buffer_size":{"type":"integer"},"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"restart":{"type":"boolean"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"type":"string"}}},"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":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"net":{"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"}}},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}}}},"read_buffer_size":{"type":"integer"},"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"},"net":{"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"}}},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}}}},"read_buffer_size":{"type":"integer"},"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"restart":{"type":"boolean"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"type":"string"}}},"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":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"net":{"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"}}},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"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"},"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"},"net":{"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"}}},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"tls":{"type":"object","properties":{"ca":{"type":"string"},"cert":{"type":"string"},"enabled":{"type":"boolean"},"insecure_skip_verify":{"type":"boolean"},"key":{"type":"string"}}}}},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"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"},"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"restart":{"type":"boolean"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"type":"string"}}},"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":{"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"},"network":{"type":"string","enum":["tcp","tcp4","tcp6","udp","udp4","udp6","unix","unixgram","unixpacket"]},"probe_wait_time":{"type":"string"},"socket_option":{"type":"object","properties":{"ip_recover_destination_addr":{"type":"boolean"},"ip_transparent":{"type":"boolean"},"net_cork":{"type":"boolean"},"net_defer_accept":{"type":"boolean"},"net_fast_open":{"type":"boolean"},"net_no_delay":{"type":"boolean"},"net_quick_ack":{"type":"boolean"},"reuse_addr":{"type":"boolean"},"reuse_port":{"type":"boolean"}}},"socket_path":{"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 0f12ebe301..fc960bdc8b 100644 --- a/charts/vald/values.yaml +++ b/charts/vald/values.yaml @@ -2578,6 +2578,20 @@ agent: # @schema {"name": "agent.ngt.enable_proactive_gc", "type": "boolean"} # agent.ngt.enable_proactive_gc -- enable proactive GC call for reducing heap memory allocation enable_proactive_gc: true + # @schema {"name": "agent.ngt.vqueue", "type": "object"} + vqueue: + # @schema {"name": "agent.ngt.vqueue.insert_buffer_size", "type": "integer"} + # agent.ngt.vqueue.insert_buffer_size -- insert channel buffer size + insert_buffer_size: 100 + # @schema {"name": "agent.ngt.vqueue.delete_buffer_size", "type": "integer"} + # agent.ngt.vqueue.delete_buffer_size -- delete channel buffer size + delete_buffer_size: 100 + # @schema {"name": "agent.ngt.vqueue.insert_buffer_pool_size", "type": "integer"} + # agent.ngt.vqueue.insert_buffer_pool_size -- insert slice pool buffer size + insert_buffer_pool_size: 10000 + # @schema {"name": "agent.ngt.vqueue.delete_buffer_pool_size", "type": "integer"} + # agent.ngt.vqueue.delete_buffer_pool_size -- delete slice pool buffer size + delete_buffer_pool_size: 5000 # @schema {"name": "agent.sidecar", "type": "object"} sidecar: # @schema {"name": "agent.sidecar.enabled", "type": "boolean"} diff --git a/cmd/agent/core/ngt/sample.yaml b/cmd/agent/core/ngt/sample.yaml index cfca962b82..bbe9094540 100644 --- a/cmd/agent/core/ngt/sample.yaml +++ b/cmd/agent/core/ngt/sample.yaml @@ -152,9 +152,9 @@ ngt: bulk_insert_chunk_size: 10 creation_edge_size: 20 default_epsilon: 0.01 - default_pool_size: 10000 + default_pool_size: 100 default_radius: -1 - dimension: 6 + dimension: 100 distance_type: l2 enable_in_memory_mode: true enable_proactive_gc: true diff --git a/go.mod b/go.mod index 50f17ecfe9..aec4ec497f 100755 --- a/go.mod +++ b/go.mod @@ -5,14 +5,14 @@ go 1.16 replace ( cloud.google.com/go => cloud.google.com/go v0.78.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.20 + github.com/aws/aws-sdk-go => github.com/aws/aws-sdk-go v1.37.22 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 - github.com/docker/docker => github.com/moby/moby v20.10.4+incompatible + github.com/docker/docker => github.com/moby/moby v20.10.5+incompatible github.com/envoyproxy/protoc-gen-validate => github.com/envoyproxy/protoc-gen-validate v0.4.1 github.com/go-sql-driver/mysql => github.com/go-sql-driver/mysql v1.5.0 - github.com/gocql/gocql => github.com/gocql/gocql v0.0.0-20210129204804-4364a4b9cfdd + github.com/gocql/gocql => github.com/gocql/gocql v0.0.0-20210301062520-a04dba85ed25 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 @@ -20,8 +20,8 @@ replace ( github.com/googleapis/gnostic => github.com/googleapis/gnostic v0.5.4 github.com/gophercloud/gophercloud => github.com/gophercloud/gophercloud v0.16.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.9-0.20210226154345-6381575b273f + github.com/hailocab/go-hostpool => github.com/kpango/go-hostpool v0.0.0-20210303030322-aab80263dcd0 + github.com/klauspost/compress => github.com/klauspost/compress v1.11.10-0.20210302113407-0d78ef07f573 github.com/kpango/glg => github.com/kpango/glg v1.5.1 github.com/tensorflow/tensorflow => github.com/tensorflow/tensorflow v2.1.2+incompatible golang.org/x/crypto => golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83 @@ -76,11 +76,11 @@ require ( go.uber.org/zap v1.16.0 golang.org/x/net v0.0.0-20210226172049-e18ecbb05110 golang.org/x/sync v0.0.0-20210220032951-036812b2e83c - golang.org/x/sys v0.0.0-20210227040730-b0d1d43c014d + golang.org/x/sys v0.0.0-20210303074136-134d130e1a04 gonum.org/v1/hdf5 v0.0.0-20200504100616-496fefe91614 gonum.org/v1/plot v0.8.1 google.golang.org/api v0.40.0 - google.golang.org/genproto v0.0.0-20210226172003-ab064af71705 + google.golang.org/genproto v0.0.0-20210302174412-5ede27ff9881 google.golang.org/grpc v1.35.0 gopkg.in/yaml.v2 v2.4.0 k8s.io/api v0.20.4 diff --git a/go.sum b/go.sum index f73cfc6d10..2f34355cce 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.20 h1:CJCXpMYmBJrRH8YwoSE0oB9S3J5ax+62F14sYlDCztg= -github.com/aws/aws-sdk-go v1.37.20/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= +github.com/aws/aws-sdk-go v1.37.22 h1:cyZp8TvUbH9rrShdrwULtCj4pB5szddrw9aKHUsw1Ic= +github.com/aws/aws-sdk-go v1.37.22/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= @@ -169,8 +169,8 @@ github.com/go-redis/redis/v8 v8.6.0/go.mod h1:DQ9q4Rk2HtwkrwVrdgmphoOQDMfpvcd/nH 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= -github.com/gocql/gocql v0.0.0-20210129204804-4364a4b9cfdd h1:j0VZcDIpU6sLBMNFUEvuwP4FdmEXbmaEq6qufApwbbo= -github.com/gocql/gocql v0.0.0-20210129204804-4364a4b9cfdd/go.mod h1:DL0ekTmBSTdlNF25Orwt/JMzqIq3EJ4MVa/J/uK64OY= +github.com/gocql/gocql v0.0.0-20210301062520-a04dba85ed25 h1:RqyFvP1RF5WLMGn9VVCSTPzg15b7jvFwJeWmWujSA6Q= +github.com/gocql/gocql v0.0.0-20210301062520-a04dba85ed25/go.mod h1:DL0ekTmBSTdlNF25Orwt/JMzqIq3EJ4MVa/J/uK64OY= github.com/gocraft/dbr/v2 v2.7.1 h1:v/bqxEBTlzj9sDbFCmtO2K1M3foDnYtQn097VoMALCw= github.com/gocraft/dbr/v2 v2.7.1/go.mod h1:+q/T5TMzrc6BWFbcSzj7ixaaBJkbDfRsy9gq7eMsU1s= github.com/gogo/googleapis v1.4.0 h1:zgVt4UpGxcqVOw97aRGxT4svlcmdK35fynLNctY32zI= @@ -295,8 +295,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.9-0.20210226154345-6381575b273f h1:Ci0TKv+M1ZYVcpHxft0R0GR2RQ6Y6v32JJ4FKmkKo38= -github.com/klauspost/compress v1.11.9-0.20210226154345-6381575b273f/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.11.10-0.20210302113407-0d78ef07f573 h1:ITN78bwwn3Ie6wqQ7Xq/dSsG8cJIj0+ryIh0sq2ETJI= +github.com/klauspost/compress v1.11.10-0.20210302113407-0d78ef07f573/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= @@ -309,6 +309,8 @@ github.com/kpango/gache v1.2.5 h1:JBR4k74TSRWrfK7zk4godTl3lS4X1BWhdVD645NQYQ4= github.com/kpango/gache v1.2.5/go.mod h1:xiTyKBFCsq/KA3fu4aznKwnnmfMLfOch5ZI/gAD2iPY= github.com/kpango/glg v1.5.1 h1:ecOOgdPMt7OdDUYjoUZ9dbnY8MVwUUMc6D5ZN3exLNM= github.com/kpango/glg v1.5.1/go.mod h1:xIbZZSoRgDaYrXYmBK4wccGHkHK3qk61H/pK3R4qyE8= +github.com/kpango/go-hostpool v0.0.0-20210303030322-aab80263dcd0 h1:orIEVdc68woWO1ZyYWEVOl5Kl33eDjP+kbxgbdpMwi4= +github.com/kpango/go-hostpool v0.0.0-20210303030322-aab80263dcd0/go.mod h1:CJt2OTBmIWH7X/gYDy8fg67d26E/a8MpbGvgrKWZQxQ= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= @@ -358,8 +360,6 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/monzo/go-hostpool v0.0.0-20200724120130-287edbb29340 h1:QuK697dDaOR2VjdQTtMa3kRAWdxr/upvblGXmCxrg5k= -github.com/monzo/go-hostpool v0.0.0-20200724120130-287edbb29340/go.mod h1:XXO50svJbofYOBxMA6c3sQMMQ71W/kV5AjMZgjxUN3s= github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= @@ -686,8 +686,8 @@ golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7w 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-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210227040730-b0d1d43c014d h1:9fH9JvLNoSpsDWcXJ4dSE3lZW99Z3OCUZLr07g60U6o= -golang.org/x/sys v0.0.0-20210227040730-b0d1d43c014d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210303074136-134d130e1a04 h1:cEhElsAv9LUt9ZUUocxzWe05oFLVd+AA2nstydTeI8g= +golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= @@ -814,8 +814,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-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210226172003-ab064af71705 h1:PYBmACG+YEv8uQPW0r1kJj8tR+gkF0UWq7iFdUezwEw= -google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210302174412-5ede27ff9881 h1:SYuy3hIRsBIROE0aZwsJZOEJNC/n9/p0FmLEU9C31AE= +google.golang.org/genproto v0.0.0-20210302174412-5ede27ff9881/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/grpc v1.36.0 h1:o1bcQ6imQMIOpdrO3SWf2z5RV72WbDwdXuK0MDlc8As= google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c= diff --git a/hack/go.mod.default b/hack/go.mod.default index 642ca5d195..613f028fb3 100755 --- a/hack/go.mod.default +++ b/hack/go.mod.default @@ -21,7 +21,7 @@ replace ( github.com/googleapis/gnostic => github.com/googleapis/gnostic latest github.com/gophercloud/gophercloud => github.com/gophercloud/gophercloud latest github.com/gorilla/websocket => github.com/gorilla/websocket latest - github.com/hailocab/go-hostpool => github.com/monzo/go-hostpool latest + github.com/hailocab/go-hostpool => github.com/kpango/go-hostpool master github.com/klauspost/compress => github.com/klauspost/compress master github.com/tensorflow/tensorflow => github.com/tensorflow/tensorflow v2.1.2 golang.org/x/crypto => golang.org/x/crypto latest diff --git a/internal/config/net_test.go b/internal/config/net_test.go index d27fc726ef..2917198145 100644 --- a/internal/config/net_test.go +++ b/internal/config/net_test.go @@ -187,7 +187,7 @@ func TestDialer_Bind(t *testing.T) { } } -func TestTCP_Bind(t *testing.T) { +func TestNet_Bind(t *testing.T) { type fields struct { DNS *DNS Dialer *Dialer @@ -267,7 +267,7 @@ func TestTCP_Bind(t *testing.T) { } } -func TestTCP_Opts(t *testing.T) { +func TestNet_Opts(t *testing.T) { type fields struct { DNS *DNS Dialer *Dialer diff --git a/internal/config/ngt.go b/internal/config/ngt.go index f235390f3f..f6b6c72492 100644 --- a/internal/config/ngt.go +++ b/internal/config/ngt.go @@ -20,64 +20,82 @@ package config // NGT represent the ngt core configuration for server. type NGT struct { // IndexPath represent the ngt index file path - IndexPath string `yaml:"index_path" json:"index_path"` + IndexPath string `yaml:"index_path" json:"index_path,omitempty"` // Dimension represent the ngt index dimension - Dimension int `yaml:"dimension" json:"dimension"` + Dimension int `yaml:"dimension" json:"dimension,omitempty"` // BulkInsertChunkSize represent the bulk insert chunk size - BulkInsertChunkSize int `yaml:"bulk_insert_chunk_size" json:"bulk_insert_chunk_size"` + BulkInsertChunkSize int `yaml:"bulk_insert_chunk_size" json:"bulk_insert_chunk_size,omitempty"` // DistanceType represent the ngt index distance type - DistanceType string `yaml:"distance_type" json:"distance_type"` + DistanceType string `yaml:"distance_type" json:"distance_type,omitempty"` // ObjectType represent the ngt index object type float or int - ObjectType string `yaml:"object_type" json:"object_type"` + ObjectType string `yaml:"object_type" json:"object_type,omitempty"` // CreationEdgeSize represent the index edge count - CreationEdgeSize int `yaml:"creation_edge_size" json:"creation_edge_size"` + CreationEdgeSize int `yaml:"creation_edge_size" json:"creation_edge_size,omitempty"` // SearchEdgeSize represent the search edge size - SearchEdgeSize int `yaml:"search_edge_size" json:"search_edge_size"` + SearchEdgeSize int `yaml:"search_edge_size" json:"search_edge_size,omitempty"` // AutoIndexDurationLimit represents auto indexing duration limit - AutoIndexDurationLimit string `yaml:"auto_index_duration_limit" json:"auto_index_duration_limit"` + AutoIndexDurationLimit string `yaml:"auto_index_duration_limit" json:"auto_index_duration_limit,omitempty"` // AutoIndexCheckDuration represent checking loop duration about auto indexing execution - AutoIndexCheckDuration string `yaml:"auto_index_check_duration" json:"auto_index_check_duration"` + AutoIndexCheckDuration string `yaml:"auto_index_check_duration" json:"auto_index_check_duration,omitempty"` // AutoSaveIndexDuration represent checking loop duration about auto save index execution - AutoSaveIndexDuration string `yaml:"auto_save_index_duration" json:"auto_save_index_duration"` + AutoSaveIndexDuration string `yaml:"auto_save_index_duration" json:"auto_save_index_duration,omitempty"` // AutoIndexLength represent auto index length limit - AutoIndexLength int `yaml:"auto_index_length" json:"auto_index_length"` + AutoIndexLength int `yaml:"auto_index_length" json:"auto_index_length,omitempty"` // InitialDelayMaxDuration represent maximum duration for initial delay - InitialDelayMaxDuration string `yaml:"initial_delay_max_duration" json:"initial_delay_max_duration"` + InitialDelayMaxDuration string `yaml:"initial_delay_max_duration" json:"initial_delay_max_duration,omitempty"` // EnableInMemoryMode enables on memory ngt indexing mode - EnableInMemoryMode bool `yaml:"enable_in_memory_mode" json:"enable_in_memory_mode"` + EnableInMemoryMode bool `yaml:"enable_in_memory_mode" json:"enable_in_memory_mode,omitempty"` // DefaultPoolSize represent default create index batch pool size - DefaultPoolSize uint32 `yaml:"default_pool_size" json:"default_pool_size"` + DefaultPoolSize uint32 `yaml:"default_pool_size" json:"default_pool_size,omitempty"` // DefaultRadius represent default radius used for search - DefaultRadius float32 `yaml:"default_radius" json:"default_radius"` + DefaultRadius float32 `yaml:"default_radius" json:"default_radius,omitempty"` // DefaultEpsilon represent default epsilon used for search - DefaultEpsilon float32 `yaml:"default_epsilon" json:"default_epsilon"` + DefaultEpsilon float32 `yaml:"default_epsilon" json:"default_epsilon,omitempty"` // MinLoadIndexTimeout represents minimum duration of load index timeout - MinLoadIndexTimeout string `yaml:"min_load_index_timeout" json:"min_load_index_timeout"` + MinLoadIndexTimeout string `yaml:"min_load_index_timeout" json:"min_load_index_timeout,omitempty"` // MaxLoadIndexTimeout represents maximum duration of load index timeout - MaxLoadIndexTimeout string `yaml:"max_load_index_timeout" json:"max_load_index_timeout"` + MaxLoadIndexTimeout string `yaml:"max_load_index_timeout" json:"max_load_index_timeout,omitempty"` // LoadIndexTimeoutFactor represents a factor of load index timeout - LoadIndexTimeoutFactor string `yaml:"load_index_timeout_factor" json:"load_index_timeout_factor"` + LoadIndexTimeoutFactor string `yaml:"load_index_timeout_factor" json:"load_index_timeout_factor,omitempty"` // EnableProactiveGC enables more proactive GC call for reducing heap memory allocation - EnableProactiveGC bool `yaml:"enable_proactive_gc" json:"enable_proactive_gc"` + EnableProactiveGC bool `yaml:"enable_proactive_gc" json:"enable_proactive_gc,omitempty"` + + // VQueue represent the ngt vector queue buffer size + VQueue *VQueue `json:"vqueue,omitempty" yaml:"vqueue"` +} + +// VQueue represent the ngt vector queue buffer size +type VQueue struct { + // InsertBufferSize represents insert channel buffer size + InsertBufferSize int `json:"insert_buffer_size,omitempty" yaml:"insert_buffer_size"` + + // InsertBufferPoolSize represents insert time ordered slice buffer size + InsertBufferPoolSize int `json:"insert_buffer_pool_size,omitempty" yaml:"insert_buffer_pool_size"` + + // DeleteBufferSize represents delete channel buffer size + DeleteBufferSize int `json:"delete_buffer_size,omitempty" yaml:"delete_buffer_size"` + + // DeleteBufferPoolSize represents delete time ordered slice buffer size + DeleteBufferPoolSize int `json:"delete_buffer_pool_size,omitempty" yaml:"delete_buffer_pool_size"` } // Bind returns NGT object whose some string value is filed value or environment value. @@ -92,5 +110,8 @@ func (n *NGT) Bind() *NGT { n.MinLoadIndexTimeout = GetActualValue(n.MinLoadIndexTimeout) n.MaxLoadIndexTimeout = GetActualValue(n.MaxLoadIndexTimeout) n.LoadIndexTimeoutFactor = GetActualValue(n.LoadIndexTimeoutFactor) + if n.VQueue == nil { + n.VQueue = new(VQueue) + } return n } diff --git a/internal/config/ngt_test.go b/internal/config/ngt_test.go index db3a7ad0ff..a9a53ddedc 100644 --- a/internal/config/ngt_test.go +++ b/internal/config/ngt_test.go @@ -40,6 +40,7 @@ func TestNGT_Bind(t *testing.T) { AutoIndexLength int InitialDelayMaxDuration string EnableInMemoryMode bool + VQueue *VQueue } type want struct { want *NGT @@ -75,6 +76,7 @@ func TestNGT_Bind(t *testing.T) { AutoIndexLength: 100, InitialDelayMaxDuration: "1h", EnableInMemoryMode: false, + VQueue: new(VQueue), }, want: want{ want: &NGT{ @@ -91,6 +93,7 @@ func TestNGT_Bind(t *testing.T) { AutoIndexLength: 100, InitialDelayMaxDuration: "1h", EnableInMemoryMode: false, + VQueue: new(VQueue), }, }, }, @@ -110,6 +113,7 @@ func TestNGT_Bind(t *testing.T) { AutoIndexLength: 100, InitialDelayMaxDuration: "_initialDelayMaxDuration_", EnableInMemoryMode: false, + VQueue: new(VQueue), }, beforeFunc: func() { _ = os.Setenv("indexPath", "config/ngt") @@ -144,13 +148,16 @@ func TestNGT_Bind(t *testing.T) { AutoIndexLength: 100, InitialDelayMaxDuration: "1h", EnableInMemoryMode: false, + VQueue: new(VQueue), }, }, }, { name: "returns NGT when all fields are empty", want: want{ - want: new(NGT), + want: &NGT{ + VQueue: new(VQueue), + }, }, }, } diff --git a/internal/core/algorithm/ngt/ngt.go b/internal/core/algorithm/ngt/ngt.go index f119b9c294..bbefc1df61 100644 --- a/internal/core/algorithm/ngt/ngt.go +++ b/internal/core/algorithm/ngt/ngt.go @@ -499,16 +499,14 @@ func (n *ngt) Remove(id uint) error { } // BulkRemove removes multiple index from NGT index. -func (n *ngt) BulkRemove(ids ...uint) error { - n.mu.Lock() - defer n.mu.Unlock() - for _, id := range ids { - if C.ngt_remove_index(n.index, C.ObjectID(id), n.ebuf) == ErrorCode { - ne := n.ebuf - return n.newGoError(ne) +func (n *ngt) BulkRemove(ids ...uint) (errs error) { + for i, id := range ids { + err := n.Remove(id) + if err != nil { + errs = errors.Wrapf(errs, "bulkremove error detected index number: %d,\tid: %d\terr: %v", i, id, err) } } - return nil + return errs } // GetVector returns vector stored in NGT index. diff --git a/internal/errors/vqueue.go b/internal/errors/vqueue.go new file mode 100644 index 0000000000..b2fc5b4a01 --- /dev/null +++ b/internal/errors/vqueue.go @@ -0,0 +1,20 @@ +// +// 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 errors provides error types and function +package errors + +var ErrVQueueFinalizing = New("error vector queue is now finalizing...") diff --git a/internal/net/http/middleware/timeout.go b/internal/net/http/middleware/timeout.go index dde511ea34..7d2531aef2 100644 --- a/internal/net/http/middleware/timeout.go +++ b/internal/net/http/middleware/timeout.go @@ -59,26 +59,36 @@ func (t *timeout) Wrap(h rest.Func) rest.Func { var code int code, err = h(w, r.WithContext(ctx)) if err != nil { - sch <- code + select { + case <-ctx.Done(): + case sch <- code: + } runtime.Gosched() } - ech <- err + select { + case <-ctx.Done(): + case ech <- err: + } return nil })) select { + case <-ctx.Done(): + // timeout passed or parent context canceled first, + // it is the responsibility for handler to response to the user + return http.StatusRequestTimeout, errors.ErrHandlerTimeout(ctx.Err(), time.Duration(fastime.UnixNanoNow()-start)) case err = <-ech: // handler finished first, may have error returned if err != nil { - code = <-sch + select { + case <-ctx.Done(): + return http.StatusRequestTimeout, errors.ErrHandlerTimeout(errors.Wrap(ctx.Err(), err.Error()), time.Duration(fastime.UnixNanoNow()-start)) + case code = <-sch: + } err = errors.ErrHandler(err) return code, err } return http.StatusOK, nil - case <-ctx.Done(): - // timeout passed or parent context canceled first, - // it is the responsibility for handler to response to the user - return http.StatusRequestTimeout, errors.ErrHandlerTimeout(ctx.Err(), time.Duration(fastime.UnixNanoNow()-start)) } } } diff --git a/internal/observability/metrics/agent/core/ngt/ngt.go b/internal/observability/metrics/agent/core/ngt/ngt.go index 57b287a794..3cbf4b8469 100644 --- a/internal/observability/metrics/agent/core/ngt/ngt.go +++ b/internal/observability/metrics/agent/core/ngt/ngt.go @@ -25,15 +25,17 @@ import ( ) type ngtMetrics struct { - ngt service.NGT - indexCount metrics.Int64Measure - uncommittedIndexCount metrics.Int64Measure - insertVCacheCount metrics.Int64Measure - deleteVCacheCount metrics.Int64Measure - completedCreateIndexTotal metrics.Int64Measure - executedProactiveGCTotal metrics.Int64Measure - isIndexing metrics.Int64Measure - isSaving metrics.Int64Measure + ngt service.NGT + indexCount metrics.Int64Measure + uncommittedIndexCount metrics.Int64Measure + insertVQueueCount metrics.Int64Measure + deleteVQueueCount metrics.Int64Measure + insertVQueueChannelBufferCount metrics.Int64Measure + deleteVQueueChannelBufferCount metrics.Int64Measure + completedCreateIndexTotal metrics.Int64Measure + executedProactiveGCTotal metrics.Int64Measure + isIndexing metrics.Int64Measure + isSaving metrics.Int64Measure } func New(n service.NGT) metrics.Metric { @@ -47,13 +49,21 @@ func New(n service.NGT) metrics.Metric { metrics.ValdOrg+"/agent/core/ngt/uncommitted_index_count", "Agent NGT uncommitted index count", metrics.UnitDimensionless), - insertVCacheCount: *metrics.Int64( - metrics.ValdOrg+"/agent/core/ngt/insert_vcache_count", - "Agent NGT insert vcache count", + insertVQueueCount: *metrics.Int64( + metrics.ValdOrg+"/agent/core/ngt/insert_vqueue_count", + "Agent NGT insert vqueue count", metrics.UnitDimensionless), - deleteVCacheCount: *metrics.Int64( - metrics.ValdOrg+"/agent/core/ngt/delete_vcache_count", - "Agent NGT delete vcache count", + deleteVQueueCount: *metrics.Int64( + metrics.ValdOrg+"/agent/core/ngt/delete_vqueue_count", + "Agent NGT delete vqueue count", + metrics.UnitDimensionless), + insertVQueueChannelBufferCount: *metrics.Int64( + metrics.ValdOrg+"/agent/core/ngt/insert_vqueue_channel_buffer_count", + "Agent NGT insert vqueue channel buffer count", + metrics.UnitDimensionless), + deleteVQueueChannelBufferCount: *metrics.Int64( + metrics.ValdOrg+"/agent/core/ngt/delete_vqueue_channel_buffer_count", + "Agent NGT delete vqueue channel buffer count", metrics.UnitDimensionless), completedCreateIndexTotal: *metrics.Int64( metrics.ValdOrg+"/agent/core/ngt/completed_create_index_total", @@ -87,9 +97,11 @@ func (n *ngtMetrics) Measurement(ctx context.Context) ([]metrics.Measurement, er return []metrics.Measurement{ n.indexCount.M(int64(n.ngt.Len())), - n.uncommittedIndexCount.M(int64(n.ngt.InsertVCacheLen() + n.ngt.DeleteVCacheLen())), - n.insertVCacheCount.M(int64(n.ngt.InsertVCacheLen())), - n.deleteVCacheCount.M(int64(n.ngt.DeleteVCacheLen())), + n.uncommittedIndexCount.M(int64(n.ngt.InsertVQueueBufferLen() + n.ngt.DeleteVQueueBufferLen())), + n.insertVQueueCount.M(int64(n.ngt.InsertVQueueBufferLen())), + n.deleteVQueueCount.M(int64(n.ngt.DeleteVQueueBufferLen())), + n.insertVQueueChannelBufferCount.M(int64(n.ngt.InsertVQueueChannelLen())), + n.deleteVQueueChannelBufferCount.M(int64(n.ngt.DeleteVQueueChannelLen())), n.completedCreateIndexTotal.M(int64(n.ngt.NumberOfCreateIndexExecution())), n.executedProactiveGCTotal.M(int64(n.ngt.NumberOfProactiveGCExecution())), n.isIndexing.M(isIndexing), @@ -116,15 +128,27 @@ func (n *ngtMetrics) View() []*metrics.View { Aggregation: metrics.LastValue(), }, { - Name: "agent_core_ngt_insert_vcache_count", - Description: n.insertVCacheCount.Description(), - Measure: &n.insertVCacheCount, + Name: "agent_core_ngt_insert_vqueue_count", + Description: n.insertVQueueCount.Description(), + Measure: &n.insertVQueueCount, + Aggregation: metrics.LastValue(), + }, + { + Name: "agent_core_ngt_delete_vqueue_count", + Description: n.deleteVQueueCount.Description(), + Measure: &n.deleteVQueueCount, + Aggregation: metrics.LastValue(), + }, + { + Name: "agent_core_ngt_insert_vqueue_channel_buffer_count", + Description: n.insertVQueueChannelBufferCount.Description(), + Measure: &n.insertVQueueChannelBufferCount, Aggregation: metrics.LastValue(), }, { - Name: "agent_core_ngt_delete_vcache_count", - Description: n.deleteVCacheCount.Description(), - Measure: &n.deleteVCacheCount, + Name: "agent_core_ngt_delete_vqueue_channel_buffer_count", + Description: n.deleteVQueueChannelBufferCount.Description(), + Measure: &n.deleteVQueueChannelBufferCount, Aggregation: metrics.LastValue(), }, { diff --git a/internal/observability/metrics/agent/core/ngt/ngt_test.go b/internal/observability/metrics/agent/core/ngt/ngt_test.go index c61391b7ff..216aae41c4 100644 --- a/internal/observability/metrics/agent/core/ngt/ngt_test.go +++ b/internal/observability/metrics/agent/core/ngt/ngt_test.go @@ -78,10 +78,11 @@ func TestNew(t *testing.T) { */ } - for _, test := range tests { + for _, tc := range tests { + test := tc t.Run(test.name, func(tt *testing.T) { tt.Parallel() - defer goleak.VerifyNone(tt) + defer goleak.VerifyNone(tt, goleak.IgnoreCurrent()) if test.beforeFunc != nil { test.beforeFunc(test.args) } @@ -109,8 +110,8 @@ func Test_ngtMetrics_Measurement(t *testing.T) { ngt service.NGT indexCount metrics.Int64Measure uncommittedIndexCount metrics.Int64Measure - insertVCacheCount metrics.Int64Measure - deleteVCacheCount metrics.Int64Measure + insertVQueueCount metrics.Int64Measure + deleteVQueueCount metrics.Int64Measure completedCreateIndexTotal metrics.Int64Measure executedProactiveGCTotal metrics.Int64Measure isIndexing metrics.Int64Measure @@ -150,8 +151,8 @@ func Test_ngtMetrics_Measurement(t *testing.T) { ngt: nil, indexCount: nil, uncommittedIndexCount: nil, - insertVCacheCount: nil, - deleteVCacheCount: nil, + insertVQueueCount: nil, + deleteVQueueCount: nil, completedCreateIndexTotal: nil, executedProactiveGCTotal: nil, isIndexing: nil, @@ -174,8 +175,8 @@ func Test_ngtMetrics_Measurement(t *testing.T) { ngt: nil, indexCount: nil, uncommittedIndexCount: nil, - insertVCacheCount: nil, - deleteVCacheCount: nil, + insertVQueueCount: nil, + deleteVQueueCount: nil, completedCreateIndexTotal: nil, executedProactiveGCTotal: nil, isIndexing: nil, @@ -188,10 +189,11 @@ func Test_ngtMetrics_Measurement(t *testing.T) { */ } - for _, test := range tests { + for _, tc := range tests { + test := tc t.Run(test.name, func(tt *testing.T) { tt.Parallel() - defer goleak.VerifyNone(tt) + defer goleak.VerifyNone(tt, goleak.IgnoreCurrent()) if test.beforeFunc != nil { test.beforeFunc(test.args) } @@ -205,8 +207,8 @@ func Test_ngtMetrics_Measurement(t *testing.T) { ngt: test.fields.ngt, indexCount: test.fields.indexCount, uncommittedIndexCount: test.fields.uncommittedIndexCount, - insertVCacheCount: test.fields.insertVCacheCount, - deleteVCacheCount: test.fields.deleteVCacheCount, + insertVQueueCount: test.fields.insertVQueueCount, + deleteVQueueCount: test.fields.deleteVQueueCount, completedCreateIndexTotal: test.fields.completedCreateIndexTotal, executedProactiveGCTotal: test.fields.executedProactiveGCTotal, isIndexing: test.fields.isIndexing, @@ -230,8 +232,8 @@ func Test_ngtMetrics_MeasurementWithTags(t *testing.T) { ngt service.NGT indexCount metrics.Int64Measure uncommittedIndexCount metrics.Int64Measure - insertVCacheCount metrics.Int64Measure - deleteVCacheCount metrics.Int64Measure + insertVQueueCount metrics.Int64Measure + deleteVQueueCount metrics.Int64Measure completedCreateIndexTotal metrics.Int64Measure executedProactiveGCTotal metrics.Int64Measure isIndexing metrics.Int64Measure @@ -271,8 +273,8 @@ func Test_ngtMetrics_MeasurementWithTags(t *testing.T) { ngt: nil, indexCount: nil, uncommittedIndexCount: nil, - insertVCacheCount: nil, - deleteVCacheCount: nil, + insertVQueueCount: nil, + deleteVQueueCount: nil, completedCreateIndexTotal: nil, executedProactiveGCTotal: nil, isIndexing: nil, @@ -295,8 +297,8 @@ func Test_ngtMetrics_MeasurementWithTags(t *testing.T) { ngt: nil, indexCount: nil, uncommittedIndexCount: nil, - insertVCacheCount: nil, - deleteVCacheCount: nil, + insertVQueueCount: nil, + deleteVQueueCount: nil, completedCreateIndexTotal: nil, executedProactiveGCTotal: nil, isIndexing: nil, @@ -309,10 +311,11 @@ func Test_ngtMetrics_MeasurementWithTags(t *testing.T) { */ } - for _, test := range tests { + for _, tc := range tests { + test := tc t.Run(test.name, func(tt *testing.T) { tt.Parallel() - defer goleak.VerifyNone(tt) + defer goleak.VerifyNone(tt, goleak.IgnoreCurrent()) if test.beforeFunc != nil { test.beforeFunc(test.args) } @@ -326,8 +329,8 @@ func Test_ngtMetrics_MeasurementWithTags(t *testing.T) { ngt: test.fields.ngt, indexCount: test.fields.indexCount, uncommittedIndexCount: test.fields.uncommittedIndexCount, - insertVCacheCount: test.fields.insertVCacheCount, - deleteVCacheCount: test.fields.deleteVCacheCount, + insertVQueueCount: test.fields.insertVQueueCount, + deleteVQueueCount: test.fields.deleteVQueueCount, completedCreateIndexTotal: test.fields.completedCreateIndexTotal, executedProactiveGCTotal: test.fields.executedProactiveGCTotal, isIndexing: test.fields.isIndexing, @@ -348,8 +351,8 @@ func Test_ngtMetrics_View(t *testing.T) { ngt service.NGT indexCount metrics.Int64Measure uncommittedIndexCount metrics.Int64Measure - insertVCacheCount metrics.Int64Measure - deleteVCacheCount metrics.Int64Measure + insertVQueueCount metrics.Int64Measure + deleteVQueueCount metrics.Int64Measure completedCreateIndexTotal metrics.Int64Measure executedProactiveGCTotal metrics.Int64Measure isIndexing metrics.Int64Measure @@ -381,8 +384,8 @@ func Test_ngtMetrics_View(t *testing.T) { ngt: nil, indexCount: nil, uncommittedIndexCount: nil, - insertVCacheCount: nil, - deleteVCacheCount: nil, + insertVQueueCount: nil, + deleteVQueueCount: nil, completedCreateIndexTotal: nil, executedProactiveGCTotal: nil, isIndexing: nil, @@ -402,8 +405,8 @@ func Test_ngtMetrics_View(t *testing.T) { ngt: nil, indexCount: nil, uncommittedIndexCount: nil, - insertVCacheCount: nil, - deleteVCacheCount: nil, + insertVQueueCount: nil, + deleteVQueueCount: nil, completedCreateIndexTotal: nil, executedProactiveGCTotal: nil, isIndexing: nil, @@ -416,10 +419,11 @@ func Test_ngtMetrics_View(t *testing.T) { */ } - for _, test := range tests { + for _, tc := range tests { + test := tc t.Run(test.name, func(tt *testing.T) { tt.Parallel() - defer goleak.VerifyNone(tt) + defer goleak.VerifyNone(tt, goleak.IgnoreCurrent()) if test.beforeFunc != nil { test.beforeFunc() } @@ -433,8 +437,8 @@ func Test_ngtMetrics_View(t *testing.T) { ngt: test.fields.ngt, indexCount: test.fields.indexCount, uncommittedIndexCount: test.fields.uncommittedIndexCount, - insertVCacheCount: test.fields.insertVCacheCount, - deleteVCacheCount: test.fields.deleteVCacheCount, + insertVQueueCount: test.fields.insertVQueueCount, + deleteVQueueCount: test.fields.deleteVQueueCount, completedCreateIndexTotal: test.fields.completedCreateIndexTotal, executedProactiveGCTotal: test.fields.executedProactiveGCTotal, isIndexing: test.fields.isIndexing, diff --git a/internal/servers/server/server.go b/internal/servers/server/server.go index e6f6172d0b..cc079778ab 100644 --- a/internal/servers/server/server.go +++ b/internal/servers/server/server.go @@ -351,10 +351,9 @@ func (s *server) Shutdown(ctx context.Context) (rerr error) { } return nil })) - tctx, cancel := context.WithTimeout(ctx, s.pwt) - defer cancel() select { - case <-tctx.Done(): + case <-ctx.Done(): + case <-time.After(s.pwt): case err := <-ech: if err != nil { rerr = err @@ -362,9 +361,10 @@ func (s *server) Shutdown(ctx context.Context) (rerr error) { } } else { - tctx, cancel := context.WithTimeout(ctx, s.pwt) - defer cancel() - <-tctx.Done() + select { + case <-ctx.Done(): + case <-time.After(s.pwt): + } } if len(s.socketPath) != 0 { diff --git a/k8s/agent/configmap.yaml b/k8s/agent/configmap.yaml index a11b5e55eb..ec9afadbd3 100644 --- a/k8s/agent/configmap.yaml +++ b/k8s/agent/configmap.yaml @@ -229,3 +229,8 @@ data: min_load_index_timeout: 3m object_type: float search_edge_size: 10 + vqueue: + delete_buffer_pool_size: 5000 + delete_buffer_size: 100 + insert_buffer_pool_size: 10000 + insert_buffer_size: 100 diff --git a/k8s/metrics/grafana/dashboards/01-vald-agent.yaml b/k8s/metrics/grafana/dashboards/01-vald-agent.yaml index 583f95d199..289e686808 100644 --- a/k8s/metrics/grafana/dashboards/01-vald-agent.yaml +++ b/k8s/metrics/grafana/dashboards/01-vald-agent.yaml @@ -855,7 +855,7 @@ data: "pluginVersion": "7.3.4", "targets": [ { - "expr": "sum(vald_agent_core_ngt_insert_vcache_count{namespace=\"$Namespace\", app=~\"$ReplicaSet\", instance=~\"$PodName\"})", + "expr": "sum(vald_agent_core_ngt_insert_vqueue_count{namespace=\"$Namespace\", app=~\"$ReplicaSet\", instance=~\"$PodName\"})", "instant": true, "interval": "", "legendFormat": "", @@ -864,7 +864,7 @@ data: ], "timeFrom": null, "timeShift": null, - "title": "insert vcache", + "title": "insert vqueue", "type": "stat" }, { @@ -931,7 +931,7 @@ data: "pluginVersion": "7.3.4", "targets": [ { - "expr": "sum(vald_agent_core_ngt_delete_vcache_count{namespace=\"$Namespace\", app=~\"$ReplicaSet\", instance=~\"$PodName\"})", + "expr": "sum(vald_agent_core_ngt_delete_vqueue_count{namespace=\"$Namespace\", app=~\"$ReplicaSet\", instance=~\"$PodName\"})", "instant": true, "interval": "", "legendFormat": "", @@ -940,7 +940,7 @@ data: ], "timeFrom": null, "timeShift": null, - "title": "delete vcache", + "title": "delete vqueue", "type": "stat" }, { @@ -1286,15 +1286,15 @@ data: "refId": "A" }, { - "expr": " sum(vald_agent_core_ngt_insert_vcache_count{namespace=\"$Namespace\", app=~\"$ReplicaSet\", instance=~\"$PodName\"})", + "expr": " sum(vald_agent_core_ngt_insert_vqueue_count{namespace=\"$Namespace\", app=~\"$ReplicaSet\", instance=~\"$PodName\"})", "interval": "", - "legendFormat": "insert-vcache", + "legendFormat": "insert-vqueue", "refId": "B" }, { - "expr": "sum(vald_agent_core_ngt_delete_vcache_count{namespace=\"$Namespace\", app=~\"$ReplicaSet\", instance=~\"$PodName\"})", + "expr": "sum(vald_agent_core_ngt_delete_vqueue_count{namespace=\"$Namespace\", app=~\"$ReplicaSet\", instance=~\"$PodName\"})", "interval": "", - "legendFormat": "delete-vcache", + "legendFormat": "delete-vqueue", "refId": "C" } ], diff --git a/pkg/agent/core/ngt/handler/grpc/handler.go b/pkg/agent/core/ngt/handler/grpc/handler.go index 1742fcb90e..6de8f1c4c8 100644 --- a/pkg/agent/core/ngt/handler/grpc/handler.go +++ b/pkg/agent/core/ngt/handler/grpc/handler.go @@ -1175,7 +1175,7 @@ func (s *server) IndexInfo(ctx context.Context, _ *payload.Empty) (res *payload. }() return &payload.Info_Index_Count{ Stored: uint32(s.ngt.Len()), - Uncommitted: uint32(s.ngt.InsertVCacheLen()), + Uncommitted: uint32(s.ngt.InsertVQueueBufferLen() + s.ngt.DeleteVQueueBufferLen()), Indexing: s.ngt.IsIndexing(), }, nil } diff --git a/pkg/agent/core/ngt/handler/grpc/handler_test.go b/pkg/agent/core/ngt/handler/grpc/handler_test.go index 2afa9cee2a..b3d25d4aeb 100644 --- a/pkg/agent/core/ngt/handler/grpc/handler_test.go +++ b/pkg/agent/core/ngt/handler/grpc/handler_test.go @@ -431,8 +431,8 @@ func Test_server_Search(t *testing.T) { streamConcurrency int } type want struct { - want *payload.Search_Response - err error + wantRes *payload.Search_Response + err error } type test struct { name string @@ -443,12 +443,12 @@ func Test_server_Search(t *testing.T) { beforeFunc func(args) afterFunc func(args) } - defaultCheckFunc := func(w want, got *payload.Search_Response, err error) error { + defaultCheckFunc := func(w want, gotRes *payload.Search_Response, 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) + if !reflect.DeepEqual(gotRes, w.wantRes) { + return errors.Errorf("got: \"%#v\",\n\t\t\t\twant: \"%#v\"", gotRes, w.wantRes) } return nil } @@ -518,8 +518,8 @@ func Test_server_Search(t *testing.T) { streamConcurrency: test.fields.streamConcurrency, } - got, err := s.Search(test.args.ctx, test.args.req) - if err := test.checkFunc(test.want, got, err); err != nil { + gotRes, err := s.Search(test.args.ctx, test.args.req) + if err := test.checkFunc(test.want, gotRes, err); err != nil { tt.Errorf("error = %v", err) } }) @@ -540,8 +540,8 @@ func Test_server_SearchByID(t *testing.T) { streamConcurrency int } type want struct { - want *payload.Search_Response - err error + wantRes *payload.Search_Response + err error } type test struct { name string @@ -552,12 +552,12 @@ func Test_server_SearchByID(t *testing.T) { beforeFunc func(args) afterFunc func(args) } - defaultCheckFunc := func(w want, got *payload.Search_Response, err error) error { + defaultCheckFunc := func(w want, gotRes *payload.Search_Response, 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) + if !reflect.DeepEqual(gotRes, w.wantRes) { + return errors.Errorf("got: \"%#v\",\n\t\t\t\twant: \"%#v\"", gotRes, w.wantRes) } return nil } @@ -627,8 +627,8 @@ func Test_server_SearchByID(t *testing.T) { streamConcurrency: test.fields.streamConcurrency, } - got, err := s.SearchByID(test.args.ctx, test.args.req) - if err := test.checkFunc(test.want, got, err); err != nil { + gotRes, err := s.SearchByID(test.args.ctx, test.args.req) + if err := test.checkFunc(test.want, gotRes, err); err != nil { tt.Errorf("error = %v", err) } }) @@ -1791,8 +1791,8 @@ func Test_server_Upsert(t *testing.T) { streamConcurrency int } type want struct { - want *payload.Object_Location - err error + wantLoc *payload.Object_Location + err error } type test struct { name string @@ -1803,12 +1803,12 @@ func Test_server_Upsert(t *testing.T) { beforeFunc func(args) afterFunc func(args) } - defaultCheckFunc := func(w want, got *payload.Object_Location, err error) error { + defaultCheckFunc := func(w want, gotLoc *payload.Object_Location, 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) + if !reflect.DeepEqual(gotLoc, w.wantLoc) { + return errors.Errorf("got: \"%#v\",\n\t\t\t\twant: \"%#v\"", gotLoc, w.wantLoc) } return nil } @@ -1878,8 +1878,8 @@ func Test_server_Upsert(t *testing.T) { streamConcurrency: test.fields.streamConcurrency, } - got, err := s.Upsert(test.args.ctx, test.args.req) - if err := test.checkFunc(test.want, got, err); err != nil { + gotLoc, err := s.Upsert(test.args.ctx, test.args.req) + if err := test.checkFunc(test.want, gotLoc, err); err != nil { tt.Errorf("error = %v", err) } }) diff --git a/pkg/agent/core/ngt/service/ngt.go b/pkg/agent/core/ngt/service/ngt.go index dfcc4579cb..af01a9504d 100644 --- a/pkg/agent/core/ngt/service/ngt.go +++ b/pkg/agent/core/ngt/service/ngt.go @@ -39,6 +39,7 @@ import ( "github.com/vdaas/vald/internal/safety" "github.com/vdaas/vald/pkg/agent/core/ngt/model" "github.com/vdaas/vald/pkg/agent/core/ngt/service/kvs" + "github.com/vdaas/vald/pkg/agent/core/ngt/service/vqueue" "github.com/vdaas/vald/pkg/agent/internal/metadata" ) @@ -63,9 +64,10 @@ type NGT interface { NumberOfCreateIndexExecution() uint64 NumberOfProactiveGCExecution() uint64 UUIDs(context.Context) (uuids []string) - UncommittedUUIDs() (uuids []string) - DeleteVCacheLen() uint64 - InsertVCacheLen() uint64 + DeleteVQueueBufferLen() uint64 + InsertVQueueBufferLen() uint64 + DeleteVQueueChannelLen() uint64 + InsertVQueueChannelLen() uint64 Close(ctx context.Context) error } @@ -74,8 +76,7 @@ type ngt struct { core core.NGT eg errgroup.Group kvs kvs.BidiMap - ivc *vcaches // insertion vector cache - dvc *vcaches // deletion vector cache + vq vqueue.Queue // statuses indexing atomic.Value @@ -83,7 +84,6 @@ type ngt struct { lastNoice uint64 // last number of create index execution this value prevent unnecessary saveindex. // counters - ic uint64 // insert count nocie uint64 // number of create index execution nogce uint64 // number of proactive GC execution @@ -112,11 +112,6 @@ type ngt struct { dcd bool // disable commit daemon } -type vcache struct { - vector []float32 - date int64 -} - const ( kvsFileName = "ngt-meta.kvsdb" ) @@ -152,11 +147,17 @@ func New(cfg *config.NGT, opts ...Option) (nn NGT, err error) { if n.dur == 0 || n.alen == 0 { n.dcd = true } - if n.ivc == nil { - n.ivc = new(vcaches) - } - if n.dvc == nil { - n.dvc = new(vcaches) + if n.vq == nil { + n.vq, err = vqueue.New( + vqueue.WithErrGroup(n.eg), + vqueue.WithInsertBufferSize(cfg.VQueue.InsertBufferSize), + vqueue.WithDeleteBufferSize(cfg.VQueue.DeleteBufferSize), + vqueue.WithInsertBufferPoolSize(cfg.VQueue.InsertBufferPoolSize), + vqueue.WithDeleteBufferPoolSize(cfg.VQueue.DeleteBufferPoolSize), + ) + if err != nil { + return nil, err + } } n.indexing.Store(false) @@ -312,6 +313,10 @@ func (n *ngt) Start(ctx context.Context) <-chan error { } ech := make(chan error, 2) n.eg.Go(safety.RecoverFunc(func() (err error) { + vqech, err := n.vq.Start(ctx) + if err != nil { + return err + } if n.sdur == 0 { n.sdur = n.dur + time.Second } @@ -346,13 +351,18 @@ func (n *ngt) Start(ctx context.Context) <-chan error { } return ctx.Err() case <-tick.C: - if int(atomic.LoadUint64(&n.ic)) >= n.alen { + if n.vq.IVQLen() >= n.alen { err = n.CreateIndex(ctx, n.poolSize) } case <-limit.C: err = n.CreateAndSaveIndex(ctx, n.poolSize) case <-sTick.C: err = n.SaveIndex(ctx) + case err := <-vqech: + if err != nil { + ech <- err + err = nil + } } if err != nil && err != errors.ErrUncommittedIndexNotFound { ech <- err @@ -361,7 +371,6 @@ func (n *ngt) Start(ctx context.Context) <-chan error { } } })) - return ech } @@ -386,6 +395,8 @@ func (n *ngt) Search(vec []float32, size uint32, epsilon, radius float32) ([]mod ID: key, Distance: d.Distance, }) + } else { + log.Warn("not found", d.ID, d.Distance) } } @@ -421,18 +432,8 @@ func (n *ngt) insert(uuid string, vec []float32, t int64, validation bool) (err err = errors.ErrUUIDAlreadyExists(uuid, uint(id)) return err } - _, ok = n.insertCache(uuid) - if ok { - err = errors.ErrUUIDAlreadyExists(uuid, uint(id)) - return err - } } - n.ivc.Store(uuid, vcache{ - vector: vec, - date: t, - }) - atomic.AddUint64(&n.ic, 1) - return nil + return n.vq.PushInsert(uuid, vec, t) } func (n *ngt) InsertMultiple(vecs map[string][]float32) (err error) { @@ -474,26 +475,9 @@ func (n *ngt) UpdateMultiple(vecs map[string][]float32) (err error) { } err = n.DeleteMultiple(uuids...) if err != nil { - for _, uuid := range uuids { - n.dvc.Delete(uuid) - } return err } - t := time.Now().UnixNano() - for uuid, vec := range vecs { - ierr := n.insert(uuid, vec, t, false) - if ierr != nil { - n.dvc.Delete(uuid) - n.ivc.Delete(uuid) - atomic.AddUint64(&n.ic, ^uint64(0)) - if err != nil { - err = errors.Wrap(ierr, err.Error()) - } else { - err = ierr - } - } - } - return err + return n.InsertMultiple(vecs) } func (n *ngt) Delete(uuid string) (err error) { @@ -507,20 +491,9 @@ func (n *ngt) delete(uuid string, t int64) (err error) { } _, ok := n.kvs.Get(uuid) if !ok { - _, ok := n.insertCache(uuid) - if !ok { - err = errors.ErrObjectIDNotFound(uuid) - return err - } - } - if vc, ok := n.ivc.Load(uuid); ok && vc.date < t { - n.ivc.Delete(uuid) - atomic.AddUint64(&n.ic, ^uint64(0)) + return errors.ErrObjectIDNotFound(uuid) } - n.dvc.Store(uuid, vcache{ - date: t, - }) - return nil + return n.vq.PushDelete(uuid, t) } func (n *ngt) DeleteMultiple(uuids ...string) (err error) { @@ -541,13 +514,13 @@ func (n *ngt) DeleteMultiple(uuids ...string) (err error) { func (n *ngt) GetObject(uuid string) (vec []float32, err error) { oid, ok := n.kvs.Get(uuid) if !ok { - log.Debugf("GetObject\tuuid: %s's kvs data not found, trying to read from vcache", uuid) - ivc, ok := n.insertCache(uuid) + log.Debugf("GetObject\tuuid: %s's kvs data not found, trying to read from vqueue", uuid) + vec, ok := n.vq.GetVector(uuid) if !ok { - log.Debugf("GetObject\tuuid: %s's vcache data not found", uuid) + log.Debugf("GetObject\tuuid: %s's vqueue data not found", uuid) return nil, errors.ErrObjectIDNotFound(uuid) } - return ivc.vector, nil + return vec, nil } log.Debugf("GetObject\tGetVector oid: %d", oid) vec, err = n.core.GetVector(uint(oid)) @@ -569,89 +542,46 @@ func (n *ngt) CreateIndex(ctx context.Context, poolSize uint32) (err error) { if n.IsIndexing() || n.IsSaving() { return nil } - ic := atomic.LoadUint64(&n.ic) + ic := n.vq.IVQLen() + n.vq.DVQLen() if ic == 0 { return errors.ErrUncommittedIndexNotFound } n.indexing.Store(true) - atomic.StoreUint64(&n.ic, 0) - t := time.Now().UnixNano() defer n.indexing.Store(false) defer n.gc() log.Infof("create index operation started, uncommitted indexes = %d", ic) - delList := make([]string, 0, ic) - n.dvc.Range(func(uuid string, dvc vcache) bool { - if dvc.date > t { - return true - } - if ivc, ok := n.ivc.Load(uuid); ok && ivc.date < t && ivc.date < dvc.date { - n.ivc.Delete(uuid) + log.Info("create index delete phase started") + n.vq.RangePopDelete(ctx, func(uuid string) bool { + var ierr error + oid, ok := n.kvs.Delete(uuid) + if ok { + ierr = n.core.Remove(uint(oid)) + if ierr != nil { + log.Error(ierr) + err = errors.Wrap(err, ierr.Error()) + } + } else { + ierr = errors.ErrObjectIDNotFound(uuid) + log.Error(ierr) + err = errors.Wrap(err, ierr.Error()) } - delList = append(delList, uuid) return true }) - log.Info("create index delete kvs phase started") - log.Debugf("deleting kvs: %#v", delList) - doids := make([]uint, 0, ic) - for _, duuid := range delList { - n.dvc.Delete(duuid) - id, ok := n.kvs.Delete(duuid) - if !ok { - log.Error(errors.ErrObjectIDNotFound(duuid).Error()) - err = errors.Wrap(err, errors.ErrObjectIDNotFound(duuid).Error()) + log.Info("create index delete phase finished") + n.gc() + log.Info("create index insert phase started") + n.vq.RangePopInsert(ctx, func(uuid string, vector []float32) bool { + oid, ierr := n.core.Insert(vector) + if ierr != nil { + log.Error(ierr) + err = errors.Wrap(err, ierr.Error()) } else { - doids = append(doids, uint(id)) - } - } - log.Info("create index delete kvs phase finished") - - log.Info("create index delete index phase started") - log.Debugf("deleting index: %#v", doids) - brerr := n.core.BulkRemove(doids...) - log.Info("create index delete index phase finished") - if brerr != nil { - log.Error("an error occurred on deleting index phase:", brerr) - err = errors.Wrap(err, brerr.Error()) - } - uuids := make([]string, 0, ic) - vecs := make([][]float32, 0, ic) - n.ivc.Range(func(uuid string, ivc vcache) bool { - if ivc.date <= t { - uuids = append(uuids, uuid) - vecs = append(vecs, ivc.vector) + n.kvs.Set(uuid, uint32(oid)) } return true }) - for _, uuid := range uuids { - n.ivc.Delete(uuid) - } - n.gc() - log.Info("create index insert index phase started") - log.Debugf("inserting index: %#v", vecs) - oids, errs := n.core.BulkInsert(vecs) - log.Info("create index insert index phase finished") - if errs != nil && len(errs) != 0 { - for _, bierr := range errs { - if bierr != nil { - log.Error("an error occurred on inserting index phase:", bierr) - err = errors.Wrap(err, bierr.Error()) - } - } - } - - log.Info("create index insert kvs phase started") - log.Debugf("uuids = %#v\t\toids = %#v", uuids, oids) - for i, uuid := range uuids { - if len(oids) > i { - oid := uint32(oids[i]) - if oid != 0 { - n.kvs.Set(uuid, oid) - } - } - } - log.Info("create index insert kvs phase finished") - + log.Info("create index insert phase finished") log.Info("create graph and tree phase started") log.Debugf("pool size = %d", poolSize) cierr := n.core.CreateIndex(poolSize) @@ -766,7 +696,7 @@ func (n *ngt) CreateAndSaveIndex(ctx context.Context, poolSize uint32) (err erro func (n *ngt) Exists(uuid string) (oid uint32, ok bool) { oid, ok = n.kvs.Get(uuid) if !ok { - _, ok = n.insertCache(uuid) + _, ok = n.vq.GetVector(uuid) } return oid, ok } @@ -790,22 +720,6 @@ func (n *ngt) readyForUpdate(uuid string, vec []float32) (ready bool) { return false } -func (n *ngt) insertCache(uuid string) (*vcache, bool) { - iv, ok := n.ivc.Load(uuid) - if ok { - dv, ok := n.dvc.Load(uuid) - if !ok { - return &iv, true - } - if ok && dv.date <= iv.date { - return &iv, true - } - n.ivc.Delete(uuid) - atomic.AddUint64(&n.ic, ^uint64(0)) - } - return nil, false -} - func (n *ngt) IsSaving() bool { s, ok := n.saving.Load().(bool) return s && ok @@ -825,18 +739,6 @@ func (n *ngt) UUIDs(ctx context.Context) (uuids []string) { return uuids } -func (n *ngt) UncommittedUUIDs() (uuids []string) { - var mu sync.Mutex - uuids = make([]string, 0, atomic.LoadUint64(&n.ic)) - n.ivc.Range(func(uuid string, vc vcache) bool { - mu.Lock() - uuids = append(uuids, uuid) - mu.Unlock() - return true - }) - return uuids -} - func (n *ngt) NumberOfCreateIndexExecution() uint64 { return atomic.LoadUint64(&n.nocie) } @@ -856,12 +758,20 @@ func (n *ngt) Len() uint64 { return n.kvs.Len() } -func (n *ngt) InsertVCacheLen() uint64 { - return n.ivc.Len() +func (n *ngt) InsertVQueueBufferLen() uint64 { + return uint64(n.vq.IVQLen()) +} + +func (n *ngt) DeleteVQueueBufferLen() uint64 { + return uint64(n.vq.DVQLen()) +} + +func (n *ngt) InsertVQueueChannelLen() uint64 { + return uint64(n.vq.IVCLen()) } -func (n *ngt) DeleteVCacheLen() uint64 { - return n.dvc.Len() +func (n *ngt) DeleteVQueueChannelLen() uint64 { + return uint64(n.vq.DVCLen()) } func (n *ngt) Close(ctx context.Context) (err error) { diff --git a/pkg/agent/core/ngt/service/ngt_test.go b/pkg/agent/core/ngt/service/ngt_test.go index a97defb030..e66cad0c05 100644 --- a/pkg/agent/core/ngt/service/ngt_test.go +++ b/pkg/agent/core/ngt/service/ngt_test.go @@ -30,6 +30,7 @@ import ( "github.com/vdaas/vald/internal/errors" "github.com/vdaas/vald/pkg/agent/core/ngt/model" "github.com/vdaas/vald/pkg/agent/core/ngt/service/kvs" + "github.com/vdaas/vald/pkg/agent/core/ngt/service/vqueue" "go.uber.org/goleak" ) @@ -122,12 +123,10 @@ func Test_ngt_initNGT(t *testing.T) { core core.NGT eg errgroup.Group kvs kvs.BidiMap - ivc *vcaches - dvc *vcaches + vq vqueue.Queue indexing atomic.Value saving atomic.Value lastNoice uint64 - ic uint64 nocie uint64 nogce uint64 inMem bool @@ -176,12 +175,10 @@ func Test_ngt_initNGT(t *testing.T) { core: nil, eg: nil, kvs: nil, - ivc: vcaches{}, - dvc: vcaches{}, + vq: nil, indexing: nil, saving: nil, lastNoice: 0, - ic: 0, nocie: 0, nogce: 0, inMem: false, @@ -217,12 +214,10 @@ func Test_ngt_initNGT(t *testing.T) { core: nil, eg: nil, kvs: nil, - ivc: vcaches{}, - dvc: vcaches{}, + vq: nil, indexing: nil, saving: nil, lastNoice: 0, - ic: 0, nocie: 0, nogce: 0, inMem: false, @@ -266,12 +261,10 @@ func Test_ngt_initNGT(t *testing.T) { core: test.fields.core, eg: test.fields.eg, kvs: test.fields.kvs, - ivc: test.fields.ivc, - dvc: test.fields.dvc, + vq: test.fields.vq, indexing: test.fields.indexing, saving: test.fields.saving, lastNoice: test.fields.lastNoice, - ic: test.fields.ic, nocie: test.fields.nocie, nogce: test.fields.nogce, inMem: test.fields.inMem, @@ -305,12 +298,10 @@ func Test_ngt_loadKVS(t *testing.T) { core core.NGT eg errgroup.Group kvs kvs.BidiMap - ivc *vcaches - dvc *vcaches + vq vqueue.Queue indexing atomic.Value saving atomic.Value lastNoice uint64 - ic uint64 nocie uint64 nogce uint64 inMem bool @@ -355,12 +346,10 @@ func Test_ngt_loadKVS(t *testing.T) { core: nil, eg: nil, kvs: nil, - ivc: vcaches{}, - dvc: vcaches{}, + vq: nil, indexing: nil, saving: nil, lastNoice: 0, - ic: 0, nocie: 0, nogce: 0, inMem: false, @@ -393,12 +382,10 @@ func Test_ngt_loadKVS(t *testing.T) { core: nil, eg: nil, kvs: nil, - ivc: vcaches{}, - dvc: vcaches{}, + vq: nil, indexing: nil, saving: nil, lastNoice: 0, - ic: 0, nocie: 0, nogce: 0, inMem: false, @@ -442,12 +429,10 @@ func Test_ngt_loadKVS(t *testing.T) { core: test.fields.core, eg: test.fields.eg, kvs: test.fields.kvs, - ivc: test.fields.ivc, - dvc: test.fields.dvc, + vq: test.fields.vq, indexing: test.fields.indexing, saving: test.fields.saving, lastNoice: test.fields.lastNoice, - ic: test.fields.ic, nocie: test.fields.nocie, nogce: test.fields.nogce, inMem: test.fields.inMem, @@ -484,12 +469,10 @@ func Test_ngt_Start(t *testing.T) { core core.NGT eg errgroup.Group kvs kvs.BidiMap - ivc *vcaches - dvc *vcaches + vq vqueue.Queue indexing atomic.Value saving atomic.Value lastNoice uint64 - ic uint64 nocie uint64 nogce uint64 inMem bool @@ -538,12 +521,10 @@ func Test_ngt_Start(t *testing.T) { core: nil, eg: nil, kvs: nil, - ivc: vcaches{}, - dvc: vcaches{}, + vq: nil, indexing: nil, saving: nil, lastNoice: 0, - ic: 0, nocie: 0, nogce: 0, inMem: false, @@ -579,12 +560,10 @@ func Test_ngt_Start(t *testing.T) { core: nil, eg: nil, kvs: nil, - ivc: vcaches{}, - dvc: vcaches{}, + vq: nil, indexing: nil, saving: nil, lastNoice: 0, - ic: 0, nocie: 0, nogce: 0, inMem: false, @@ -628,12 +607,10 @@ func Test_ngt_Start(t *testing.T) { core: test.fields.core, eg: test.fields.eg, kvs: test.fields.kvs, - ivc: test.fields.ivc, - dvc: test.fields.dvc, + vq: test.fields.vq, indexing: test.fields.indexing, saving: test.fields.saving, lastNoice: test.fields.lastNoice, - ic: test.fields.ic, nocie: test.fields.nocie, nogce: test.fields.nogce, inMem: test.fields.inMem, @@ -673,12 +650,10 @@ func Test_ngt_Search(t *testing.T) { core core.NGT eg errgroup.Group kvs kvs.BidiMap - ivc *vcaches - dvc *vcaches + vq vqueue.Queue indexing atomic.Value saving atomic.Value lastNoice uint64 - ic uint64 nocie uint64 nogce uint64 inMem bool @@ -734,12 +709,10 @@ func Test_ngt_Search(t *testing.T) { core: nil, eg: nil, kvs: nil, - ivc: vcaches{}, - dvc: vcaches{}, + vq: nil, indexing: nil, saving: nil, lastNoice: 0, - ic: 0, nocie: 0, nogce: 0, inMem: false, @@ -778,12 +751,10 @@ func Test_ngt_Search(t *testing.T) { core: nil, eg: nil, kvs: nil, - ivc: vcaches{}, - dvc: vcaches{}, + vq: nil, indexing: nil, saving: nil, lastNoice: 0, - ic: 0, nocie: 0, nogce: 0, inMem: false, @@ -827,12 +798,10 @@ func Test_ngt_Search(t *testing.T) { core: test.fields.core, eg: test.fields.eg, kvs: test.fields.kvs, - ivc: test.fields.ivc, - dvc: test.fields.dvc, + vq: test.fields.vq, indexing: test.fields.indexing, saving: test.fields.saving, lastNoice: test.fields.lastNoice, - ic: test.fields.ic, nocie: test.fields.nocie, nogce: test.fields.nogce, inMem: test.fields.inMem, @@ -872,12 +841,10 @@ func Test_ngt_SearchByID(t *testing.T) { core core.NGT eg errgroup.Group kvs kvs.BidiMap - ivc *vcaches - dvc *vcaches + vq vqueue.Queue indexing atomic.Value saving atomic.Value lastNoice uint64 - ic uint64 nocie uint64 nogce uint64 inMem bool @@ -933,12 +900,10 @@ func Test_ngt_SearchByID(t *testing.T) { core: nil, eg: nil, kvs: nil, - ivc: vcaches{}, - dvc: vcaches{}, + vq: nil, indexing: nil, saving: nil, lastNoice: 0, - ic: 0, nocie: 0, nogce: 0, inMem: false, @@ -977,12 +942,10 @@ func Test_ngt_SearchByID(t *testing.T) { core: nil, eg: nil, kvs: nil, - ivc: vcaches{}, - dvc: vcaches{}, + vq: nil, indexing: nil, saving: nil, lastNoice: 0, - ic: 0, nocie: 0, nogce: 0, inMem: false, @@ -1026,12 +989,10 @@ func Test_ngt_SearchByID(t *testing.T) { core: test.fields.core, eg: test.fields.eg, kvs: test.fields.kvs, - ivc: test.fields.ivc, - dvc: test.fields.dvc, + vq: test.fields.vq, indexing: test.fields.indexing, saving: test.fields.saving, lastNoice: test.fields.lastNoice, - ic: test.fields.ic, nocie: test.fields.nocie, nogce: test.fields.nogce, inMem: test.fields.inMem, @@ -1069,12 +1030,10 @@ func Test_ngt_Insert(t *testing.T) { core core.NGT eg errgroup.Group kvs kvs.BidiMap - ivc *vcaches - dvc *vcaches + vq vqueue.Queue indexing atomic.Value saving atomic.Value lastNoice uint64 - ic uint64 nocie uint64 nogce uint64 inMem bool @@ -1124,12 +1083,10 @@ func Test_ngt_Insert(t *testing.T) { core: nil, eg: nil, kvs: nil, - ivc: vcaches{}, - dvc: vcaches{}, + vq: nil, indexing: nil, saving: nil, lastNoice: 0, - ic: 0, nocie: 0, nogce: 0, inMem: false, @@ -1166,12 +1123,10 @@ func Test_ngt_Insert(t *testing.T) { core: nil, eg: nil, kvs: nil, - ivc: vcaches{}, - dvc: vcaches{}, + vq: nil, indexing: nil, saving: nil, lastNoice: 0, - ic: 0, nocie: 0, nogce: 0, inMem: false, @@ -1215,12 +1170,10 @@ func Test_ngt_Insert(t *testing.T) { core: test.fields.core, eg: test.fields.eg, kvs: test.fields.kvs, - ivc: test.fields.ivc, - dvc: test.fields.dvc, + vq: test.fields.vq, indexing: test.fields.indexing, saving: test.fields.saving, lastNoice: test.fields.lastNoice, - ic: test.fields.ic, nocie: test.fields.nocie, nogce: test.fields.nogce, inMem: test.fields.inMem, @@ -1260,12 +1213,10 @@ func Test_ngt_insert(t *testing.T) { core core.NGT eg errgroup.Group kvs kvs.BidiMap - ivc *vcaches - dvc *vcaches + vq vqueue.Queue indexing atomic.Value saving atomic.Value lastNoice uint64 - ic uint64 nocie uint64 nogce uint64 inMem bool @@ -1317,12 +1268,10 @@ func Test_ngt_insert(t *testing.T) { core: nil, eg: nil, kvs: nil, - ivc: vcaches{}, - dvc: vcaches{}, + vq: nil, indexing: nil, saving: nil, lastNoice: 0, - ic: 0, nocie: 0, nogce: 0, inMem: false, @@ -1361,12 +1310,10 @@ func Test_ngt_insert(t *testing.T) { core: nil, eg: nil, kvs: nil, - ivc: vcaches{}, - dvc: vcaches{}, + vq: nil, indexing: nil, saving: nil, lastNoice: 0, - ic: 0, nocie: 0, nogce: 0, inMem: false, @@ -1410,12 +1357,10 @@ func Test_ngt_insert(t *testing.T) { core: test.fields.core, eg: test.fields.eg, kvs: test.fields.kvs, - ivc: test.fields.ivc, - dvc: test.fields.dvc, + vq: test.fields.vq, indexing: test.fields.indexing, saving: test.fields.saving, lastNoice: test.fields.lastNoice, - ic: test.fields.ic, nocie: test.fields.nocie, nogce: test.fields.nogce, inMem: test.fields.inMem, @@ -1452,12 +1397,10 @@ func Test_ngt_InsertMultiple(t *testing.T) { core core.NGT eg errgroup.Group kvs kvs.BidiMap - ivc *vcaches - dvc *vcaches + vq vqueue.Queue indexing atomic.Value saving atomic.Value lastNoice uint64 - ic uint64 nocie uint64 nogce uint64 inMem bool @@ -1506,12 +1449,10 @@ func Test_ngt_InsertMultiple(t *testing.T) { core: nil, eg: nil, kvs: nil, - ivc: vcaches{}, - dvc: vcaches{}, + vq: nil, indexing: nil, saving: nil, lastNoice: 0, - ic: 0, nocie: 0, nogce: 0, inMem: false, @@ -1547,12 +1488,10 @@ func Test_ngt_InsertMultiple(t *testing.T) { core: nil, eg: nil, kvs: nil, - ivc: vcaches{}, - dvc: vcaches{}, + vq: nil, indexing: nil, saving: nil, lastNoice: 0, - ic: 0, nocie: 0, nogce: 0, inMem: false, @@ -1596,12 +1535,10 @@ func Test_ngt_InsertMultiple(t *testing.T) { core: test.fields.core, eg: test.fields.eg, kvs: test.fields.kvs, - ivc: test.fields.ivc, - dvc: test.fields.dvc, + vq: test.fields.vq, indexing: test.fields.indexing, saving: test.fields.saving, lastNoice: test.fields.lastNoice, - ic: test.fields.ic, nocie: test.fields.nocie, nogce: test.fields.nogce, inMem: test.fields.inMem, @@ -1639,12 +1576,10 @@ func Test_ngt_Update(t *testing.T) { core core.NGT eg errgroup.Group kvs kvs.BidiMap - ivc *vcaches - dvc *vcaches + vq vqueue.Queue indexing atomic.Value saving atomic.Value lastNoice uint64 - ic uint64 nocie uint64 nogce uint64 inMem bool @@ -1694,12 +1629,10 @@ func Test_ngt_Update(t *testing.T) { core: nil, eg: nil, kvs: nil, - ivc: vcaches{}, - dvc: vcaches{}, + vq: nil, indexing: nil, saving: nil, lastNoice: 0, - ic: 0, nocie: 0, nogce: 0, inMem: false, @@ -1736,12 +1669,10 @@ func Test_ngt_Update(t *testing.T) { core: nil, eg: nil, kvs: nil, - ivc: vcaches{}, - dvc: vcaches{}, + vq: nil, indexing: nil, saving: nil, lastNoice: 0, - ic: 0, nocie: 0, nogce: 0, inMem: false, @@ -1785,12 +1716,10 @@ func Test_ngt_Update(t *testing.T) { core: test.fields.core, eg: test.fields.eg, kvs: test.fields.kvs, - ivc: test.fields.ivc, - dvc: test.fields.dvc, + vq: test.fields.vq, indexing: test.fields.indexing, saving: test.fields.saving, lastNoice: test.fields.lastNoice, - ic: test.fields.ic, nocie: test.fields.nocie, nogce: test.fields.nogce, inMem: test.fields.inMem, @@ -1827,12 +1756,10 @@ func Test_ngt_UpdateMultiple(t *testing.T) { core core.NGT eg errgroup.Group kvs kvs.BidiMap - ivc *vcaches - dvc *vcaches + vq vqueue.Queue indexing atomic.Value saving atomic.Value lastNoice uint64 - ic uint64 nocie uint64 nogce uint64 inMem bool @@ -1881,12 +1808,10 @@ func Test_ngt_UpdateMultiple(t *testing.T) { core: nil, eg: nil, kvs: nil, - ivc: vcaches{}, - dvc: vcaches{}, + vq: nil, indexing: nil, saving: nil, lastNoice: 0, - ic: 0, nocie: 0, nogce: 0, inMem: false, @@ -1922,12 +1847,10 @@ func Test_ngt_UpdateMultiple(t *testing.T) { core: nil, eg: nil, kvs: nil, - ivc: vcaches{}, - dvc: vcaches{}, + vq: nil, indexing: nil, saving: nil, lastNoice: 0, - ic: 0, nocie: 0, nogce: 0, inMem: false, @@ -1971,12 +1894,10 @@ func Test_ngt_UpdateMultiple(t *testing.T) { core: test.fields.core, eg: test.fields.eg, kvs: test.fields.kvs, - ivc: test.fields.ivc, - dvc: test.fields.dvc, + vq: test.fields.vq, indexing: test.fields.indexing, saving: test.fields.saving, lastNoice: test.fields.lastNoice, - ic: test.fields.ic, nocie: test.fields.nocie, nogce: test.fields.nogce, inMem: test.fields.inMem, @@ -2013,12 +1934,10 @@ func Test_ngt_Delete(t *testing.T) { core core.NGT eg errgroup.Group kvs kvs.BidiMap - ivc *vcaches - dvc *vcaches + vq vqueue.Queue indexing atomic.Value saving atomic.Value lastNoice uint64 - ic uint64 nocie uint64 nogce uint64 inMem bool @@ -2067,12 +1986,10 @@ func Test_ngt_Delete(t *testing.T) { core: nil, eg: nil, kvs: nil, - ivc: vcaches{}, - dvc: vcaches{}, + vq: nil, indexing: nil, saving: nil, lastNoice: 0, - ic: 0, nocie: 0, nogce: 0, inMem: false, @@ -2108,12 +2025,10 @@ func Test_ngt_Delete(t *testing.T) { core: nil, eg: nil, kvs: nil, - ivc: vcaches{}, - dvc: vcaches{}, + vq: nil, indexing: nil, saving: nil, lastNoice: 0, - ic: 0, nocie: 0, nogce: 0, inMem: false, @@ -2157,12 +2072,10 @@ func Test_ngt_Delete(t *testing.T) { core: test.fields.core, eg: test.fields.eg, kvs: test.fields.kvs, - ivc: test.fields.ivc, - dvc: test.fields.dvc, + vq: test.fields.vq, indexing: test.fields.indexing, saving: test.fields.saving, lastNoice: test.fields.lastNoice, - ic: test.fields.ic, nocie: test.fields.nocie, nogce: test.fields.nogce, inMem: test.fields.inMem, @@ -2200,12 +2113,10 @@ func Test_ngt_delete(t *testing.T) { core core.NGT eg errgroup.Group kvs kvs.BidiMap - ivc *vcaches - dvc *vcaches + vq vqueue.Queue indexing atomic.Value saving atomic.Value lastNoice uint64 - ic uint64 nocie uint64 nogce uint64 inMem bool @@ -2255,12 +2166,10 @@ func Test_ngt_delete(t *testing.T) { core: nil, eg: nil, kvs: nil, - ivc: vcaches{}, - dvc: vcaches{}, + vq: nil, indexing: nil, saving: nil, lastNoice: 0, - ic: 0, nocie: 0, nogce: 0, inMem: false, @@ -2297,12 +2206,10 @@ func Test_ngt_delete(t *testing.T) { core: nil, eg: nil, kvs: nil, - ivc: vcaches{}, - dvc: vcaches{}, + vq: nil, indexing: nil, saving: nil, lastNoice: 0, - ic: 0, nocie: 0, nogce: 0, inMem: false, @@ -2346,12 +2253,10 @@ func Test_ngt_delete(t *testing.T) { core: test.fields.core, eg: test.fields.eg, kvs: test.fields.kvs, - ivc: test.fields.ivc, - dvc: test.fields.dvc, + vq: test.fields.vq, indexing: test.fields.indexing, saving: test.fields.saving, lastNoice: test.fields.lastNoice, - ic: test.fields.ic, nocie: test.fields.nocie, nogce: test.fields.nogce, inMem: test.fields.inMem, @@ -2388,12 +2293,10 @@ func Test_ngt_DeleteMultiple(t *testing.T) { core core.NGT eg errgroup.Group kvs kvs.BidiMap - ivc *vcaches - dvc *vcaches + vq vqueue.Queue indexing atomic.Value saving atomic.Value lastNoice uint64 - ic uint64 nocie uint64 nogce uint64 inMem bool @@ -2442,12 +2345,10 @@ func Test_ngt_DeleteMultiple(t *testing.T) { core: nil, eg: nil, kvs: nil, - ivc: vcaches{}, - dvc: vcaches{}, + vq: nil, indexing: nil, saving: nil, lastNoice: 0, - ic: 0, nocie: 0, nogce: 0, inMem: false, @@ -2483,12 +2384,10 @@ func Test_ngt_DeleteMultiple(t *testing.T) { core: nil, eg: nil, kvs: nil, - ivc: vcaches{}, - dvc: vcaches{}, + vq: nil, indexing: nil, saving: nil, lastNoice: 0, - ic: 0, nocie: 0, nogce: 0, inMem: false, @@ -2532,12 +2431,10 @@ func Test_ngt_DeleteMultiple(t *testing.T) { core: test.fields.core, eg: test.fields.eg, kvs: test.fields.kvs, - ivc: test.fields.ivc, - dvc: test.fields.dvc, + vq: test.fields.vq, indexing: test.fields.indexing, saving: test.fields.saving, lastNoice: test.fields.lastNoice, - ic: test.fields.ic, nocie: test.fields.nocie, nogce: test.fields.nogce, inMem: test.fields.inMem, @@ -2574,12 +2471,10 @@ func Test_ngt_GetObject(t *testing.T) { core core.NGT eg errgroup.Group kvs kvs.BidiMap - ivc *vcaches - dvc *vcaches + vq vqueue.Queue indexing atomic.Value saving atomic.Value lastNoice uint64 - ic uint64 nocie uint64 nogce uint64 inMem bool @@ -2632,12 +2527,10 @@ func Test_ngt_GetObject(t *testing.T) { core: nil, eg: nil, kvs: nil, - ivc: vcaches{}, - dvc: vcaches{}, + vq: nil, indexing: nil, saving: nil, lastNoice: 0, - ic: 0, nocie: 0, nogce: 0, inMem: false, @@ -2673,12 +2566,10 @@ func Test_ngt_GetObject(t *testing.T) { core: nil, eg: nil, kvs: nil, - ivc: vcaches{}, - dvc: vcaches{}, + vq: nil, indexing: nil, saving: nil, lastNoice: 0, - ic: 0, nocie: 0, nogce: 0, inMem: false, @@ -2722,12 +2613,10 @@ func Test_ngt_GetObject(t *testing.T) { core: test.fields.core, eg: test.fields.eg, kvs: test.fields.kvs, - ivc: test.fields.ivc, - dvc: test.fields.dvc, + vq: test.fields.vq, indexing: test.fields.indexing, saving: test.fields.saving, lastNoice: test.fields.lastNoice, - ic: test.fields.ic, nocie: test.fields.nocie, nogce: test.fields.nogce, inMem: test.fields.inMem, @@ -2765,12 +2654,10 @@ func Test_ngt_CreateIndex(t *testing.T) { core core.NGT eg errgroup.Group kvs kvs.BidiMap - ivc *vcaches - dvc *vcaches + vq vqueue.Queue indexing atomic.Value saving atomic.Value lastNoice uint64 - ic uint64 nocie uint64 nogce uint64 inMem bool @@ -2820,12 +2707,10 @@ func Test_ngt_CreateIndex(t *testing.T) { core: nil, eg: nil, kvs: nil, - ivc: vcaches{}, - dvc: vcaches{}, + vq: nil, indexing: nil, saving: nil, lastNoice: 0, - ic: 0, nocie: 0, nogce: 0, inMem: false, @@ -2862,12 +2747,10 @@ func Test_ngt_CreateIndex(t *testing.T) { core: nil, eg: nil, kvs: nil, - ivc: vcaches{}, - dvc: vcaches{}, + vq: nil, indexing: nil, saving: nil, lastNoice: 0, - ic: 0, nocie: 0, nogce: 0, inMem: false, @@ -2911,12 +2794,10 @@ func Test_ngt_CreateIndex(t *testing.T) { core: test.fields.core, eg: test.fields.eg, kvs: test.fields.kvs, - ivc: test.fields.ivc, - dvc: test.fields.dvc, + vq: test.fields.vq, indexing: test.fields.indexing, saving: test.fields.saving, lastNoice: test.fields.lastNoice, - ic: test.fields.ic, nocie: test.fields.nocie, nogce: test.fields.nogce, inMem: test.fields.inMem, @@ -2953,12 +2834,10 @@ func Test_ngt_SaveIndex(t *testing.T) { core core.NGT eg errgroup.Group kvs kvs.BidiMap - ivc *vcaches - dvc *vcaches + vq vqueue.Queue indexing atomic.Value saving atomic.Value lastNoice uint64 - ic uint64 nocie uint64 nogce uint64 inMem bool @@ -3007,12 +2886,10 @@ func Test_ngt_SaveIndex(t *testing.T) { core: nil, eg: nil, kvs: nil, - ivc: vcaches{}, - dvc: vcaches{}, + vq: nil, indexing: nil, saving: nil, lastNoice: 0, - ic: 0, nocie: 0, nogce: 0, inMem: false, @@ -3048,12 +2925,10 @@ func Test_ngt_SaveIndex(t *testing.T) { core: nil, eg: nil, kvs: nil, - ivc: vcaches{}, - dvc: vcaches{}, + vq: nil, indexing: nil, saving: nil, lastNoice: 0, - ic: 0, nocie: 0, nogce: 0, inMem: false, @@ -3097,12 +2972,10 @@ func Test_ngt_SaveIndex(t *testing.T) { core: test.fields.core, eg: test.fields.eg, kvs: test.fields.kvs, - ivc: test.fields.ivc, - dvc: test.fields.dvc, + vq: test.fields.vq, indexing: test.fields.indexing, saving: test.fields.saving, lastNoice: test.fields.lastNoice, - ic: test.fields.ic, nocie: test.fields.nocie, nogce: test.fields.nogce, inMem: test.fields.inMem, @@ -3139,12 +3012,10 @@ func Test_ngt_saveIndex(t *testing.T) { core core.NGT eg errgroup.Group kvs kvs.BidiMap - ivc *vcaches - dvc *vcaches + vq vqueue.Queue indexing atomic.Value saving atomic.Value lastNoice uint64 - ic uint64 nocie uint64 nogce uint64 inMem bool @@ -3193,12 +3064,10 @@ func Test_ngt_saveIndex(t *testing.T) { core: nil, eg: nil, kvs: nil, - ivc: vcaches{}, - dvc: vcaches{}, + vq: nil, indexing: nil, saving: nil, lastNoice: 0, - ic: 0, nocie: 0, nogce: 0, inMem: false, @@ -3234,12 +3103,10 @@ func Test_ngt_saveIndex(t *testing.T) { core: nil, eg: nil, kvs: nil, - ivc: vcaches{}, - dvc: vcaches{}, + vq: nil, indexing: nil, saving: nil, lastNoice: 0, - ic: 0, nocie: 0, nogce: 0, inMem: false, @@ -3283,12 +3150,10 @@ func Test_ngt_saveIndex(t *testing.T) { core: test.fields.core, eg: test.fields.eg, kvs: test.fields.kvs, - ivc: test.fields.ivc, - dvc: test.fields.dvc, + vq: test.fields.vq, indexing: test.fields.indexing, saving: test.fields.saving, lastNoice: test.fields.lastNoice, - ic: test.fields.ic, nocie: test.fields.nocie, nogce: test.fields.nogce, inMem: test.fields.inMem, @@ -3326,12 +3191,10 @@ func Test_ngt_CreateAndSaveIndex(t *testing.T) { core core.NGT eg errgroup.Group kvs kvs.BidiMap - ivc *vcaches - dvc *vcaches + vq vqueue.Queue indexing atomic.Value saving atomic.Value lastNoice uint64 - ic uint64 nocie uint64 nogce uint64 inMem bool @@ -3381,12 +3244,10 @@ func Test_ngt_CreateAndSaveIndex(t *testing.T) { core: nil, eg: nil, kvs: nil, - ivc: vcaches{}, - dvc: vcaches{}, + vq: nil, indexing: nil, saving: nil, lastNoice: 0, - ic: 0, nocie: 0, nogce: 0, inMem: false, @@ -3423,12 +3284,10 @@ func Test_ngt_CreateAndSaveIndex(t *testing.T) { core: nil, eg: nil, kvs: nil, - ivc: vcaches{}, - dvc: vcaches{}, + vq: nil, indexing: nil, saving: nil, lastNoice: 0, - ic: 0, nocie: 0, nogce: 0, inMem: false, @@ -3472,12 +3331,10 @@ func Test_ngt_CreateAndSaveIndex(t *testing.T) { core: test.fields.core, eg: test.fields.eg, kvs: test.fields.kvs, - ivc: test.fields.ivc, - dvc: test.fields.dvc, + vq: test.fields.vq, indexing: test.fields.indexing, saving: test.fields.saving, lastNoice: test.fields.lastNoice, - ic: test.fields.ic, nocie: test.fields.nocie, nogce: test.fields.nogce, inMem: test.fields.inMem, @@ -3514,12 +3371,10 @@ func Test_ngt_Exists(t *testing.T) { core core.NGT eg errgroup.Group kvs kvs.BidiMap - ivc *vcaches - dvc *vcaches + vq vqueue.Queue indexing atomic.Value saving atomic.Value lastNoice uint64 - ic uint64 nocie uint64 nogce uint64 inMem bool @@ -3572,12 +3427,10 @@ func Test_ngt_Exists(t *testing.T) { core: nil, eg: nil, kvs: nil, - ivc: vcaches{}, - dvc: vcaches{}, + vq: nil, indexing: nil, saving: nil, lastNoice: 0, - ic: 0, nocie: 0, nogce: 0, inMem: false, @@ -3613,12 +3466,10 @@ func Test_ngt_Exists(t *testing.T) { core: nil, eg: nil, kvs: nil, - ivc: vcaches{}, - dvc: vcaches{}, + vq: nil, indexing: nil, saving: nil, lastNoice: 0, - ic: 0, nocie: 0, nogce: 0, inMem: false, @@ -3662,12 +3513,10 @@ func Test_ngt_Exists(t *testing.T) { core: test.fields.core, eg: test.fields.eg, kvs: test.fields.kvs, - ivc: test.fields.ivc, - dvc: test.fields.dvc, + vq: test.fields.vq, indexing: test.fields.indexing, saving: test.fields.saving, lastNoice: test.fields.lastNoice, - ic: test.fields.ic, nocie: test.fields.nocie, nogce: test.fields.nogce, inMem: test.fields.inMem, @@ -3705,12 +3554,10 @@ func Test_ngt_readyForUpdate(t *testing.T) { core core.NGT eg errgroup.Group kvs kvs.BidiMap - ivc *vcaches - dvc *vcaches + vq vqueue.Queue indexing atomic.Value saving atomic.Value lastNoice uint64 - ic uint64 nocie uint64 nogce uint64 inMem bool @@ -3760,12 +3607,10 @@ func Test_ngt_readyForUpdate(t *testing.T) { core: nil, eg: nil, kvs: nil, - ivc: vcaches{}, - dvc: vcaches{}, + vq: nil, indexing: nil, saving: nil, lastNoice: 0, - ic: 0, nocie: 0, nogce: 0, inMem: false, @@ -3802,12 +3647,10 @@ func Test_ngt_readyForUpdate(t *testing.T) { core: nil, eg: nil, kvs: nil, - ivc: vcaches{}, - dvc: vcaches{}, + vq: nil, indexing: nil, saving: nil, lastNoice: 0, - ic: 0, nocie: 0, nogce: 0, inMem: false, @@ -3851,12 +3694,10 @@ func Test_ngt_readyForUpdate(t *testing.T) { core: test.fields.core, eg: test.fields.eg, kvs: test.fields.kvs, - ivc: test.fields.ivc, - dvc: test.fields.dvc, + vq: test.fields.vq, indexing: test.fields.indexing, saving: test.fields.saving, lastNoice: test.fields.lastNoice, - ic: test.fields.ic, nocie: test.fields.nocie, nogce: test.fields.nogce, inMem: test.fields.inMem, @@ -3884,21 +3725,16 @@ func Test_ngt_readyForUpdate(t *testing.T) { } } -func Test_ngt_insertCache(t *testing.T) { +func Test_ngt_IsSaving(t *testing.T) { t.Parallel() - type args struct { - uuid string - } type fields struct { core core.NGT eg errgroup.Group kvs kvs.BidiMap - ivc *vcaches - dvc *vcaches + vq vqueue.Queue indexing atomic.Value saving atomic.Value lastNoice uint64 - ic uint64 nocie uint64 nogce uint64 inMem bool @@ -3918,25 +3754,20 @@ func Test_ngt_insertCache(t *testing.T) { dcd bool } type want struct { - want *vcache - want1 bool + want bool } type test struct { name string - args args fields fields want want - checkFunc func(want, *vcache, bool) error - beforeFunc func(args) - afterFunc func(args) + checkFunc func(want, bool) error + beforeFunc func() + afterFunc func() } - defaultCheckFunc := func(w want, got *vcache, got1 bool) error { + defaultCheckFunc := func(w want, got bool) error { if !reflect.DeepEqual(got, w.want) { return errors.Errorf("got: \"%#v\",\n\t\t\t\twant: \"%#v\"", got, w.want) } - if !reflect.DeepEqual(got1, w.want1) { - return errors.Errorf("got: \"%#v\",\n\t\t\t\twant: \"%#v\"", got1, w.want1) - } return nil } tests := []test{ @@ -3944,19 +3775,14 @@ func Test_ngt_insertCache(t *testing.T) { /* { name: "test_case_1", - args: args { - uuid: "", - }, fields: fields { core: nil, eg: nil, kvs: nil, - ivc: vcaches{}, - dvc: vcaches{}, + vq: nil, indexing: nil, saving: nil, lastNoice: 0, - ic: 0, nocie: 0, nogce: 0, inMem: false, @@ -3985,19 +3811,14 @@ func Test_ngt_insertCache(t *testing.T) { func() test { return test { name: "test_case_2", - args: args { - uuid: "", - }, fields: fields { core: nil, eg: nil, kvs: nil, - ivc: vcaches{}, - dvc: vcaches{}, + vq: nil, indexing: nil, saving: nil, lastNoice: 0, - ic: 0, nocie: 0, nogce: 0, inMem: false, @@ -4029,10 +3850,10 @@ func Test_ngt_insertCache(t *testing.T) { tt.Parallel() defer goleak.VerifyNone(tt, goleak.IgnoreCurrent()) if test.beforeFunc != nil { - test.beforeFunc(test.args) + test.beforeFunc() } if test.afterFunc != nil { - defer test.afterFunc(test.args) + defer test.afterFunc() } if test.checkFunc == nil { test.checkFunc = defaultCheckFunc @@ -4041,12 +3862,10 @@ func Test_ngt_insertCache(t *testing.T) { core: test.fields.core, eg: test.fields.eg, kvs: test.fields.kvs, - ivc: test.fields.ivc, - dvc: test.fields.dvc, + vq: test.fields.vq, indexing: test.fields.indexing, saving: test.fields.saving, lastNoice: test.fields.lastNoice, - ic: test.fields.ic, nocie: test.fields.nocie, nogce: test.fields.nogce, inMem: test.fields.inMem, @@ -4066,26 +3885,24 @@ func Test_ngt_insertCache(t *testing.T) { dcd: test.fields.dcd, } - got, got1 := n.insertCache(test.args.uuid) - if err := test.checkFunc(test.want, got, got1); err != nil { + got := n.IsSaving() + if err := test.checkFunc(test.want, got); err != nil { tt.Errorf("error = %v", err) } }) } } -func Test_ngt_IsSaving(t *testing.T) { +func Test_ngt_IsIndexing(t *testing.T) { t.Parallel() type fields struct { core core.NGT eg errgroup.Group kvs kvs.BidiMap - ivc *vcaches - dvc *vcaches + vq vqueue.Queue indexing atomic.Value saving atomic.Value lastNoice uint64 - ic uint64 nocie uint64 nogce uint64 inMem bool @@ -4130,12 +3947,10 @@ func Test_ngt_IsSaving(t *testing.T) { core: nil, eg: nil, kvs: nil, - ivc: vcaches{}, - dvc: vcaches{}, + vq: nil, indexing: nil, saving: nil, lastNoice: 0, - ic: 0, nocie: 0, nogce: 0, inMem: false, @@ -4168,12 +3983,10 @@ func Test_ngt_IsSaving(t *testing.T) { core: nil, eg: nil, kvs: nil, - ivc: vcaches{}, - dvc: vcaches{}, + vq: nil, indexing: nil, saving: nil, lastNoice: 0, - ic: 0, nocie: 0, nogce: 0, inMem: false, @@ -4217,12 +4030,10 @@ func Test_ngt_IsSaving(t *testing.T) { core: test.fields.core, eg: test.fields.eg, kvs: test.fields.kvs, - ivc: test.fields.ivc, - dvc: test.fields.dvc, + vq: test.fields.vq, indexing: test.fields.indexing, saving: test.fields.saving, lastNoice: test.fields.lastNoice, - ic: test.fields.ic, nocie: test.fields.nocie, nogce: test.fields.nogce, inMem: test.fields.inMem, @@ -4242,7 +4053,7 @@ func Test_ngt_IsSaving(t *testing.T) { dcd: test.fields.dcd, } - got := n.IsSaving() + got := n.IsIndexing() if err := test.checkFunc(test.want, got); err != nil { tt.Errorf("error = %v", err) } @@ -4250,18 +4061,19 @@ func Test_ngt_IsSaving(t *testing.T) { } } -func Test_ngt_IsIndexing(t *testing.T) { +func Test_ngt_UUIDs(t *testing.T) { t.Parallel() + type args struct { + ctx context.Context + } type fields struct { core core.NGT eg errgroup.Group kvs kvs.BidiMap - ivc *vcaches - dvc *vcaches + vq vqueue.Queue indexing atomic.Value saving atomic.Value lastNoice uint64 - ic uint64 nocie uint64 nogce uint64 inMem bool @@ -4281,19 +4093,20 @@ func Test_ngt_IsIndexing(t *testing.T) { dcd bool } type want struct { - want bool + wantUuids []string } type test struct { name string + args args fields fields want want - checkFunc func(want, bool) error - beforeFunc func() - afterFunc func() + checkFunc func(want, []string) error + beforeFunc func(args) + afterFunc func(args) } - defaultCheckFunc := func(w want, got bool) error { - if !reflect.DeepEqual(got, w.want) { - return errors.Errorf("got: \"%#v\",\n\t\t\t\twant: \"%#v\"", got, w.want) + defaultCheckFunc := func(w want, gotUuids []string) error { + if !reflect.DeepEqual(gotUuids, w.wantUuids) { + return errors.Errorf("got: \"%#v\",\n\t\t\t\twant: \"%#v\"", gotUuids, w.wantUuids) } return nil } @@ -4302,16 +4115,17 @@ func Test_ngt_IsIndexing(t *testing.T) { /* { name: "test_case_1", + args: args { + ctx: nil, + }, fields: fields { core: nil, eg: nil, kvs: nil, - ivc: vcaches{}, - dvc: vcaches{}, + vq: nil, indexing: nil, saving: nil, lastNoice: 0, - ic: 0, nocie: 0, nogce: 0, inMem: false, @@ -4340,16 +4154,17 @@ func Test_ngt_IsIndexing(t *testing.T) { func() test { return test { name: "test_case_2", + args: args { + ctx: nil, + }, fields: fields { core: nil, eg: nil, kvs: nil, - ivc: vcaches{}, - dvc: vcaches{}, + vq: nil, indexing: nil, saving: nil, lastNoice: 0, - ic: 0, nocie: 0, nogce: 0, inMem: false, @@ -4381,10 +4196,10 @@ func Test_ngt_IsIndexing(t *testing.T) { tt.Parallel() defer goleak.VerifyNone(tt, goleak.IgnoreCurrent()) if test.beforeFunc != nil { - test.beforeFunc() + test.beforeFunc(test.args) } if test.afterFunc != nil { - defer test.afterFunc() + defer test.afterFunc(test.args) } if test.checkFunc == nil { test.checkFunc = defaultCheckFunc @@ -4393,12 +4208,10 @@ func Test_ngt_IsIndexing(t *testing.T) { core: test.fields.core, eg: test.fields.eg, kvs: test.fields.kvs, - ivc: test.fields.ivc, - dvc: test.fields.dvc, + vq: test.fields.vq, indexing: test.fields.indexing, saving: test.fields.saving, lastNoice: test.fields.lastNoice, - ic: test.fields.ic, nocie: test.fields.nocie, nogce: test.fields.nogce, inMem: test.fields.inMem, @@ -4418,29 +4231,24 @@ func Test_ngt_IsIndexing(t *testing.T) { dcd: test.fields.dcd, } - got := n.IsIndexing() - if err := test.checkFunc(test.want, got); err != nil { + gotUuids := n.UUIDs(test.args.ctx) + if err := test.checkFunc(test.want, gotUuids); err != nil { tt.Errorf("error = %v", err) } }) } } -func Test_ngt_UUIDs(t *testing.T) { +func Test_ngt_NumberOfCreateIndexExecution(t *testing.T) { t.Parallel() - type args struct { - ctx context.Context - } type fields struct { core core.NGT eg errgroup.Group kvs kvs.BidiMap - ivc *vcaches - dvc *vcaches + vq vqueue.Queue indexing atomic.Value saving atomic.Value lastNoice uint64 - ic uint64 nocie uint64 nogce uint64 inMem bool @@ -4460,20 +4268,19 @@ func Test_ngt_UUIDs(t *testing.T) { dcd bool } type want struct { - wantUuids []string + want uint64 } type test struct { name string - args args fields fields want want - checkFunc func(want, []string) error - beforeFunc func(args) - afterFunc func(args) + checkFunc func(want, uint64) error + beforeFunc func() + afterFunc func() } - defaultCheckFunc := func(w want, gotUuids []string) error { - if !reflect.DeepEqual(gotUuids, w.wantUuids) { - return errors.Errorf("got: \"%#v\",\n\t\t\t\twant: \"%#v\"", gotUuids, w.wantUuids) + defaultCheckFunc := func(w want, got uint64) error { + if !reflect.DeepEqual(got, w.want) { + return errors.Errorf("got: \"%#v\",\n\t\t\t\twant: \"%#v\"", got, w.want) } return nil } @@ -4482,19 +4289,14 @@ func Test_ngt_UUIDs(t *testing.T) { /* { name: "test_case_1", - args: args { - ctx: nil, - }, fields: fields { core: nil, eg: nil, kvs: nil, - ivc: vcaches{}, - dvc: vcaches{}, + vq: nil, indexing: nil, saving: nil, lastNoice: 0, - ic: 0, nocie: 0, nogce: 0, inMem: false, @@ -4523,19 +4325,14 @@ func Test_ngt_UUIDs(t *testing.T) { func() test { return test { name: "test_case_2", - args: args { - ctx: nil, - }, fields: fields { core: nil, eg: nil, kvs: nil, - ivc: vcaches{}, - dvc: vcaches{}, + vq: nil, indexing: nil, saving: nil, lastNoice: 0, - ic: 0, nocie: 0, nogce: 0, inMem: false, @@ -4567,10 +4364,10 @@ func Test_ngt_UUIDs(t *testing.T) { tt.Parallel() defer goleak.VerifyNone(tt, goleak.IgnoreCurrent()) if test.beforeFunc != nil { - test.beforeFunc(test.args) + test.beforeFunc() } if test.afterFunc != nil { - defer test.afterFunc(test.args) + defer test.afterFunc() } if test.checkFunc == nil { test.checkFunc = defaultCheckFunc @@ -4579,12 +4376,10 @@ func Test_ngt_UUIDs(t *testing.T) { core: test.fields.core, eg: test.fields.eg, kvs: test.fields.kvs, - ivc: test.fields.ivc, - dvc: test.fields.dvc, + vq: test.fields.vq, indexing: test.fields.indexing, saving: test.fields.saving, lastNoice: test.fields.lastNoice, - ic: test.fields.ic, nocie: test.fields.nocie, nogce: test.fields.nogce, inMem: test.fields.inMem, @@ -4604,26 +4399,24 @@ func Test_ngt_UUIDs(t *testing.T) { dcd: test.fields.dcd, } - gotUuids := n.UUIDs(test.args.ctx) - if err := test.checkFunc(test.want, gotUuids); err != nil { + got := n.NumberOfCreateIndexExecution() + if err := test.checkFunc(test.want, got); err != nil { tt.Errorf("error = %v", err) } }) } } -func Test_ngt_UncommittedUUIDs(t *testing.T) { +func Test_ngt_NumberOfProactiveGCExecution(t *testing.T) { t.Parallel() type fields struct { core core.NGT eg errgroup.Group kvs kvs.BidiMap - ivc *vcaches - dvc *vcaches + vq vqueue.Queue indexing atomic.Value saving atomic.Value lastNoice uint64 - ic uint64 nocie uint64 nogce uint64 inMem bool @@ -4643,19 +4436,19 @@ func Test_ngt_UncommittedUUIDs(t *testing.T) { dcd bool } type want struct { - wantUuids []string + want uint64 } type test struct { name string fields fields want want - checkFunc func(want, []string) error + checkFunc func(want, uint64) error beforeFunc func() afterFunc func() } - defaultCheckFunc := func(w want, gotUuids []string) error { - if !reflect.DeepEqual(gotUuids, w.wantUuids) { - return errors.Errorf("got: \"%#v\",\n\t\t\t\twant: \"%#v\"", gotUuids, w.wantUuids) + defaultCheckFunc := func(w want, got uint64) error { + if !reflect.DeepEqual(got, w.want) { + return errors.Errorf("got: \"%#v\",\n\t\t\t\twant: \"%#v\"", got, w.want) } return nil } @@ -4668,12 +4461,10 @@ func Test_ngt_UncommittedUUIDs(t *testing.T) { core: nil, eg: nil, kvs: nil, - ivc: vcaches{}, - dvc: vcaches{}, + vq: nil, indexing: nil, saving: nil, lastNoice: 0, - ic: 0, nocie: 0, nogce: 0, inMem: false, @@ -4706,12 +4497,10 @@ func Test_ngt_UncommittedUUIDs(t *testing.T) { core: nil, eg: nil, kvs: nil, - ivc: vcaches{}, - dvc: vcaches{}, + vq: nil, indexing: nil, saving: nil, lastNoice: 0, - ic: 0, nocie: 0, nogce: 0, inMem: false, @@ -4755,12 +4544,10 @@ func Test_ngt_UncommittedUUIDs(t *testing.T) { core: test.fields.core, eg: test.fields.eg, kvs: test.fields.kvs, - ivc: test.fields.ivc, - dvc: test.fields.dvc, + vq: test.fields.vq, indexing: test.fields.indexing, saving: test.fields.saving, lastNoice: test.fields.lastNoice, - ic: test.fields.ic, nocie: test.fields.nocie, nogce: test.fields.nogce, inMem: test.fields.inMem, @@ -4780,26 +4567,24 @@ func Test_ngt_UncommittedUUIDs(t *testing.T) { dcd: test.fields.dcd, } - gotUuids := n.UncommittedUUIDs() - if err := test.checkFunc(test.want, gotUuids); err != nil { + got := n.NumberOfProactiveGCExecution() + if err := test.checkFunc(test.want, got); err != nil { tt.Errorf("error = %v", err) } }) } } -func Test_ngt_NumberOfCreateIndexExecution(t *testing.T) { +func Test_ngt_gc(t *testing.T) { t.Parallel() type fields struct { core core.NGT eg errgroup.Group kvs kvs.BidiMap - ivc *vcaches - dvc *vcaches + vq vqueue.Queue indexing atomic.Value saving atomic.Value lastNoice uint64 - ic uint64 nocie uint64 nogce uint64 inMem bool @@ -4818,21 +4603,16 @@ func Test_ngt_NumberOfCreateIndexExecution(t *testing.T) { idelay time.Duration dcd bool } - type want struct { - want uint64 - } + type want struct{} type test struct { name string fields fields want want - checkFunc func(want, uint64) error + checkFunc func(want) error beforeFunc func() afterFunc func() } - defaultCheckFunc := func(w want, got uint64) error { - if !reflect.DeepEqual(got, w.want) { - return errors.Errorf("got: \"%#v\",\n\t\t\t\twant: \"%#v\"", got, w.want) - } + defaultCheckFunc := func(w want) error { return nil } tests := []test{ @@ -4844,12 +4624,10 @@ func Test_ngt_NumberOfCreateIndexExecution(t *testing.T) { core: nil, eg: nil, kvs: nil, - ivc: vcaches{}, - dvc: vcaches{}, + vq: nil, indexing: nil, saving: nil, lastNoice: 0, - ic: 0, nocie: 0, nogce: 0, inMem: false, @@ -4882,12 +4660,10 @@ func Test_ngt_NumberOfCreateIndexExecution(t *testing.T) { core: nil, eg: nil, kvs: nil, - ivc: vcaches{}, - dvc: vcaches{}, + vq: nil, indexing: nil, saving: nil, lastNoice: 0, - ic: 0, nocie: 0, nogce: 0, inMem: false, @@ -4931,12 +4707,10 @@ func Test_ngt_NumberOfCreateIndexExecution(t *testing.T) { core: test.fields.core, eg: test.fields.eg, kvs: test.fields.kvs, - ivc: test.fields.ivc, - dvc: test.fields.dvc, + vq: test.fields.vq, indexing: test.fields.indexing, saving: test.fields.saving, lastNoice: test.fields.lastNoice, - ic: test.fields.ic, nocie: test.fields.nocie, nogce: test.fields.nogce, inMem: test.fields.inMem, @@ -4956,26 +4730,24 @@ func Test_ngt_NumberOfCreateIndexExecution(t *testing.T) { dcd: test.fields.dcd, } - got := n.NumberOfCreateIndexExecution() - if err := test.checkFunc(test.want, got); err != nil { + n.gc() + if err := test.checkFunc(test.want); err != nil { tt.Errorf("error = %v", err) } }) } } -func Test_ngt_NumberOfProactiveGCExecution(t *testing.T) { +func Test_ngt_Len(t *testing.T) { t.Parallel() type fields struct { core core.NGT eg errgroup.Group kvs kvs.BidiMap - ivc *vcaches - dvc *vcaches + vq vqueue.Queue indexing atomic.Value saving atomic.Value lastNoice uint64 - ic uint64 nocie uint64 nogce uint64 inMem bool @@ -5020,12 +4792,10 @@ func Test_ngt_NumberOfProactiveGCExecution(t *testing.T) { core: nil, eg: nil, kvs: nil, - ivc: vcaches{}, - dvc: vcaches{}, + vq: nil, indexing: nil, saving: nil, lastNoice: 0, - ic: 0, nocie: 0, nogce: 0, inMem: false, @@ -5058,12 +4828,10 @@ func Test_ngt_NumberOfProactiveGCExecution(t *testing.T) { core: nil, eg: nil, kvs: nil, - ivc: vcaches{}, - dvc: vcaches{}, + vq: nil, indexing: nil, saving: nil, lastNoice: 0, - ic: 0, nocie: 0, nogce: 0, inMem: false, @@ -5107,12 +4875,10 @@ func Test_ngt_NumberOfProactiveGCExecution(t *testing.T) { core: test.fields.core, eg: test.fields.eg, kvs: test.fields.kvs, - ivc: test.fields.ivc, - dvc: test.fields.dvc, + vq: test.fields.vq, indexing: test.fields.indexing, saving: test.fields.saving, lastNoice: test.fields.lastNoice, - ic: test.fields.ic, nocie: test.fields.nocie, nogce: test.fields.nogce, inMem: test.fields.inMem, @@ -5132,7 +4898,7 @@ func Test_ngt_NumberOfProactiveGCExecution(t *testing.T) { dcd: test.fields.dcd, } - got := n.NumberOfProactiveGCExecution() + got := n.Len() if err := test.checkFunc(test.want, got); err != nil { tt.Errorf("error = %v", err) } @@ -5140,18 +4906,16 @@ func Test_ngt_NumberOfProactiveGCExecution(t *testing.T) { } } -func Test_ngt_gc(t *testing.T) { +func Test_ngt_InsertVQueueBufferLen(t *testing.T) { t.Parallel() type fields struct { core core.NGT eg errgroup.Group kvs kvs.BidiMap - ivc *vcaches - dvc *vcaches + vq vqueue.Queue indexing atomic.Value saving atomic.Value lastNoice uint64 - ic uint64 nocie uint64 nogce uint64 inMem bool @@ -5170,16 +4934,21 @@ func Test_ngt_gc(t *testing.T) { idelay time.Duration dcd bool } - type want struct{} + type want struct { + want uint64 + } type test struct { name string fields fields want want - checkFunc func(want) error + checkFunc func(want, uint64) error beforeFunc func() afterFunc func() } - defaultCheckFunc := func(w want) error { + defaultCheckFunc := func(w want, got uint64) 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{ @@ -5191,12 +4960,10 @@ func Test_ngt_gc(t *testing.T) { core: nil, eg: nil, kvs: nil, - ivc: vcaches{}, - dvc: vcaches{}, + vq: nil, indexing: nil, saving: nil, lastNoice: 0, - ic: 0, nocie: 0, nogce: 0, inMem: false, @@ -5229,12 +4996,10 @@ func Test_ngt_gc(t *testing.T) { core: nil, eg: nil, kvs: nil, - ivc: vcaches{}, - dvc: vcaches{}, + vq: nil, indexing: nil, saving: nil, lastNoice: 0, - ic: 0, nocie: 0, nogce: 0, inMem: false, @@ -5278,12 +5043,10 @@ func Test_ngt_gc(t *testing.T) { core: test.fields.core, eg: test.fields.eg, kvs: test.fields.kvs, - ivc: test.fields.ivc, - dvc: test.fields.dvc, + vq: test.fields.vq, indexing: test.fields.indexing, saving: test.fields.saving, lastNoice: test.fields.lastNoice, - ic: test.fields.ic, nocie: test.fields.nocie, nogce: test.fields.nogce, inMem: test.fields.inMem, @@ -5303,26 +5066,24 @@ func Test_ngt_gc(t *testing.T) { dcd: test.fields.dcd, } - n.gc() - if err := test.checkFunc(test.want); err != nil { + got := n.InsertVQueueBufferLen() + if err := test.checkFunc(test.want, got); err != nil { tt.Errorf("error = %v", err) } }) } } -func Test_ngt_Len(t *testing.T) { +func Test_ngt_DeleteVQueueBufferLen(t *testing.T) { t.Parallel() type fields struct { core core.NGT eg errgroup.Group kvs kvs.BidiMap - ivc *vcaches - dvc *vcaches + vq vqueue.Queue indexing atomic.Value saving atomic.Value lastNoice uint64 - ic uint64 nocie uint64 nogce uint64 inMem bool @@ -5367,12 +5128,10 @@ func Test_ngt_Len(t *testing.T) { core: nil, eg: nil, kvs: nil, - ivc: vcaches{}, - dvc: vcaches{}, + vq: nil, indexing: nil, saving: nil, lastNoice: 0, - ic: 0, nocie: 0, nogce: 0, inMem: false, @@ -5405,12 +5164,10 @@ func Test_ngt_Len(t *testing.T) { core: nil, eg: nil, kvs: nil, - ivc: vcaches{}, - dvc: vcaches{}, + vq: nil, indexing: nil, saving: nil, lastNoice: 0, - ic: 0, nocie: 0, nogce: 0, inMem: false, @@ -5454,12 +5211,10 @@ func Test_ngt_Len(t *testing.T) { core: test.fields.core, eg: test.fields.eg, kvs: test.fields.kvs, - ivc: test.fields.ivc, - dvc: test.fields.dvc, + vq: test.fields.vq, indexing: test.fields.indexing, saving: test.fields.saving, lastNoice: test.fields.lastNoice, - ic: test.fields.ic, nocie: test.fields.nocie, nogce: test.fields.nogce, inMem: test.fields.inMem, @@ -5479,7 +5234,7 @@ func Test_ngt_Len(t *testing.T) { dcd: test.fields.dcd, } - got := n.Len() + got := n.DeleteVQueueBufferLen() if err := test.checkFunc(test.want, got); err != nil { tt.Errorf("error = %v", err) } @@ -5487,18 +5242,16 @@ func Test_ngt_Len(t *testing.T) { } } -func Test_ngt_InsertVCacheLen(t *testing.T) { +func Test_ngt_InsertVQueueChannelLen(t *testing.T) { t.Parallel() type fields struct { core core.NGT eg errgroup.Group kvs kvs.BidiMap - ivc *vcaches - dvc *vcaches + vq vqueue.Queue indexing atomic.Value saving atomic.Value lastNoice uint64 - ic uint64 nocie uint64 nogce uint64 inMem bool @@ -5543,12 +5296,10 @@ func Test_ngt_InsertVCacheLen(t *testing.T) { core: nil, eg: nil, kvs: nil, - ivc: vcaches{}, - dvc: vcaches{}, + vq: nil, indexing: nil, saving: nil, lastNoice: 0, - ic: 0, nocie: 0, nogce: 0, inMem: false, @@ -5581,12 +5332,10 @@ func Test_ngt_InsertVCacheLen(t *testing.T) { core: nil, eg: nil, kvs: nil, - ivc: vcaches{}, - dvc: vcaches{}, + vq: nil, indexing: nil, saving: nil, lastNoice: 0, - ic: 0, nocie: 0, nogce: 0, inMem: false, @@ -5630,12 +5379,10 @@ func Test_ngt_InsertVCacheLen(t *testing.T) { core: test.fields.core, eg: test.fields.eg, kvs: test.fields.kvs, - ivc: test.fields.ivc, - dvc: test.fields.dvc, + vq: test.fields.vq, indexing: test.fields.indexing, saving: test.fields.saving, lastNoice: test.fields.lastNoice, - ic: test.fields.ic, nocie: test.fields.nocie, nogce: test.fields.nogce, inMem: test.fields.inMem, @@ -5655,7 +5402,7 @@ func Test_ngt_InsertVCacheLen(t *testing.T) { dcd: test.fields.dcd, } - got := n.InsertVCacheLen() + got := n.InsertVQueueChannelLen() if err := test.checkFunc(test.want, got); err != nil { tt.Errorf("error = %v", err) } @@ -5663,18 +5410,16 @@ func Test_ngt_InsertVCacheLen(t *testing.T) { } } -func Test_ngt_DeleteVCacheLen(t *testing.T) { +func Test_ngt_DeleteVQueueChannelLen(t *testing.T) { t.Parallel() type fields struct { core core.NGT eg errgroup.Group kvs kvs.BidiMap - ivc *vcaches - dvc *vcaches + vq vqueue.Queue indexing atomic.Value saving atomic.Value lastNoice uint64 - ic uint64 nocie uint64 nogce uint64 inMem bool @@ -5719,12 +5464,10 @@ func Test_ngt_DeleteVCacheLen(t *testing.T) { core: nil, eg: nil, kvs: nil, - ivc: vcaches{}, - dvc: vcaches{}, + vq: nil, indexing: nil, saving: nil, lastNoice: 0, - ic: 0, nocie: 0, nogce: 0, inMem: false, @@ -5757,12 +5500,10 @@ func Test_ngt_DeleteVCacheLen(t *testing.T) { core: nil, eg: nil, kvs: nil, - ivc: vcaches{}, - dvc: vcaches{}, + vq: nil, indexing: nil, saving: nil, lastNoice: 0, - ic: 0, nocie: 0, nogce: 0, inMem: false, @@ -5806,12 +5547,10 @@ func Test_ngt_DeleteVCacheLen(t *testing.T) { core: test.fields.core, eg: test.fields.eg, kvs: test.fields.kvs, - ivc: test.fields.ivc, - dvc: test.fields.dvc, + vq: test.fields.vq, indexing: test.fields.indexing, saving: test.fields.saving, lastNoice: test.fields.lastNoice, - ic: test.fields.ic, nocie: test.fields.nocie, nogce: test.fields.nogce, inMem: test.fields.inMem, @@ -5831,7 +5570,7 @@ func Test_ngt_DeleteVCacheLen(t *testing.T) { dcd: test.fields.dcd, } - got := n.DeleteVCacheLen() + got := n.DeleteVQueueChannelLen() if err := test.checkFunc(test.want, got); err != nil { tt.Errorf("error = %v", err) } @@ -5848,12 +5587,10 @@ func Test_ngt_Close(t *testing.T) { core core.NGT eg errgroup.Group kvs kvs.BidiMap - ivc *vcaches - dvc *vcaches + vq vqueue.Queue indexing atomic.Value saving atomic.Value lastNoice uint64 - ic uint64 nocie uint64 nogce uint64 inMem bool @@ -5902,12 +5639,10 @@ func Test_ngt_Close(t *testing.T) { core: nil, eg: nil, kvs: nil, - ivc: vcaches{}, - dvc: vcaches{}, + vq: nil, indexing: nil, saving: nil, lastNoice: 0, - ic: 0, nocie: 0, nogce: 0, inMem: false, @@ -5943,12 +5678,10 @@ func Test_ngt_Close(t *testing.T) { core: nil, eg: nil, kvs: nil, - ivc: vcaches{}, - dvc: vcaches{}, + vq: nil, indexing: nil, saving: nil, lastNoice: 0, - ic: 0, nocie: 0, nogce: 0, inMem: false, @@ -5992,12 +5725,10 @@ func Test_ngt_Close(t *testing.T) { core: test.fields.core, eg: test.fields.eg, kvs: test.fields.kvs, - ivc: test.fields.ivc, - dvc: test.fields.dvc, + vq: test.fields.vq, indexing: test.fields.indexing, saving: test.fields.saving, lastNoice: test.fields.lastNoice, - ic: test.fields.ic, nocie: test.fields.nocie, nogce: test.fields.nogce, inMem: test.fields.inMem, diff --git a/pkg/agent/core/ngt/service/vcaches.go b/pkg/agent/core/ngt/service/vcaches.go deleted file mode 100644 index bbeb77fa7a..0000000000 --- a/pkg/agent/core/ngt/service/vcaches.go +++ /dev/null @@ -1,213 +0,0 @@ -// -// 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 service - -import ( - "sync" - "sync/atomic" - "unsafe" -) - -type vcaches struct { - length uint64 - mu sync.Mutex - read atomic.Value // readOnly - dirty map[string]*entryVCache - misses int -} - -type readOnlyVCache struct { - m map[string]*entryVCache - amended bool -} - -var expungedVCache = unsafe.Pointer(new(vcache)) - -type entryVCache struct { - p unsafe.Pointer -} - -func newEntryVCache(i vcache) *entryVCache { - return &entryVCache{p: unsafe.Pointer(&i)} -} - -func (m *vcaches) Load(key string) (value vcache, ok bool) { - read, _ := m.read.Load().(readOnlyVCache) - e, ok := read.m[key] - if !ok && read.amended { - m.mu.Lock() - read, _ = m.read.Load().(readOnlyVCache) - e, ok = read.m[key] - if !ok && read.amended { - e, ok = m.dirty[key] - m.missLocked() - } - m.mu.Unlock() - } - if !ok { - return value, false - } - return e.load() -} - -func (e *entryVCache) load() (value vcache, ok bool) { - p := atomic.LoadPointer(&e.p) - if p == nil || p == expungedVCache { - return value, false - } - return *(*vcache)(p), true -} - -func (m *vcaches) Store(key string, value vcache) { - defer atomic.AddUint64(&m.length, 1) - read, _ := m.read.Load().(readOnlyVCache) - if e, ok := read.m[key]; ok && e.tryStore(&value) { - return - } - - m.mu.Lock() - read, _ = m.read.Load().(readOnlyVCache) - if e, ok := read.m[key]; ok { - if e.unexpungeLocked() { - m.dirty[key] = e - } - e.storeLocked(&value) - } else if e, ok := m.dirty[key]; ok { - e.storeLocked(&value) - } else { - if !read.amended { - m.dirtyLocked() - m.read.Store(readOnlyVCache{m: read.m, amended: true}) - } - m.dirty[key] = newEntryVCache(value) - } - m.mu.Unlock() -} - -func (e *entryVCache) tryStore(i *vcache) bool { - for { - p := atomic.LoadPointer(&e.p) - if p == expungedVCache { - return false - } - if atomic.CompareAndSwapPointer(&e.p, p, unsafe.Pointer(i)) { - return true - } - } -} - -func (e *entryVCache) unexpungeLocked() (wasExpunged bool) { - return atomic.CompareAndSwapPointer(&e.p, expungedVCache, nil) -} - -func (e *entryVCache) storeLocked(i *vcache) { - atomic.StorePointer(&e.p, unsafe.Pointer(i)) -} - -func (m *vcaches) Delete(key string) { - atomic.AddUint64(&m.length, ^uint64(0)) - read, _ := m.read.Load().(readOnlyVCache) - e, ok := read.m[key] - if !ok && read.amended { - m.mu.Lock() - read, _ = m.read.Load().(readOnlyVCache) - e, ok = read.m[key] - if !ok && read.amended { - delete(m.dirty, key) - } - m.mu.Unlock() - } - if ok { - e.delete() - } -} - -func (e *entryVCache) delete() (hadValue bool) { - for { - p := atomic.LoadPointer(&e.p) - if p == nil || p == expungedVCache { - return false - } - if atomic.CompareAndSwapPointer(&e.p, p, nil) { - return true - } - } -} - -func (m *vcaches) Range(f func(key string, value vcache) bool) { - read, _ := m.read.Load().(readOnlyVCache) - if read.amended { - m.mu.Lock() - read, _ = m.read.Load().(readOnlyVCache) - if read.amended { - read = readOnlyVCache{m: m.dirty} - m.read.Store(read) - m.dirty = nil - m.misses = 0 - } - m.mu.Unlock() - } - - for k, e := range read.m { - v, ok := e.load() - if !ok { - continue - } - if !f(k, v) { - break - } - } -} - -func (m *vcaches) missLocked() { - m.misses++ - if m.misses < len(m.dirty) { - return - } - m.read.Store(readOnlyVCache{m: m.dirty}) - m.dirty = nil - m.misses = 0 -} - -func (m *vcaches) dirtyLocked() { - if m.dirty != nil { - return - } - - read, _ := m.read.Load().(readOnlyVCache) - m.dirty = make(map[string]*entryVCache, len(read.m)) - for k, e := range read.m { - if !e.tryExpungeLocked() { - m.dirty[k] = e - } - } -} - -func (e *entryVCache) tryExpungeLocked() (isExpunged bool) { - p := atomic.LoadPointer(&e.p) - for p == nil { - if atomic.CompareAndSwapPointer(&e.p, nil, expungedVCache) { - return true - } - p = atomic.LoadPointer(&e.p) - } - return p == expungedVCache -} - -func (m *vcaches) Len() uint64 { - return atomic.LoadUint64(&m.length) -} diff --git a/pkg/agent/core/ngt/service/vcaches_test.go b/pkg/agent/core/ngt/service/vcaches_test.go deleted file mode 100644 index 6710e2c2c8..0000000000 --- a/pkg/agent/core/ngt/service/vcaches_test.go +++ /dev/null @@ -1,1242 +0,0 @@ -// -// 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 service - -import ( - "reflect" - "sync" - "sync/atomic" - "testing" - "unsafe" - - "github.com/vdaas/vald/internal/errors" - "go.uber.org/goleak" -) - -func Test_newEntryVCache(t *testing.T) { - t.Parallel() - type args struct { - i vcache - } - type want struct { - want *entryVCache - } - type test struct { - name string - args args - want want - checkFunc func(want, *entryVCache) error - beforeFunc func(args) - afterFunc func(args) - } - defaultCheckFunc := func(w want, got *entryVCache) 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 { - i: vcache{}, - }, - want: want{}, - checkFunc: defaultCheckFunc, - }, - */ - - // TODO test cases - /* - func() test { - return test { - name: "test_case_2", - args: args { - i: vcache{}, - }, - 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 := newEntryVCache(test.args.i) - if err := test.checkFunc(test.want, got); err != nil { - tt.Errorf("error = %v", err) - } - }) - } -} - -func Test_vcaches_Load(t *testing.T) { - t.Parallel() - type args struct { - key string - } - type fields struct { - length uint64 - mu sync.Mutex - read atomic.Value - dirty map[string]*entryVCache - misses int - } - type want struct { - wantValue vcache - wantOk bool - } - type test struct { - name string - args args - fields fields - want want - checkFunc func(want, vcache, bool) error - beforeFunc func(args) - afterFunc func(args) - } - defaultCheckFunc := func(w want, gotValue vcache, gotOk bool) error { - if !reflect.DeepEqual(gotValue, w.wantValue) { - return errors.Errorf("got: \"%#v\",\n\t\t\t\twant: \"%#v\"", gotValue, w.wantValue) - } - if !reflect.DeepEqual(gotOk, w.wantOk) { - return errors.Errorf("got: \"%#v\",\n\t\t\t\twant: \"%#v\"", gotOk, w.wantOk) - } - return nil - } - tests := []test{ - // TODO test cases - /* - { - name: "test_case_1", - args: args { - key: "", - }, - fields: fields { - length: 0, - mu: sync.Mutex{}, - read: nil, - dirty: nil, - misses: 0, - }, - want: want{}, - checkFunc: defaultCheckFunc, - }, - */ - - // TODO test cases - /* - func() test { - return test { - name: "test_case_2", - args: args { - key: "", - }, - fields: fields { - length: 0, - mu: sync.Mutex{}, - read: nil, - dirty: nil, - misses: 0, - }, - 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 - } - m := &vcaches{ - length: test.fields.length, - mu: test.fields.mu, - read: test.fields.read, - dirty: test.fields.dirty, - misses: test.fields.misses, - } - - gotValue, gotOk := m.Load(test.args.key) - if err := test.checkFunc(test.want, gotValue, gotOk); err != nil { - tt.Errorf("error = %v", err) - } - }) - } -} - -func Test_entryVCache_load(t *testing.T) { - t.Parallel() - type fields struct { - p unsafe.Pointer - } - type want struct { - wantValue vcache - wantOk bool - } - type test struct { - name string - fields fields - want want - checkFunc func(want, vcache, bool) error - beforeFunc func() - afterFunc func() - } - defaultCheckFunc := func(w want, gotValue vcache, gotOk bool) error { - if !reflect.DeepEqual(gotValue, w.wantValue) { - return errors.Errorf("got: \"%#v\",\n\t\t\t\twant: \"%#v\"", gotValue, w.wantValue) - } - if !reflect.DeepEqual(gotOk, w.wantOk) { - return errors.Errorf("got: \"%#v\",\n\t\t\t\twant: \"%#v\"", gotOk, w.wantOk) - } - return nil - } - tests := []test{ - // TODO test cases - /* - { - name: "test_case_1", - fields: fields { - p: nil, - }, - want: want{}, - checkFunc: defaultCheckFunc, - }, - */ - - // TODO test cases - /* - func() test { - return test { - name: "test_case_2", - fields: fields { - p: 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 := &entryVCache{ - p: test.fields.p, - } - - gotValue, gotOk := e.load() - if err := test.checkFunc(test.want, gotValue, gotOk); err != nil { - tt.Errorf("error = %v", err) - } - }) - } -} - -func Test_vcaches_Store(t *testing.T) { - t.Parallel() - type args struct { - key string - value vcache - } - type fields struct { - length uint64 - mu sync.Mutex - read atomic.Value - dirty map[string]*entryVCache - misses int - } - type want struct{} - type test struct { - name string - args args - fields fields - want want - checkFunc func(want) error - beforeFunc func(args) - afterFunc func(args) - } - defaultCheckFunc := func(w want) error { - return nil - } - tests := []test{ - // TODO test cases - /* - { - name: "test_case_1", - args: args { - key: "", - value: vcache{}, - }, - fields: fields { - length: 0, - mu: sync.Mutex{}, - read: nil, - dirty: nil, - misses: 0, - }, - want: want{}, - checkFunc: defaultCheckFunc, - }, - */ - - // TODO test cases - /* - func() test { - return test { - name: "test_case_2", - args: args { - key: "", - value: vcache{}, - }, - fields: fields { - length: 0, - mu: sync.Mutex{}, - read: nil, - dirty: nil, - misses: 0, - }, - 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 - } - m := &vcaches{ - length: test.fields.length, - mu: test.fields.mu, - read: test.fields.read, - dirty: test.fields.dirty, - misses: test.fields.misses, - } - - m.Store(test.args.key, test.args.value) - if err := test.checkFunc(test.want); err != nil { - tt.Errorf("error = %v", err) - } - }) - } -} - -func Test_entryVCache_tryStore(t *testing.T) { - t.Parallel() - type args struct { - i *vcache - } - type fields struct { - p unsafe.Pointer - } - type want struct { - want bool - } - type test struct { - name string - args args - fields fields - want want - checkFunc func(want, bool) error - beforeFunc func(args) - afterFunc func(args) - } - defaultCheckFunc := func(w want, got bool) 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 { - i: vcache{}, - }, - fields: fields { - p: nil, - }, - want: want{}, - checkFunc: defaultCheckFunc, - }, - */ - - // TODO test cases - /* - func() test { - return test { - name: "test_case_2", - args: args { - i: vcache{}, - }, - fields: fields { - p: 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 - } - e := &entryVCache{ - p: test.fields.p, - } - - got := e.tryStore(test.args.i) - if err := test.checkFunc(test.want, got); err != nil { - tt.Errorf("error = %v", err) - } - }) - } -} - -func Test_entryVCache_unexpungeLocked(t *testing.T) { - t.Parallel() - type fields struct { - p unsafe.Pointer - } - type want struct { - wantWasExpunged bool - } - type test struct { - name string - fields fields - want want - checkFunc func(want, bool) error - beforeFunc func() - afterFunc func() - } - defaultCheckFunc := func(w want, gotWasExpunged bool) error { - if !reflect.DeepEqual(gotWasExpunged, w.wantWasExpunged) { - return errors.Errorf("got: \"%#v\",\n\t\t\t\twant: \"%#v\"", gotWasExpunged, w.wantWasExpunged) - } - return nil - } - tests := []test{ - // TODO test cases - /* - { - name: "test_case_1", - fields: fields { - p: nil, - }, - want: want{}, - checkFunc: defaultCheckFunc, - }, - */ - - // TODO test cases - /* - func() test { - return test { - name: "test_case_2", - fields: fields { - p: 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 := &entryVCache{ - p: test.fields.p, - } - - gotWasExpunged := e.unexpungeLocked() - if err := test.checkFunc(test.want, gotWasExpunged); err != nil { - tt.Errorf("error = %v", err) - } - }) - } -} - -func Test_entryVCache_storeLocked(t *testing.T) { - t.Parallel() - type args struct { - i *vcache - } - type fields struct { - p unsafe.Pointer - } - type want struct{} - type test struct { - name string - args args - fields fields - want want - checkFunc func(want) error - beforeFunc func(args) - afterFunc func(args) - } - defaultCheckFunc := func(w want) error { - return nil - } - tests := []test{ - // TODO test cases - /* - { - name: "test_case_1", - args: args { - i: vcache{}, - }, - fields: fields { - p: nil, - }, - want: want{}, - checkFunc: defaultCheckFunc, - }, - */ - - // TODO test cases - /* - func() test { - return test { - name: "test_case_2", - args: args { - i: vcache{}, - }, - fields: fields { - p: 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 - } - e := &entryVCache{ - p: test.fields.p, - } - - e.storeLocked(test.args.i) - if err := test.checkFunc(test.want); err != nil { - tt.Errorf("error = %v", err) - } - }) - } -} - -func Test_vcaches_Delete(t *testing.T) { - t.Parallel() - type args struct { - key string - } - type fields struct { - length uint64 - mu sync.Mutex - read atomic.Value - dirty map[string]*entryVCache - misses int - } - type want struct{} - type test struct { - name string - args args - fields fields - want want - checkFunc func(want) error - beforeFunc func(args) - afterFunc func(args) - } - defaultCheckFunc := func(w want) error { - return nil - } - tests := []test{ - // TODO test cases - /* - { - name: "test_case_1", - args: args { - key: "", - }, - fields: fields { - length: 0, - mu: sync.Mutex{}, - read: nil, - dirty: nil, - misses: 0, - }, - want: want{}, - checkFunc: defaultCheckFunc, - }, - */ - - // TODO test cases - /* - func() test { - return test { - name: "test_case_2", - args: args { - key: "", - }, - fields: fields { - length: 0, - mu: sync.Mutex{}, - read: nil, - dirty: nil, - misses: 0, - }, - 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 - } - m := &vcaches{ - length: test.fields.length, - mu: test.fields.mu, - read: test.fields.read, - dirty: test.fields.dirty, - misses: test.fields.misses, - } - - m.Delete(test.args.key) - if err := test.checkFunc(test.want); err != nil { - tt.Errorf("error = %v", err) - } - }) - } -} - -func Test_entryVCache_delete(t *testing.T) { - t.Parallel() - type fields struct { - p unsafe.Pointer - } - type want struct { - wantHadValue bool - } - type test struct { - name string - fields fields - want want - checkFunc func(want, bool) error - beforeFunc func() - afterFunc func() - } - defaultCheckFunc := func(w want, gotHadValue bool) error { - if !reflect.DeepEqual(gotHadValue, w.wantHadValue) { - return errors.Errorf("got: \"%#v\",\n\t\t\t\twant: \"%#v\"", gotHadValue, w.wantHadValue) - } - return nil - } - tests := []test{ - // TODO test cases - /* - { - name: "test_case_1", - fields: fields { - p: nil, - }, - want: want{}, - checkFunc: defaultCheckFunc, - }, - */ - - // TODO test cases - /* - func() test { - return test { - name: "test_case_2", - fields: fields { - p: 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 := &entryVCache{ - p: test.fields.p, - } - - gotHadValue := e.delete() - if err := test.checkFunc(test.want, gotHadValue); err != nil { - tt.Errorf("error = %v", err) - } - }) - } -} - -func Test_vcaches_Range(t *testing.T) { - t.Parallel() - type args struct { - f func(key string, value vcache) bool - } - type fields struct { - length uint64 - mu sync.Mutex - read atomic.Value - dirty map[string]*entryVCache - misses int - } - type want struct{} - type test struct { - name string - args args - fields fields - want want - checkFunc func(want) error - beforeFunc func(args) - afterFunc func(args) - } - defaultCheckFunc := func(w want) error { - return nil - } - tests := []test{ - // TODO test cases - /* - { - name: "test_case_1", - args: args { - f: nil, - }, - fields: fields { - length: 0, - mu: sync.Mutex{}, - read: nil, - dirty: nil, - misses: 0, - }, - want: want{}, - checkFunc: defaultCheckFunc, - }, - */ - - // TODO test cases - /* - func() test { - return test { - name: "test_case_2", - args: args { - f: nil, - }, - fields: fields { - length: 0, - mu: sync.Mutex{}, - read: nil, - dirty: nil, - misses: 0, - }, - 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 - } - m := &vcaches{ - length: test.fields.length, - mu: test.fields.mu, - read: test.fields.read, - dirty: test.fields.dirty, - misses: test.fields.misses, - } - - m.Range(test.args.f) - if err := test.checkFunc(test.want); err != nil { - tt.Errorf("error = %v", err) - } - }) - } -} - -func Test_vcaches_missLocked(t *testing.T) { - t.Parallel() - type fields struct { - length uint64 - mu sync.Mutex - read atomic.Value - dirty map[string]*entryVCache - misses int - } - type want struct{} - type test struct { - name string - fields fields - want want - checkFunc func(want) error - beforeFunc func() - afterFunc func() - } - defaultCheckFunc := func(w want) error { - return nil - } - tests := []test{ - // TODO test cases - /* - { - name: "test_case_1", - fields: fields { - length: 0, - mu: sync.Mutex{}, - read: nil, - dirty: nil, - misses: 0, - }, - want: want{}, - checkFunc: defaultCheckFunc, - }, - */ - - // TODO test cases - /* - func() test { - return test { - name: "test_case_2", - fields: fields { - length: 0, - mu: sync.Mutex{}, - read: nil, - dirty: nil, - misses: 0, - }, - 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 := &vcaches{ - length: test.fields.length, - mu: test.fields.mu, - read: test.fields.read, - dirty: test.fields.dirty, - misses: test.fields.misses, - } - - m.missLocked() - if err := test.checkFunc(test.want); err != nil { - tt.Errorf("error = %v", err) - } - }) - } -} - -func Test_vcaches_dirtyLocked(t *testing.T) { - t.Parallel() - type fields struct { - length uint64 - mu sync.Mutex - read atomic.Value - dirty map[string]*entryVCache - misses int - } - type want struct{} - type test struct { - name string - fields fields - want want - checkFunc func(want) error - beforeFunc func() - afterFunc func() - } - defaultCheckFunc := func(w want) error { - return nil - } - tests := []test{ - // TODO test cases - /* - { - name: "test_case_1", - fields: fields { - length: 0, - mu: sync.Mutex{}, - read: nil, - dirty: nil, - misses: 0, - }, - want: want{}, - checkFunc: defaultCheckFunc, - }, - */ - - // TODO test cases - /* - func() test { - return test { - name: "test_case_2", - fields: fields { - length: 0, - mu: sync.Mutex{}, - read: nil, - dirty: nil, - misses: 0, - }, - 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 := &vcaches{ - length: test.fields.length, - mu: test.fields.mu, - read: test.fields.read, - dirty: test.fields.dirty, - misses: test.fields.misses, - } - - m.dirtyLocked() - if err := test.checkFunc(test.want); err != nil { - tt.Errorf("error = %v", err) - } - }) - } -} - -func Test_entryVCache_tryExpungeLocked(t *testing.T) { - t.Parallel() - type fields struct { - p unsafe.Pointer - } - type want struct { - wantIsExpunged bool - } - type test struct { - name string - fields fields - want want - checkFunc func(want, bool) error - beforeFunc func() - afterFunc func() - } - defaultCheckFunc := func(w want, gotIsExpunged bool) error { - if !reflect.DeepEqual(gotIsExpunged, w.wantIsExpunged) { - return errors.Errorf("got: \"%#v\",\n\t\t\t\twant: \"%#v\"", gotIsExpunged, w.wantIsExpunged) - } - return nil - } - tests := []test{ - // TODO test cases - /* - { - name: "test_case_1", - fields: fields { - p: nil, - }, - want: want{}, - checkFunc: defaultCheckFunc, - }, - */ - - // TODO test cases - /* - func() test { - return test { - name: "test_case_2", - fields: fields { - p: 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 := &entryVCache{ - p: test.fields.p, - } - - gotIsExpunged := e.tryExpungeLocked() - if err := test.checkFunc(test.want, gotIsExpunged); err != nil { - tt.Errorf("error = %v", err) - } - }) - } -} - -func Test_vcaches_Len(t *testing.T) { - t.Parallel() - type fields struct { - length uint64 - mu sync.Mutex - read atomic.Value - dirty map[string]*entryVCache - misses int - } - type want struct { - want uint64 - } - type test struct { - name string - fields fields - want want - checkFunc func(want, uint64) error - beforeFunc func() - afterFunc func() - } - defaultCheckFunc := func(w want, got uint64) 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 { - length: 0, - mu: sync.Mutex{}, - read: nil, - dirty: nil, - misses: 0, - }, - want: want{}, - checkFunc: defaultCheckFunc, - }, - */ - - // TODO test cases - /* - func() test { - return test { - name: "test_case_2", - fields: fields { - length: 0, - mu: sync.Mutex{}, - read: nil, - dirty: nil, - misses: 0, - }, - 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 := &vcaches{ - length: test.fields.length, - mu: test.fields.mu, - read: test.fields.read, - dirty: test.fields.dirty, - misses: test.fields.misses, - } - - got := m.Len() - if err := test.checkFunc(test.want, got); err != nil { - tt.Errorf("error = %v", err) - } - }) - } -} diff --git a/pkg/agent/core/ngt/service/vqueue/option.go b/pkg/agent/core/ngt/service/vqueue/option.go new file mode 100644 index 0000000000..3aad6251f4 --- /dev/null +++ b/pkg/agent/core/ngt/service/vqueue/option.go @@ -0,0 +1,82 @@ +// +// 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 vqueue manages the vector cache layer for reducing FFI overhead for fast Agent processing. +package vqueue + +import ( + "github.com/vdaas/vald/internal/errgroup" +) + +type Option func(n *vqueue) error + +var defaultOptions = []Option{ + WithErrGroup(errgroup.Get()), + WithDeleteBufferPoolSize(1000), + WithInsertBufferPoolSize(1000), + WithDeleteBufferSize(100), + WithInsertBufferSize(100), +} + +func WithErrGroup(eg errgroup.Group) Option { + return func(v *vqueue) error { + if eg != nil { + v.eg = eg + } + + return nil + } +} + +func WithInsertBufferSize(size int) Option { + return func(v *vqueue) error { + if size > 0 { + v.ichSize = size + } + + return nil + } +} + +func WithDeleteBufferSize(size int) Option { + return func(v *vqueue) error { + if size > 0 { + v.dchSize = size + } + + return nil + } +} + +func WithInsertBufferPoolSize(size int) Option { + return func(v *vqueue) error { + if size > 0 { + v.iBufSize = size + } + + return nil + } +} + +func WithDeleteBufferPoolSize(size int) Option { + return func(v *vqueue) error { + if size > 0 { + v.dBufSize = size + } + + return nil + } +} diff --git a/pkg/agent/core/ngt/service/vqueue/option_test.go b/pkg/agent/core/ngt/service/vqueue/option_test.go new file mode 100644 index 0000000000..0b7b71ac73 --- /dev/null +++ b/pkg/agent/core/ngt/service/vqueue/option_test.go @@ -0,0 +1,610 @@ +// +// 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 vqueue manages the vector cache layer for reducing FFI overhead for fast Agent processing. +package vqueue + +import ( + "testing" + + "github.com/vdaas/vald/internal/errgroup" + "go.uber.org/goleak" +) + +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) + } + */ + }) + } +} + +func TestWithInsertBufferSize(t *testing.T) { + t.Parallel() + // Change interface type to the type of object you are testing + type T = interface{} + type args struct { + size int + } + 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 { + size: 0, + }, + want: want { + obj: new(T), + }, + }, + */ + + // TODO test cases + /* + func() test { + return test { + name: "test_case_2", + args: args { + size: 0, + }, + 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 := WithInsertBufferSize(test.args.size) + 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 := WithInsertBufferSize(test.args.size) + obj := new(T) + got(obj) + if err := test.checkFunc(test.want, obj); err != nil { + tt.Errorf("error = %v", err) + } + */ + }) + } +} + +func TestWithDeleteBufferSize(t *testing.T) { + t.Parallel() + // Change interface type to the type of object you are testing + type T = interface{} + type args struct { + size int + } + 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 { + size: 0, + }, + want: want { + obj: new(T), + }, + }, + */ + + // TODO test cases + /* + func() test { + return test { + name: "test_case_2", + args: args { + size: 0, + }, + 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 := WithDeleteBufferSize(test.args.size) + 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 := WithDeleteBufferSize(test.args.size) + obj := new(T) + got(obj) + if err := test.checkFunc(test.want, obj); err != nil { + tt.Errorf("error = %v", err) + } + */ + }) + } +} + +func TestWithInsertBufferPoolSize(t *testing.T) { + t.Parallel() + // Change interface type to the type of object you are testing + type T = interface{} + type args struct { + size int + } + 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 { + size: 0, + }, + want: want { + obj: new(T), + }, + }, + */ + + // TODO test cases + /* + func() test { + return test { + name: "test_case_2", + args: args { + size: 0, + }, + 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 := WithInsertBufferPoolSize(test.args.size) + 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 := WithInsertBufferPoolSize(test.args.size) + obj := new(T) + got(obj) + if err := test.checkFunc(test.want, obj); err != nil { + tt.Errorf("error = %v", err) + } + */ + }) + } +} + +func TestWithDeleteBufferPoolSize(t *testing.T) { + t.Parallel() + // Change interface type to the type of object you are testing + type T = interface{} + type args struct { + size int + } + 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 { + size: 0, + }, + want: want { + obj: new(T), + }, + }, + */ + + // TODO test cases + /* + func() test { + return test { + name: "test_case_2", + args: args { + size: 0, + }, + 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 := WithDeleteBufferPoolSize(test.args.size) + 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 := WithDeleteBufferPoolSize(test.args.size) + obj := new(T) + got(obj) + if err := test.checkFunc(test.want, obj); err != nil { + tt.Errorf("error = %v", err) + } + */ + }) + } +} diff --git a/pkg/agent/core/ngt/service/vqueue/queue.go b/pkg/agent/core/ngt/service/vqueue/queue.go new file mode 100644 index 0000000000..82d0085a56 --- /dev/null +++ b/pkg/agent/core/ngt/service/vqueue/queue.go @@ -0,0 +1,350 @@ +// +// 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 vqueue manages the vector cache layer for reducing FFI overhead for fast Agent processing. +package vqueue + +import ( + "context" + "reflect" + "sort" + "sync" + "sync/atomic" + "time" + + "github.com/vdaas/vald/internal/errgroup" + "github.com/vdaas/vald/internal/errors" + "github.com/vdaas/vald/internal/safety" +) + +type Queue interface { + Start(ctx context.Context) (<-chan error, error) + PushInsert(uuid string, vector []float32, date int64) error + PushDelete(uuid string, date int64) error + GetVector(uuid string) ([]float32, bool) + RangePopInsert(ctx context.Context, f func(uuid string, vector []float32) bool) + RangePopDelete(ctx context.Context, f func(uuid string) bool) + IVQLen() int + IVCLen() int + DVQLen() int + DVCLen() int +} + +type vqueue struct { + ich chan index // ich is insert channel + uii []index // uii is un inserted index + imu sync.Mutex // insert mutex + uiim map[string][]float32 // uiim is un inserted index map (this value is used for GetVector operation to return queued vector cache data) + dch chan key // dch is delete channel + udk []key // udk is un deleted key + dmu sync.Mutex // delete mutex + eg errgroup.Group + finalizingInsert atomic.Value + finalizingDelete atomic.Value + closed atomic.Value + + // buffer config + ichSize int + dchSize int + iBufSize int + dBufSize int +} + +type index struct { + uuid string + vector []float32 + date int64 +} + +type key struct { + uuid string + vector []float32 + date int64 +} + +func New(opts ...Option) (Queue, error) { + vq := new(vqueue) + for _, opt := range append(defaultOptions, opts...) { + if err := opt(vq); err != nil { + return nil, errors.ErrOptionFailed(err, reflect.ValueOf(opt)) + } + } + vq.ich = make(chan index, vq.ichSize) + vq.uii = make([]index, 0, vq.iBufSize) + vq.uiim = make(map[string][]float32, vq.iBufSize) + vq.dch = make(chan key, vq.dchSize) + vq.udk = make([]key, 0, vq.dBufSize) + vq.finalizingInsert.Store(false) + vq.finalizingDelete.Store(false) + vq.closed.Store(true) + return vq, nil +} + +func (v *vqueue) Start(ctx context.Context) (<-chan error, error) { + ech := make(chan error, 1) + v.eg.Go(safety.RecoverFunc(func() (err error) { + v.closed.Store(false) + defer v.closed.Store(true) + defer close(ech) + for { + select { + case <-ctx.Done(): + v.finalizingInsert.Store(true) + close(v.ich) + for i := range v.ich { + v.addInsert(i) + } + v.finalizingInsert.Store(false) + err := ctx.Err() + if errors.Is(err, context.Canceled) || errors.Is(err, context.DeadlineExceeded) { + return nil + } + return err + case i := <-v.ich: + v.addInsert(i) + } + } + })) + v.eg.Go(safety.RecoverFunc(func() (err error) { + v.closed.Store(false) + defer v.closed.Store(true) + for { + select { + case <-ctx.Done(): + v.finalizingDelete.Store(true) + close(v.dch) + for d := range v.dch { + v.addDelete(d) + } + v.finalizingDelete.Store(false) + err := ctx.Err() + if errors.Is(err, context.Canceled) || errors.Is(err, context.DeadlineExceeded) { + return nil + } + return err + case d := <-v.dch: + v.addDelete(d) + } + } + })) + return ech, nil +} + +func (v *vqueue) PushInsert(uuid string, vector []float32, date int64) error { + // we have to check this instance's channel bypass daemon is finalizing or not, if in finalizing process we should not send new index to channel + if v.finalizingInsert.Load().(bool) || v.closed.Load().(bool) { + return errors.ErrVQueueFinalizing + } + if date == 0 { + date = time.Now().UnixNano() + } + + v.ich <- index{ + uuid: uuid, + vector: vector, + date: date, + } + return nil +} + +func (v *vqueue) PushDelete(uuid string, date int64) error { + // we have to check this instance's channel bypass daemon is finalizing or not, if in finalizing process we should not send new index to channel + if v.finalizingDelete.Load().(bool) || v.closed.Load().(bool) { + return errors.ErrVQueueFinalizing + } + if date == 0 { + date = time.Now().UnixNano() + } + v.dch <- key{ + uuid: uuid, + date: date, + } + return nil +} + +func (v *vqueue) RangePopInsert(ctx context.Context, f func(uuid string, vector []float32) bool) { + // if finalizing, wait for all insert channel queue processed + for v.finalizingInsert.Load().(bool) { + select { + case <-ctx.Done(): + return + case <-time.After(time.Millisecond * 100): + } + } + for _, idx := range v.flushAndLoadInsert() { + select { + case <-ctx.Done(): + return + default: + if !f(idx.uuid, idx.vector) { + return + } + } + } +} + +func (v *vqueue) RangePopDelete(ctx context.Context, f func(uuid string) bool) { + // if finalizing, wait for all insert & delete channel queue processed + for v.finalizingDelete.Load().(bool) || v.finalizingInsert.Load().(bool) { + select { + case <-ctx.Done(): + return + case <-time.After(time.Millisecond * 100): + } + } + for _, key := range v.flushAndLoadDelete() { + select { + case <-ctx.Done(): + return + default: + if !f(key.uuid) { + return + } + } + } +} + +func (v *vqueue) GetVector(uuid string) ([]float32, bool) { + v.imu.Lock() + vec, ok := v.uiim[uuid] + v.imu.Unlock() + return vec, ok +} + +func (v *vqueue) addInsert(i index) { + v.imu.Lock() + v.uii = append(v.uii, i) + v.uiim[i.uuid] = i.vector + v.imu.Unlock() +} + +func (v *vqueue) addDelete(d key) { + v.dmu.Lock() + v.udk = append(v.udk, d) + v.dmu.Unlock() +} + +func (v *vqueue) flushAndLoadInsert() (uii []index) { + v.imu.Lock() + uii = make([]index, len(v.uii)) + copy(uii, v.uii) + v.uii = v.uii[:0] + v.imu.Unlock() + sort.Slice(uii, func(i, j int) bool { + return uii[i].date > uii[j].date + }) + dup := make(map[string]bool, len(uii)/2) + dl := make([]int, 0, len(uii)/2) + for i, idx := range uii { + v.imu.Lock() + delete(v.uiim, idx.uuid) + v.imu.Unlock() + if dup[idx.uuid] { + dl = append(dl, i) + } else { + dup[idx.uuid] = true + } + } + sort.Sort(sort.Reverse(sort.IntSlice(dl))) + for _, i := range dl { + uii = append(uii[:i], uii[i+1:]...) + } + sort.Slice(uii, func(i, j int) bool { + return uii[i].date < uii[j].date + }) + return uii +} + +func (v *vqueue) flushAndLoadDelete() (udk []key) { + v.dmu.Lock() + udk = make([]key, len(v.udk)) + copy(udk, v.udk) + v.udk = v.udk[:0] + v.dmu.Unlock() + sort.Slice(udk, func(i, j int) bool { + return udk[i].date > udk[j].date + }) + dup := make(map[string]bool, len(udk)/2) + dl := make([]int, 0, len(udk)/2) + for i, idx := range udk { + if dup[idx.uuid] { + dl = append(dl, i) + } else { + dup[idx.uuid] = true + } + } + sort.Sort(sort.Reverse(sort.IntSlice(dl))) + for _, i := range dl { + udk = append(udk[:i], udk[i+1:]...) + } + sort.Slice(udk, func(i, j int) bool { + return udk[i].date < udk[j].date + }) + + udm := make(map[string]int64, len(udk)) + for _, d := range udk { + udm[d.uuid] = d.date + } + dl = dl[:0] + + // In the CreateIndex operation of the NGT Service, the Delete Queue is processed first, and then the Insert Queue is processed, + // so the Insert Queue still contains the old Insert Operation older than the Delete Queue, + // and it is possible that data that was intended to be deleted is registered again. + // For this reason, the data is deleted from the Insert Queue only when retrieving data from the Delete Queue. + // we should check insert vqueue if insert vqueue exists and delete operation date is newer than insert operation date then we should remove insert vqueue's data. + v.imu.Lock() + for i, idx := range v.uii { + // check same uuid & operation date + // if date is equal, it may update operation we shouldn't remove at that time + date, exists := udm[idx.uuid] + if exists && date > idx.date { + dl = append(dl, i) + } + } + v.imu.Unlock() + sort.Sort(sort.Reverse(sort.IntSlice(dl))) + for _, i := range dl { + v.imu.Lock() + // remove unnecessary insert vector queue data + v.uii = append(v.uii[:i], v.uii[i+1:]...) + // remove from existing map + delete(v.uiim, v.uii[i].uuid) + v.imu.Unlock() + } + return udk +} + +func (v *vqueue) IVQLen() (l int) { + v.imu.Lock() + l = len(v.uii) + v.imu.Unlock() + return l +} + +func (v *vqueue) DVQLen() (l int) { + v.dmu.Lock() + l = len(v.udk) + v.dmu.Unlock() + return l +} + +func (v *vqueue) IVCLen() int { + return len(v.ich) +} + +func (v *vqueue) DVCLen() int { + return len(v.dch) +} diff --git a/pkg/agent/core/ngt/service/vqueue/queue_test.go b/pkg/agent/core/ngt/service/vqueue/queue_test.go new file mode 100644 index 0000000000..cc3ececc9d --- /dev/null +++ b/pkg/agent/core/ngt/service/vqueue/queue_test.go @@ -0,0 +1,2038 @@ +// +// 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 vqueue manages the vector cache layer for reducing FFI overhead for fast Agent processing. +package vqueue + +import ( + "context" + "reflect" + "sync" + "sync/atomic" + "testing" + + "github.com/vdaas/vald/internal/errgroup" + "github.com/vdaas/vald/internal/errors" + "go.uber.org/goleak" +) + +func TestNew(t *testing.T) { + t.Parallel() + type args struct { + opts []Option + } + type want struct { + want Queue + err error + } + type test struct { + name string + args args + want want + checkFunc func(want, Queue, error) error + beforeFunc func(args) + afterFunc func(args) + } + defaultCheckFunc := func(w want, got Queue, 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 { + 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 + } + + got, err := New(test.args.opts...) + if err := test.checkFunc(test.want, got, err); err != nil { + tt.Errorf("error = %v", err) + } + }) + } +} + +func Test_vqueue_Start(t *testing.T) { + t.Parallel() + type args struct { + ctx context.Context + } + type fields struct { + ich chan index + uii []index + imu sync.Mutex + uiim map[string][]float32 + dch chan key + udk []key + dmu sync.Mutex + eg errgroup.Group + finalizingInsert atomic.Value + finalizingDelete atomic.Value + closed atomic.Value + ichSize int + dchSize int + iBufSize int + dBufSize int + } + type want struct { + want <-chan error + err error + } + type test struct { + name string + args args + fields fields + want want + checkFunc func(want, <-chan error, error) error + beforeFunc func(args) + afterFunc func(args) + } + defaultCheckFunc := func(w want, got <-chan error, 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, + }, + fields: fields { + ich: nil, + uii: nil, + imu: sync.Mutex{}, + uiim: nil, + dch: nil, + udk: nil, + dmu: sync.Mutex{}, + eg: nil, + finalizingInsert: nil, + finalizingDelete: nil, + closed: nil, + ichSize: 0, + dchSize: 0, + iBufSize: 0, + dBufSize: 0, + }, + want: want{}, + checkFunc: defaultCheckFunc, + }, + */ + + // TODO test cases + /* + func() test { + return test { + name: "test_case_2", + args: args { + ctx: nil, + }, + fields: fields { + ich: nil, + uii: nil, + imu: sync.Mutex{}, + uiim: nil, + dch: nil, + udk: nil, + dmu: sync.Mutex{}, + eg: nil, + finalizingInsert: nil, + finalizingDelete: nil, + closed: nil, + ichSize: 0, + dchSize: 0, + iBufSize: 0, + dBufSize: 0, + }, + 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 + } + v := &vqueue{ + ich: test.fields.ich, + uii: test.fields.uii, + imu: test.fields.imu, + uiim: test.fields.uiim, + dch: test.fields.dch, + udk: test.fields.udk, + dmu: test.fields.dmu, + eg: test.fields.eg, + finalizingInsert: test.fields.finalizingInsert, + finalizingDelete: test.fields.finalizingDelete, + closed: test.fields.closed, + ichSize: test.fields.ichSize, + dchSize: test.fields.dchSize, + iBufSize: test.fields.iBufSize, + dBufSize: test.fields.dBufSize, + } + + got, err := v.Start(test.args.ctx) + if err := test.checkFunc(test.want, got, err); err != nil { + tt.Errorf("error = %v", err) + } + }) + } +} + +func Test_vqueue_PushInsert(t *testing.T) { + t.Parallel() + type args struct { + uuid string + vector []float32 + date int64 + } + type fields struct { + ich chan index + uii []index + imu sync.Mutex + uiim map[string][]float32 + dch chan key + udk []key + dmu sync.Mutex + eg errgroup.Group + finalizingInsert atomic.Value + finalizingDelete atomic.Value + closed atomic.Value + ichSize int + dchSize int + iBufSize int + dBufSize int + } + type want struct { + err error + } + type test struct { + name string + args args + fields fields + 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 { + uuid: "", + vector: nil, + date: 0, + }, + fields: fields { + ich: nil, + uii: nil, + imu: sync.Mutex{}, + uiim: nil, + dch: nil, + udk: nil, + dmu: sync.Mutex{}, + eg: nil, + finalizingInsert: nil, + finalizingDelete: nil, + closed: nil, + ichSize: 0, + dchSize: 0, + iBufSize: 0, + dBufSize: 0, + }, + want: want{}, + checkFunc: defaultCheckFunc, + }, + */ + + // TODO test cases + /* + func() test { + return test { + name: "test_case_2", + args: args { + uuid: "", + vector: nil, + date: 0, + }, + fields: fields { + ich: nil, + uii: nil, + imu: sync.Mutex{}, + uiim: nil, + dch: nil, + udk: nil, + dmu: sync.Mutex{}, + eg: nil, + finalizingInsert: nil, + finalizingDelete: nil, + closed: nil, + ichSize: 0, + dchSize: 0, + iBufSize: 0, + dBufSize: 0, + }, + 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 + } + v := &vqueue{ + ich: test.fields.ich, + uii: test.fields.uii, + imu: test.fields.imu, + uiim: test.fields.uiim, + dch: test.fields.dch, + udk: test.fields.udk, + dmu: test.fields.dmu, + eg: test.fields.eg, + finalizingInsert: test.fields.finalizingInsert, + finalizingDelete: test.fields.finalizingDelete, + closed: test.fields.closed, + ichSize: test.fields.ichSize, + dchSize: test.fields.dchSize, + iBufSize: test.fields.iBufSize, + dBufSize: test.fields.dBufSize, + } + + err := v.PushInsert(test.args.uuid, test.args.vector, test.args.date) + if err := test.checkFunc(test.want, err); err != nil { + tt.Errorf("error = %v", err) + } + }) + } +} + +func Test_vqueue_PushDelete(t *testing.T) { + t.Parallel() + type args struct { + uuid string + date int64 + } + type fields struct { + ich chan index + uii []index + imu sync.Mutex + uiim map[string][]float32 + dch chan key + udk []key + dmu sync.Mutex + eg errgroup.Group + finalizingInsert atomic.Value + finalizingDelete atomic.Value + closed atomic.Value + ichSize int + dchSize int + iBufSize int + dBufSize int + } + type want struct { + err error + } + type test struct { + name string + args args + fields fields + 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 { + uuid: "", + date: 0, + }, + fields: fields { + ich: nil, + uii: nil, + imu: sync.Mutex{}, + uiim: nil, + dch: nil, + udk: nil, + dmu: sync.Mutex{}, + eg: nil, + finalizingInsert: nil, + finalizingDelete: nil, + closed: nil, + ichSize: 0, + dchSize: 0, + iBufSize: 0, + dBufSize: 0, + }, + want: want{}, + checkFunc: defaultCheckFunc, + }, + */ + + // TODO test cases + /* + func() test { + return test { + name: "test_case_2", + args: args { + uuid: "", + date: 0, + }, + fields: fields { + ich: nil, + uii: nil, + imu: sync.Mutex{}, + uiim: nil, + dch: nil, + udk: nil, + dmu: sync.Mutex{}, + eg: nil, + finalizingInsert: nil, + finalizingDelete: nil, + closed: nil, + ichSize: 0, + dchSize: 0, + iBufSize: 0, + dBufSize: 0, + }, + 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 + } + v := &vqueue{ + ich: test.fields.ich, + uii: test.fields.uii, + imu: test.fields.imu, + uiim: test.fields.uiim, + dch: test.fields.dch, + udk: test.fields.udk, + dmu: test.fields.dmu, + eg: test.fields.eg, + finalizingInsert: test.fields.finalizingInsert, + finalizingDelete: test.fields.finalizingDelete, + closed: test.fields.closed, + ichSize: test.fields.ichSize, + dchSize: test.fields.dchSize, + iBufSize: test.fields.iBufSize, + dBufSize: test.fields.dBufSize, + } + + err := v.PushDelete(test.args.uuid, test.args.date) + if err := test.checkFunc(test.want, err); err != nil { + tt.Errorf("error = %v", err) + } + }) + } +} + +func Test_vqueue_RangePopInsert(t *testing.T) { + t.Parallel() + type args struct { + ctx context.Context + f func(uuid string, vector []float32) bool + } + type fields struct { + ich chan index + uii []index + imu sync.Mutex + uiim map[string][]float32 + dch chan key + udk []key + dmu sync.Mutex + eg errgroup.Group + finalizingInsert atomic.Value + finalizingDelete atomic.Value + closed atomic.Value + ichSize int + dchSize int + iBufSize int + dBufSize int + } + type want struct{} + type test struct { + name string + args args + fields fields + want want + checkFunc func(want) error + beforeFunc func(args) + afterFunc func(args) + } + defaultCheckFunc := func(w want) error { + return nil + } + tests := []test{ + // TODO test cases + /* + { + name: "test_case_1", + args: args { + ctx: nil, + f: nil, + }, + fields: fields { + ich: nil, + uii: nil, + imu: sync.Mutex{}, + uiim: nil, + dch: nil, + udk: nil, + dmu: sync.Mutex{}, + eg: nil, + finalizingInsert: nil, + finalizingDelete: nil, + closed: nil, + ichSize: 0, + dchSize: 0, + iBufSize: 0, + dBufSize: 0, + }, + want: want{}, + checkFunc: defaultCheckFunc, + }, + */ + + // TODO test cases + /* + func() test { + return test { + name: "test_case_2", + args: args { + ctx: nil, + f: nil, + }, + fields: fields { + ich: nil, + uii: nil, + imu: sync.Mutex{}, + uiim: nil, + dch: nil, + udk: nil, + dmu: sync.Mutex{}, + eg: nil, + finalizingInsert: nil, + finalizingDelete: nil, + closed: nil, + ichSize: 0, + dchSize: 0, + iBufSize: 0, + dBufSize: 0, + }, + 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 + } + v := &vqueue{ + ich: test.fields.ich, + uii: test.fields.uii, + imu: test.fields.imu, + uiim: test.fields.uiim, + dch: test.fields.dch, + udk: test.fields.udk, + dmu: test.fields.dmu, + eg: test.fields.eg, + finalizingInsert: test.fields.finalizingInsert, + finalizingDelete: test.fields.finalizingDelete, + closed: test.fields.closed, + ichSize: test.fields.ichSize, + dchSize: test.fields.dchSize, + iBufSize: test.fields.iBufSize, + dBufSize: test.fields.dBufSize, + } + + v.RangePopInsert(test.args.ctx, test.args.f) + if err := test.checkFunc(test.want); err != nil { + tt.Errorf("error = %v", err) + } + }) + } +} + +func Test_vqueue_RangePopDelete(t *testing.T) { + t.Parallel() + type args struct { + ctx context.Context + f func(uuid string) bool + } + type fields struct { + ich chan index + uii []index + imu sync.Mutex + uiim map[string][]float32 + dch chan key + udk []key + dmu sync.Mutex + eg errgroup.Group + finalizingInsert atomic.Value + finalizingDelete atomic.Value + closed atomic.Value + ichSize int + dchSize int + iBufSize int + dBufSize int + } + type want struct{} + type test struct { + name string + args args + fields fields + want want + checkFunc func(want) error + beforeFunc func(args) + afterFunc func(args) + } + defaultCheckFunc := func(w want) error { + return nil + } + tests := []test{ + // TODO test cases + /* + { + name: "test_case_1", + args: args { + ctx: nil, + f: nil, + }, + fields: fields { + ich: nil, + uii: nil, + imu: sync.Mutex{}, + uiim: nil, + dch: nil, + udk: nil, + dmu: sync.Mutex{}, + eg: nil, + finalizingInsert: nil, + finalizingDelete: nil, + closed: nil, + ichSize: 0, + dchSize: 0, + iBufSize: 0, + dBufSize: 0, + }, + want: want{}, + checkFunc: defaultCheckFunc, + }, + */ + + // TODO test cases + /* + func() test { + return test { + name: "test_case_2", + args: args { + ctx: nil, + f: nil, + }, + fields: fields { + ich: nil, + uii: nil, + imu: sync.Mutex{}, + uiim: nil, + dch: nil, + udk: nil, + dmu: sync.Mutex{}, + eg: nil, + finalizingInsert: nil, + finalizingDelete: nil, + closed: nil, + ichSize: 0, + dchSize: 0, + iBufSize: 0, + dBufSize: 0, + }, + 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 + } + v := &vqueue{ + ich: test.fields.ich, + uii: test.fields.uii, + imu: test.fields.imu, + uiim: test.fields.uiim, + dch: test.fields.dch, + udk: test.fields.udk, + dmu: test.fields.dmu, + eg: test.fields.eg, + finalizingInsert: test.fields.finalizingInsert, + finalizingDelete: test.fields.finalizingDelete, + closed: test.fields.closed, + ichSize: test.fields.ichSize, + dchSize: test.fields.dchSize, + iBufSize: test.fields.iBufSize, + dBufSize: test.fields.dBufSize, + } + + v.RangePopDelete(test.args.ctx, test.args.f) + if err := test.checkFunc(test.want); err != nil { + tt.Errorf("error = %v", err) + } + }) + } +} + +func Test_vqueue_GetVector(t *testing.T) { + t.Parallel() + type args struct { + uuid string + } + type fields struct { + ich chan index + uii []index + imu sync.Mutex + uiim map[string][]float32 + dch chan key + udk []key + dmu sync.Mutex + eg errgroup.Group + finalizingInsert atomic.Value + finalizingDelete atomic.Value + closed atomic.Value + ichSize int + dchSize int + iBufSize int + dBufSize int + } + type want struct { + want []float32 + want1 bool + } + type test struct { + name string + args args + fields fields + want want + checkFunc func(want, []float32, bool) error + beforeFunc func(args) + afterFunc func(args) + } + defaultCheckFunc := func(w want, got []float32, got1 bool) error { + if !reflect.DeepEqual(got, w.want) { + return errors.Errorf("got: \"%#v\",\n\t\t\t\twant: \"%#v\"", got, w.want) + } + if !reflect.DeepEqual(got1, w.want1) { + return errors.Errorf("got: \"%#v\",\n\t\t\t\twant: \"%#v\"", got1, w.want1) + } + return nil + } + tests := []test{ + // TODO test cases + /* + { + name: "test_case_1", + args: args { + uuid: "", + }, + fields: fields { + ich: nil, + uii: nil, + imu: sync.Mutex{}, + uiim: nil, + dch: nil, + udk: nil, + dmu: sync.Mutex{}, + eg: nil, + finalizingInsert: nil, + finalizingDelete: nil, + closed: nil, + ichSize: 0, + dchSize: 0, + iBufSize: 0, + dBufSize: 0, + }, + want: want{}, + checkFunc: defaultCheckFunc, + }, + */ + + // TODO test cases + /* + func() test { + return test { + name: "test_case_2", + args: args { + uuid: "", + }, + fields: fields { + ich: nil, + uii: nil, + imu: sync.Mutex{}, + uiim: nil, + dch: nil, + udk: nil, + dmu: sync.Mutex{}, + eg: nil, + finalizingInsert: nil, + finalizingDelete: nil, + closed: nil, + ichSize: 0, + dchSize: 0, + iBufSize: 0, + dBufSize: 0, + }, + 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 + } + v := &vqueue{ + ich: test.fields.ich, + uii: test.fields.uii, + imu: test.fields.imu, + uiim: test.fields.uiim, + dch: test.fields.dch, + udk: test.fields.udk, + dmu: test.fields.dmu, + eg: test.fields.eg, + finalizingInsert: test.fields.finalizingInsert, + finalizingDelete: test.fields.finalizingDelete, + closed: test.fields.closed, + ichSize: test.fields.ichSize, + dchSize: test.fields.dchSize, + iBufSize: test.fields.iBufSize, + dBufSize: test.fields.dBufSize, + } + + got, got1 := v.GetVector(test.args.uuid) + if err := test.checkFunc(test.want, got, got1); err != nil { + tt.Errorf("error = %v", err) + } + }) + } +} + +func Test_vqueue_addInsert(t *testing.T) { + t.Parallel() + type args struct { + i index + } + type fields struct { + ich chan index + uii []index + imu sync.Mutex + uiim map[string][]float32 + dch chan key + udk []key + dmu sync.Mutex + eg errgroup.Group + finalizingInsert atomic.Value + finalizingDelete atomic.Value + closed atomic.Value + ichSize int + dchSize int + iBufSize int + dBufSize int + } + type want struct{} + type test struct { + name string + args args + fields fields + want want + checkFunc func(want) error + beforeFunc func(args) + afterFunc func(args) + } + defaultCheckFunc := func(w want) error { + return nil + } + tests := []test{ + // TODO test cases + /* + { + name: "test_case_1", + args: args { + i: index{}, + }, + fields: fields { + ich: nil, + uii: nil, + imu: sync.Mutex{}, + uiim: nil, + dch: nil, + udk: nil, + dmu: sync.Mutex{}, + eg: nil, + finalizingInsert: nil, + finalizingDelete: nil, + closed: nil, + ichSize: 0, + dchSize: 0, + iBufSize: 0, + dBufSize: 0, + }, + want: want{}, + checkFunc: defaultCheckFunc, + }, + */ + + // TODO test cases + /* + func() test { + return test { + name: "test_case_2", + args: args { + i: index{}, + }, + fields: fields { + ich: nil, + uii: nil, + imu: sync.Mutex{}, + uiim: nil, + dch: nil, + udk: nil, + dmu: sync.Mutex{}, + eg: nil, + finalizingInsert: nil, + finalizingDelete: nil, + closed: nil, + ichSize: 0, + dchSize: 0, + iBufSize: 0, + dBufSize: 0, + }, + 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 + } + v := &vqueue{ + ich: test.fields.ich, + uii: test.fields.uii, + imu: test.fields.imu, + uiim: test.fields.uiim, + dch: test.fields.dch, + udk: test.fields.udk, + dmu: test.fields.dmu, + eg: test.fields.eg, + finalizingInsert: test.fields.finalizingInsert, + finalizingDelete: test.fields.finalizingDelete, + closed: test.fields.closed, + ichSize: test.fields.ichSize, + dchSize: test.fields.dchSize, + iBufSize: test.fields.iBufSize, + dBufSize: test.fields.dBufSize, + } + + v.addInsert(test.args.i) + if err := test.checkFunc(test.want); err != nil { + tt.Errorf("error = %v", err) + } + }) + } +} + +func Test_vqueue_addDelete(t *testing.T) { + t.Parallel() + type args struct { + d key + } + type fields struct { + ich chan index + uii []index + imu sync.Mutex + uiim map[string][]float32 + dch chan key + udk []key + dmu sync.Mutex + eg errgroup.Group + finalizingInsert atomic.Value + finalizingDelete atomic.Value + closed atomic.Value + ichSize int + dchSize int + iBufSize int + dBufSize int + } + type want struct{} + type test struct { + name string + args args + fields fields + want want + checkFunc func(want) error + beforeFunc func(args) + afterFunc func(args) + } + defaultCheckFunc := func(w want) error { + return nil + } + tests := []test{ + // TODO test cases + /* + { + name: "test_case_1", + args: args { + d: key{}, + }, + fields: fields { + ich: nil, + uii: nil, + imu: sync.Mutex{}, + uiim: nil, + dch: nil, + udk: nil, + dmu: sync.Mutex{}, + eg: nil, + finalizingInsert: nil, + finalizingDelete: nil, + closed: nil, + ichSize: 0, + dchSize: 0, + iBufSize: 0, + dBufSize: 0, + }, + want: want{}, + checkFunc: defaultCheckFunc, + }, + */ + + // TODO test cases + /* + func() test { + return test { + name: "test_case_2", + args: args { + d: key{}, + }, + fields: fields { + ich: nil, + uii: nil, + imu: sync.Mutex{}, + uiim: nil, + dch: nil, + udk: nil, + dmu: sync.Mutex{}, + eg: nil, + finalizingInsert: nil, + finalizingDelete: nil, + closed: nil, + ichSize: 0, + dchSize: 0, + iBufSize: 0, + dBufSize: 0, + }, + 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 + } + v := &vqueue{ + ich: test.fields.ich, + uii: test.fields.uii, + imu: test.fields.imu, + uiim: test.fields.uiim, + dch: test.fields.dch, + udk: test.fields.udk, + dmu: test.fields.dmu, + eg: test.fields.eg, + finalizingInsert: test.fields.finalizingInsert, + finalizingDelete: test.fields.finalizingDelete, + closed: test.fields.closed, + ichSize: test.fields.ichSize, + dchSize: test.fields.dchSize, + iBufSize: test.fields.iBufSize, + dBufSize: test.fields.dBufSize, + } + + v.addDelete(test.args.d) + if err := test.checkFunc(test.want); err != nil { + tt.Errorf("error = %v", err) + } + }) + } +} + +func Test_vqueue_flushAndLoadInsert(t *testing.T) { + t.Parallel() + type fields struct { + ich chan index + uii []index + imu sync.Mutex + uiim map[string][]float32 + dch chan key + udk []key + dmu sync.Mutex + eg errgroup.Group + finalizingInsert atomic.Value + finalizingDelete atomic.Value + closed atomic.Value + ichSize int + dchSize int + iBufSize int + dBufSize int + } + type want struct { + wantUii []index + } + type test struct { + name string + fields fields + want want + checkFunc func(want, []index) error + beforeFunc func() + afterFunc func() + } + defaultCheckFunc := func(w want, gotUii []index) error { + if !reflect.DeepEqual(gotUii, w.wantUii) { + return errors.Errorf("got: \"%#v\",\n\t\t\t\twant: \"%#v\"", gotUii, w.wantUii) + } + return nil + } + tests := []test{ + // TODO test cases + /* + { + name: "test_case_1", + fields: fields { + ich: nil, + uii: nil, + imu: sync.Mutex{}, + uiim: nil, + dch: nil, + udk: nil, + dmu: sync.Mutex{}, + eg: nil, + finalizingInsert: nil, + finalizingDelete: nil, + closed: nil, + ichSize: 0, + dchSize: 0, + iBufSize: 0, + dBufSize: 0, + }, + want: want{}, + checkFunc: defaultCheckFunc, + }, + */ + + // TODO test cases + /* + func() test { + return test { + name: "test_case_2", + fields: fields { + ich: nil, + uii: nil, + imu: sync.Mutex{}, + uiim: nil, + dch: nil, + udk: nil, + dmu: sync.Mutex{}, + eg: nil, + finalizingInsert: nil, + finalizingDelete: nil, + closed: nil, + ichSize: 0, + dchSize: 0, + iBufSize: 0, + dBufSize: 0, + }, + 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 + } + v := &vqueue{ + ich: test.fields.ich, + uii: test.fields.uii, + imu: test.fields.imu, + uiim: test.fields.uiim, + dch: test.fields.dch, + udk: test.fields.udk, + dmu: test.fields.dmu, + eg: test.fields.eg, + finalizingInsert: test.fields.finalizingInsert, + finalizingDelete: test.fields.finalizingDelete, + closed: test.fields.closed, + ichSize: test.fields.ichSize, + dchSize: test.fields.dchSize, + iBufSize: test.fields.iBufSize, + dBufSize: test.fields.dBufSize, + } + + gotUii := v.flushAndLoadInsert() + if err := test.checkFunc(test.want, gotUii); err != nil { + tt.Errorf("error = %v", err) + } + }) + } +} + +func Test_vqueue_flushAndLoadDelete(t *testing.T) { + t.Parallel() + type fields struct { + ich chan index + uii []index + imu sync.Mutex + uiim map[string][]float32 + dch chan key + udk []key + dmu sync.Mutex + eg errgroup.Group + finalizingInsert atomic.Value + finalizingDelete atomic.Value + closed atomic.Value + ichSize int + dchSize int + iBufSize int + dBufSize int + } + type want struct { + wantUdk []key + } + type test struct { + name string + fields fields + want want + checkFunc func(want, []key) error + beforeFunc func() + afterFunc func() + } + defaultCheckFunc := func(w want, gotUdk []key) error { + if !reflect.DeepEqual(gotUdk, w.wantUdk) { + return errors.Errorf("got: \"%#v\",\n\t\t\t\twant: \"%#v\"", gotUdk, w.wantUdk) + } + return nil + } + tests := []test{ + // TODO test cases + /* + { + name: "test_case_1", + fields: fields { + ich: nil, + uii: nil, + imu: sync.Mutex{}, + uiim: nil, + dch: nil, + udk: nil, + dmu: sync.Mutex{}, + eg: nil, + finalizingInsert: nil, + finalizingDelete: nil, + closed: nil, + ichSize: 0, + dchSize: 0, + iBufSize: 0, + dBufSize: 0, + }, + want: want{}, + checkFunc: defaultCheckFunc, + }, + */ + + // TODO test cases + /* + func() test { + return test { + name: "test_case_2", + fields: fields { + ich: nil, + uii: nil, + imu: sync.Mutex{}, + uiim: nil, + dch: nil, + udk: nil, + dmu: sync.Mutex{}, + eg: nil, + finalizingInsert: nil, + finalizingDelete: nil, + closed: nil, + ichSize: 0, + dchSize: 0, + iBufSize: 0, + dBufSize: 0, + }, + 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 + } + v := &vqueue{ + ich: test.fields.ich, + uii: test.fields.uii, + imu: test.fields.imu, + uiim: test.fields.uiim, + dch: test.fields.dch, + udk: test.fields.udk, + dmu: test.fields.dmu, + eg: test.fields.eg, + finalizingInsert: test.fields.finalizingInsert, + finalizingDelete: test.fields.finalizingDelete, + closed: test.fields.closed, + ichSize: test.fields.ichSize, + dchSize: test.fields.dchSize, + iBufSize: test.fields.iBufSize, + dBufSize: test.fields.dBufSize, + } + + gotUdk := v.flushAndLoadDelete() + if err := test.checkFunc(test.want, gotUdk); err != nil { + tt.Errorf("error = %v", err) + } + }) + } +} + +func Test_vqueue_IVQLen(t *testing.T) { + t.Parallel() + type fields struct { + ich chan index + uii []index + imu sync.Mutex + uiim map[string][]float32 + dch chan key + udk []key + dmu sync.Mutex + eg errgroup.Group + finalizingInsert atomic.Value + finalizingDelete atomic.Value + closed atomic.Value + ichSize int + dchSize int + iBufSize int + dBufSize int + } + type want struct { + wantL int + } + type test struct { + name string + fields fields + want want + checkFunc func(want, int) error + beforeFunc func() + afterFunc func() + } + defaultCheckFunc := func(w want, gotL int) error { + if !reflect.DeepEqual(gotL, w.wantL) { + return errors.Errorf("got: \"%#v\",\n\t\t\t\twant: \"%#v\"", gotL, w.wantL) + } + return nil + } + tests := []test{ + // TODO test cases + /* + { + name: "test_case_1", + fields: fields { + ich: nil, + uii: nil, + imu: sync.Mutex{}, + uiim: nil, + dch: nil, + udk: nil, + dmu: sync.Mutex{}, + eg: nil, + finalizingInsert: nil, + finalizingDelete: nil, + closed: nil, + ichSize: 0, + dchSize: 0, + iBufSize: 0, + dBufSize: 0, + }, + want: want{}, + checkFunc: defaultCheckFunc, + }, + */ + + // TODO test cases + /* + func() test { + return test { + name: "test_case_2", + fields: fields { + ich: nil, + uii: nil, + imu: sync.Mutex{}, + uiim: nil, + dch: nil, + udk: nil, + dmu: sync.Mutex{}, + eg: nil, + finalizingInsert: nil, + finalizingDelete: nil, + closed: nil, + ichSize: 0, + dchSize: 0, + iBufSize: 0, + dBufSize: 0, + }, + 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 + } + v := &vqueue{ + ich: test.fields.ich, + uii: test.fields.uii, + imu: test.fields.imu, + uiim: test.fields.uiim, + dch: test.fields.dch, + udk: test.fields.udk, + dmu: test.fields.dmu, + eg: test.fields.eg, + finalizingInsert: test.fields.finalizingInsert, + finalizingDelete: test.fields.finalizingDelete, + closed: test.fields.closed, + ichSize: test.fields.ichSize, + dchSize: test.fields.dchSize, + iBufSize: test.fields.iBufSize, + dBufSize: test.fields.dBufSize, + } + + gotL := v.IVQLen() + if err := test.checkFunc(test.want, gotL); err != nil { + tt.Errorf("error = %v", err) + } + }) + } +} + +func Test_vqueue_DVQLen(t *testing.T) { + t.Parallel() + type fields struct { + ich chan index + uii []index + imu sync.Mutex + uiim map[string][]float32 + dch chan key + udk []key + dmu sync.Mutex + eg errgroup.Group + finalizingInsert atomic.Value + finalizingDelete atomic.Value + closed atomic.Value + ichSize int + dchSize int + iBufSize int + dBufSize int + } + type want struct { + wantL int + } + type test struct { + name string + fields fields + want want + checkFunc func(want, int) error + beforeFunc func() + afterFunc func() + } + defaultCheckFunc := func(w want, gotL int) error { + if !reflect.DeepEqual(gotL, w.wantL) { + return errors.Errorf("got: \"%#v\",\n\t\t\t\twant: \"%#v\"", gotL, w.wantL) + } + return nil + } + tests := []test{ + // TODO test cases + /* + { + name: "test_case_1", + fields: fields { + ich: nil, + uii: nil, + imu: sync.Mutex{}, + uiim: nil, + dch: nil, + udk: nil, + dmu: sync.Mutex{}, + eg: nil, + finalizingInsert: nil, + finalizingDelete: nil, + closed: nil, + ichSize: 0, + dchSize: 0, + iBufSize: 0, + dBufSize: 0, + }, + want: want{}, + checkFunc: defaultCheckFunc, + }, + */ + + // TODO test cases + /* + func() test { + return test { + name: "test_case_2", + fields: fields { + ich: nil, + uii: nil, + imu: sync.Mutex{}, + uiim: nil, + dch: nil, + udk: nil, + dmu: sync.Mutex{}, + eg: nil, + finalizingInsert: nil, + finalizingDelete: nil, + closed: nil, + ichSize: 0, + dchSize: 0, + iBufSize: 0, + dBufSize: 0, + }, + 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 + } + v := &vqueue{ + ich: test.fields.ich, + uii: test.fields.uii, + imu: test.fields.imu, + uiim: test.fields.uiim, + dch: test.fields.dch, + udk: test.fields.udk, + dmu: test.fields.dmu, + eg: test.fields.eg, + finalizingInsert: test.fields.finalizingInsert, + finalizingDelete: test.fields.finalizingDelete, + closed: test.fields.closed, + ichSize: test.fields.ichSize, + dchSize: test.fields.dchSize, + iBufSize: test.fields.iBufSize, + dBufSize: test.fields.dBufSize, + } + + gotL := v.DVQLen() + if err := test.checkFunc(test.want, gotL); err != nil { + tt.Errorf("error = %v", err) + } + }) + } +} + +func Test_vqueue_IVCLen(t *testing.T) { + t.Parallel() + type fields struct { + ich chan index + uii []index + imu sync.Mutex + uiim map[string][]float32 + dch chan key + udk []key + dmu sync.Mutex + eg errgroup.Group + finalizingInsert atomic.Value + finalizingDelete atomic.Value + closed atomic.Value + ichSize int + dchSize int + iBufSize int + dBufSize int + } + type want struct { + want int + } + type test struct { + name string + fields fields + want want + checkFunc func(want, int) error + beforeFunc func() + afterFunc func() + } + defaultCheckFunc := func(w want, got int) 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 { + ich: nil, + uii: nil, + imu: sync.Mutex{}, + uiim: nil, + dch: nil, + udk: nil, + dmu: sync.Mutex{}, + eg: nil, + finalizingInsert: nil, + finalizingDelete: nil, + closed: nil, + ichSize: 0, + dchSize: 0, + iBufSize: 0, + dBufSize: 0, + }, + want: want{}, + checkFunc: defaultCheckFunc, + }, + */ + + // TODO test cases + /* + func() test { + return test { + name: "test_case_2", + fields: fields { + ich: nil, + uii: nil, + imu: sync.Mutex{}, + uiim: nil, + dch: nil, + udk: nil, + dmu: sync.Mutex{}, + eg: nil, + finalizingInsert: nil, + finalizingDelete: nil, + closed: nil, + ichSize: 0, + dchSize: 0, + iBufSize: 0, + dBufSize: 0, + }, + 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 + } + v := &vqueue{ + ich: test.fields.ich, + uii: test.fields.uii, + imu: test.fields.imu, + uiim: test.fields.uiim, + dch: test.fields.dch, + udk: test.fields.udk, + dmu: test.fields.dmu, + eg: test.fields.eg, + finalizingInsert: test.fields.finalizingInsert, + finalizingDelete: test.fields.finalizingDelete, + closed: test.fields.closed, + ichSize: test.fields.ichSize, + dchSize: test.fields.dchSize, + iBufSize: test.fields.iBufSize, + dBufSize: test.fields.dBufSize, + } + + got := v.IVCLen() + if err := test.checkFunc(test.want, got); err != nil { + tt.Errorf("error = %v", err) + } + }) + } +} + +func Test_vqueue_DVCLen(t *testing.T) { + t.Parallel() + type fields struct { + ich chan index + uii []index + imu sync.Mutex + uiim map[string][]float32 + dch chan key + udk []key + dmu sync.Mutex + eg errgroup.Group + finalizingInsert atomic.Value + finalizingDelete atomic.Value + closed atomic.Value + ichSize int + dchSize int + iBufSize int + dBufSize int + } + type want struct { + want int + } + type test struct { + name string + fields fields + want want + checkFunc func(want, int) error + beforeFunc func() + afterFunc func() + } + defaultCheckFunc := func(w want, got int) 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 { + ich: nil, + uii: nil, + imu: sync.Mutex{}, + uiim: nil, + dch: nil, + udk: nil, + dmu: sync.Mutex{}, + eg: nil, + finalizingInsert: nil, + finalizingDelete: nil, + closed: nil, + ichSize: 0, + dchSize: 0, + iBufSize: 0, + dBufSize: 0, + }, + want: want{}, + checkFunc: defaultCheckFunc, + }, + */ + + // TODO test cases + /* + func() test { + return test { + name: "test_case_2", + fields: fields { + ich: nil, + uii: nil, + imu: sync.Mutex{}, + uiim: nil, + dch: nil, + udk: nil, + dmu: sync.Mutex{}, + eg: nil, + finalizingInsert: nil, + finalizingDelete: nil, + closed: nil, + ichSize: 0, + dchSize: 0, + iBufSize: 0, + dBufSize: 0, + }, + 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 + } + v := &vqueue{ + ich: test.fields.ich, + uii: test.fields.uii, + imu: test.fields.imu, + uiim: test.fields.uiim, + dch: test.fields.dch, + udk: test.fields.udk, + dmu: test.fields.dmu, + eg: test.fields.eg, + finalizingInsert: test.fields.finalizingInsert, + finalizingDelete: test.fields.finalizingDelete, + closed: test.fields.closed, + ichSize: test.fields.ichSize, + dchSize: test.fields.dchSize, + iBufSize: test.fields.iBufSize, + dBufSize: test.fields.dBufSize, + } + + got := v.DVCLen() + if err := test.checkFunc(test.want, got); err != nil { + tt.Errorf("error = %v", err) + } + }) + } +} diff --git a/pkg/discoverer/k8s/service/discover_test.go b/pkg/discoverer/k8s/service/discover_test.go index e350f15101..0351f01b9c 100644 --- a/pkg/discoverer/k8s/service/discover_test.go +++ b/pkg/discoverer/k8s/service/discover_test.go @@ -28,6 +28,7 @@ import ( "github.com/vdaas/vald/internal/errgroup" "github.com/vdaas/vald/internal/errors" "github.com/vdaas/vald/internal/k8s" + "github.com/vdaas/vald/internal/net" "go.uber.org/goleak" ) @@ -127,6 +128,7 @@ func Test_discoverer_Start(t *testing.T) { namespace string name string csd time.Duration + der net.Dialer eg errgroup.Group } type want struct { @@ -173,6 +175,7 @@ func Test_discoverer_Start(t *testing.T) { namespace: "", name: "", csd: nil, + der: nil, eg: nil, }, want: want{}, @@ -202,6 +205,7 @@ func Test_discoverer_Start(t *testing.T) { namespace: "", name: "", csd: nil, + der: nil, eg: nil, }, want: want{}, @@ -239,6 +243,7 @@ func Test_discoverer_Start(t *testing.T) { namespace: test.fields.namespace, name: test.fields.name, csd: test.fields.csd, + der: test.fields.der, eg: test.fields.eg, } @@ -269,6 +274,7 @@ func Test_discoverer_GetPods(t *testing.T) { namespace string name string csd time.Duration + der net.Dialer eg errgroup.Group } type want struct { @@ -315,6 +321,7 @@ func Test_discoverer_GetPods(t *testing.T) { namespace: "", name: "", csd: nil, + der: nil, eg: nil, }, want: want{}, @@ -344,6 +351,7 @@ func Test_discoverer_GetPods(t *testing.T) { namespace: "", name: "", csd: nil, + der: nil, eg: nil, }, want: want{}, @@ -381,6 +389,7 @@ func Test_discoverer_GetPods(t *testing.T) { namespace: test.fields.namespace, name: test.fields.name, csd: test.fields.csd, + der: test.fields.der, eg: test.fields.eg, } @@ -411,6 +420,7 @@ func Test_discoverer_GetNodes(t *testing.T) { namespace string name string csd time.Duration + der net.Dialer eg errgroup.Group } type want struct { @@ -457,6 +467,7 @@ func Test_discoverer_GetNodes(t *testing.T) { namespace: "", name: "", csd: nil, + der: nil, eg: nil, }, want: want{}, @@ -486,6 +497,7 @@ func Test_discoverer_GetNodes(t *testing.T) { namespace: "", name: "", csd: nil, + der: nil, eg: nil, }, want: want{}, @@ -523,6 +535,7 @@ func Test_discoverer_GetNodes(t *testing.T) { namespace: test.fields.namespace, name: test.fields.name, csd: test.fields.csd, + der: test.fields.der, eg: test.fields.eg, } diff --git a/pkg/discoverer/k8s/service/option_test.go b/pkg/discoverer/k8s/service/option_test.go index aa127a6909..4d77139c46 100644 --- a/pkg/discoverer/k8s/service/option_test.go +++ b/pkg/discoverer/k8s/service/option_test.go @@ -25,12 +25,12 @@ import ( "go.uber.org/goleak" ) -func TestWithName(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 { - name string + der net.Dialer } type want struct { obj *T @@ -77,7 +77,7 @@ func TestWithName(t *testing.T) { { name: "test_case_1", args: args { - name: "", + der: nil, }, want: want { obj: new(T), @@ -91,7 +91,7 @@ func TestWithName(t *testing.T) { return test { name: "test_case_2", args: args { - name: "", + der: nil, }, want: want { obj: new(T), @@ -119,7 +119,7 @@ func TestWithName(t *testing.T) { test.checkFunc = defaultCheckFunc } - got := WithName(test.args.name) + got := WithDialer(test.args.der) obj := new(T) if err := test.checkFunc(test.want, obj, got(obj)); err != nil { tt.Errorf("error = %v", err) @@ -131,7 +131,7 @@ func TestWithName(t *testing.T) { if test.checkFunc == nil { test.checkFunc = defaultCheckFunc } - got := WithName(test.args.name) + got := WithDialer(test.args.der) obj := new(T) got(obj) if err := test.checkFunc(test.want, obj); err != nil { @@ -142,12 +142,12 @@ func TestWithName(t *testing.T) { } } -func TestWithNamespace(t *testing.T) { +func TestWithName(t *testing.T) { t.Parallel() // Change interface type to the type of object you are testing type T = interface{} type args struct { - ns string + name string } type want struct { obj *T @@ -194,7 +194,7 @@ func TestWithNamespace(t *testing.T) { { name: "test_case_1", args: args { - ns: "", + name: "", }, want: want { obj: new(T), @@ -208,7 +208,7 @@ func TestWithNamespace(t *testing.T) { return test { name: "test_case_2", args: args { - ns: "", + name: "", }, want: want { obj: new(T), @@ -236,7 +236,7 @@ func TestWithNamespace(t *testing.T) { test.checkFunc = defaultCheckFunc } - got := WithNamespace(test.args.ns) + got := WithName(test.args.name) obj := new(T) if err := test.checkFunc(test.want, obj, got(obj)); err != nil { tt.Errorf("error = %v", err) @@ -248,7 +248,7 @@ func TestWithNamespace(t *testing.T) { if test.checkFunc == nil { test.checkFunc = defaultCheckFunc } - got := WithNamespace(test.args.ns) + got := WithName(test.args.name) obj := new(T) got(obj) if err := test.checkFunc(test.want, obj); err != nil { @@ -259,12 +259,12 @@ func TestWithNamespace(t *testing.T) { } } -func TestWithDiscoverDuration(t *testing.T) { +func TestWithNamespace(t *testing.T) { t.Parallel() // Change interface type to the type of object you are testing type T = interface{} type args struct { - dur string + ns string } type want struct { obj *T @@ -311,7 +311,7 @@ func TestWithDiscoverDuration(t *testing.T) { { name: "test_case_1", args: args { - dur: "", + ns: "", }, want: want { obj: new(T), @@ -325,7 +325,7 @@ func TestWithDiscoverDuration(t *testing.T) { return test { name: "test_case_2", args: args { - dur: "", + ns: "", }, want: want { obj: new(T), @@ -353,7 +353,7 @@ func TestWithDiscoverDuration(t *testing.T) { test.checkFunc = defaultCheckFunc } - got := WithDiscoverDuration(test.args.dur) + got := WithNamespace(test.args.ns) obj := new(T) if err := test.checkFunc(test.want, obj, got(obj)); err != nil { tt.Errorf("error = %v", err) @@ -365,7 +365,7 @@ func TestWithDiscoverDuration(t *testing.T) { if test.checkFunc == nil { test.checkFunc = defaultCheckFunc } - got := WithDiscoverDuration(test.args.dur) + got := WithNamespace(test.args.ns) obj := new(T) got(obj) if err := test.checkFunc(test.want, obj); err != nil { @@ -376,12 +376,12 @@ func TestWithDiscoverDuration(t *testing.T) { } } -func TestWithErrGroup(t *testing.T) { +func TestWithDiscoverDuration(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 + dur string } type want struct { obj *T @@ -428,7 +428,7 @@ func TestWithErrGroup(t *testing.T) { { name: "test_case_1", args: args { - eg: nil, + dur: "", }, want: want { obj: new(T), @@ -442,7 +442,7 @@ func TestWithErrGroup(t *testing.T) { return test { name: "test_case_2", args: args { - eg: nil, + dur: "", }, want: want { obj: new(T), @@ -470,7 +470,7 @@ func TestWithErrGroup(t *testing.T) { test.checkFunc = defaultCheckFunc } - got := WithErrGroup(test.args.eg) + got := WithDiscoverDuration(test.args.dur) obj := new(T) if err := test.checkFunc(test.want, obj, got(obj)); err != nil { tt.Errorf("error = %v", err) @@ -482,7 +482,7 @@ func TestWithErrGroup(t *testing.T) { if test.checkFunc == nil { test.checkFunc = defaultCheckFunc } - got := WithErrGroup(test.args.eg) + got := WithDiscoverDuration(test.args.dur) obj := new(T) got(obj) if err := test.checkFunc(test.want, obj); err != nil { @@ -493,12 +493,12 @@ func TestWithErrGroup(t *testing.T) { } } -func TestWithDialer(t *testing.T) { +func TestWithErrGroup(t *testing.T) { t.Parallel() // Change interface type to the type of object you are testing type T = interface{} type args struct { - der net.Dialer + eg errgroup.Group } type want struct { obj *T @@ -545,7 +545,7 @@ func TestWithDialer(t *testing.T) { { name: "test_case_1", args: args { - der: nil, + eg: nil, }, want: want { obj: new(T), @@ -559,7 +559,7 @@ func TestWithDialer(t *testing.T) { return test { name: "test_case_2", args: args { - der: nil, + eg: nil, }, want: want { obj: new(T), @@ -587,7 +587,7 @@ func TestWithDialer(t *testing.T) { test.checkFunc = defaultCheckFunc } - got := WithDialer(test.args.der) + got := WithErrGroup(test.args.eg) obj := new(T) if err := test.checkFunc(test.want, obj, got(obj)); err != nil { tt.Errorf("error = %v", err) @@ -599,7 +599,7 @@ func TestWithDialer(t *testing.T) { if test.checkFunc == nil { test.checkFunc = defaultCheckFunc } - got := WithDialer(test.args.der) + got := WithErrGroup(test.args.eg) obj := new(T) got(obj) if err := test.checkFunc(test.want, obj); err != nil { diff --git a/pkg/discoverer/k8s/usecase/discovered_test.go b/pkg/discoverer/k8s/usecase/discovered_test.go index a5406f843a..f5520798c5 100644 --- a/pkg/discoverer/k8s/usecase/discovered_test.go +++ b/pkg/discoverer/k8s/usecase/discovered_test.go @@ -23,6 +23,7 @@ import ( "github.com/vdaas/vald/internal/errgroup" "github.com/vdaas/vald/internal/errors" + "github.com/vdaas/vald/internal/net" "github.com/vdaas/vald/internal/observability" "github.com/vdaas/vald/internal/runner" "github.com/vdaas/vald/internal/servers/starter" @@ -121,6 +122,7 @@ func Test_run_PreStart(t *testing.T) { h handler.DiscovererServer server starter.Server observability observability.Observability + der net.Dialer } type want struct { err error @@ -155,6 +157,7 @@ func Test_run_PreStart(t *testing.T) { h: nil, server: nil, observability: nil, + der: nil, }, want: want{}, checkFunc: defaultCheckFunc, @@ -176,6 +179,7 @@ func Test_run_PreStart(t *testing.T) { h: nil, server: nil, observability: nil, + der: nil, }, want: want{}, checkFunc: defaultCheckFunc, @@ -205,6 +209,7 @@ func Test_run_PreStart(t *testing.T) { h: test.fields.h, server: test.fields.server, observability: test.fields.observability, + der: test.fields.der, } err := r.PreStart(test.args.ctx) @@ -227,6 +232,7 @@ func Test_run_Start(t *testing.T) { h handler.DiscovererServer server starter.Server observability observability.Observability + der net.Dialer } type want struct { want <-chan error @@ -265,6 +271,7 @@ func Test_run_Start(t *testing.T) { h: nil, server: nil, observability: nil, + der: nil, }, want: want{}, checkFunc: defaultCheckFunc, @@ -286,6 +293,7 @@ func Test_run_Start(t *testing.T) { h: nil, server: nil, observability: nil, + der: nil, }, want: want{}, checkFunc: defaultCheckFunc, @@ -315,6 +323,7 @@ func Test_run_Start(t *testing.T) { h: test.fields.h, server: test.fields.server, observability: test.fields.observability, + der: test.fields.der, } got, err := r.Start(test.args.ctx) @@ -337,6 +346,7 @@ func Test_run_PreStop(t *testing.T) { h handler.DiscovererServer server starter.Server observability observability.Observability + der net.Dialer } type want struct { err error @@ -371,6 +381,7 @@ func Test_run_PreStop(t *testing.T) { h: nil, server: nil, observability: nil, + der: nil, }, want: want{}, checkFunc: defaultCheckFunc, @@ -392,6 +403,7 @@ func Test_run_PreStop(t *testing.T) { h: nil, server: nil, observability: nil, + der: nil, }, want: want{}, checkFunc: defaultCheckFunc, @@ -421,6 +433,7 @@ func Test_run_PreStop(t *testing.T) { h: test.fields.h, server: test.fields.server, observability: test.fields.observability, + der: test.fields.der, } err := r.PreStop(test.args.ctx) @@ -443,6 +456,7 @@ func Test_run_Stop(t *testing.T) { h handler.DiscovererServer server starter.Server observability observability.Observability + der net.Dialer } type want struct { err error @@ -477,6 +491,7 @@ func Test_run_Stop(t *testing.T) { h: nil, server: nil, observability: nil, + der: nil, }, want: want{}, checkFunc: defaultCheckFunc, @@ -498,6 +513,7 @@ func Test_run_Stop(t *testing.T) { h: nil, server: nil, observability: nil, + der: nil, }, want: want{}, checkFunc: defaultCheckFunc, @@ -527,6 +543,7 @@ func Test_run_Stop(t *testing.T) { h: test.fields.h, server: test.fields.server, observability: test.fields.observability, + der: test.fields.der, } err := r.Stop(test.args.ctx) @@ -549,6 +566,7 @@ func Test_run_PostStop(t *testing.T) { h handler.DiscovererServer server starter.Server observability observability.Observability + der net.Dialer } type want struct { err error @@ -583,6 +601,7 @@ func Test_run_PostStop(t *testing.T) { h: nil, server: nil, observability: nil, + der: nil, }, want: want{}, checkFunc: defaultCheckFunc, @@ -604,6 +623,7 @@ func Test_run_PostStop(t *testing.T) { h: nil, server: nil, observability: nil, + der: nil, }, want: want{}, checkFunc: defaultCheckFunc, @@ -633,6 +653,7 @@ func Test_run_PostStop(t *testing.T) { h: test.fields.h, server: test.fields.server, observability: test.fields.observability, + der: test.fields.der, } err := r.PostStop(test.args.ctx)