{"$schema":"https://json-schema.org/draft/2020-12/schema","title":"VDI Stack Configuration Schema","description":"Description/documentation for the schema of the VDI core stack configuration YAML file.\n\nThe root of the config file is a map with the keys listed below.","type":"object","properties":{"containerCore":{"$ref":"#/$defs/container-core;core-config.json"},"vdi":{"$ref":"#/$defs/vdi;core-service.json"},"definitions":{"title":"Shared Value Definitions","description":"Object that may be used to hold common $defs that may be referenced elsewhere in the config file using YAML anchors and aliases.","type":"object"},"$schema":{"type":"string","format":"uri"}},"required":["containerCore","vdi"],"$defs":{"vdi;components;object-store.json":{"title":"Object Store Connection Config","type":"object","properties":{"bucketName":{"type":"string"},"server":{"oneOf":[{"$ref":"#/$defs/common.json;addressString"},{"$ref":"#/$defs/common.json;addressObject"}]},"https":{"type":"boolean","default":true},"accessToken":{"type":"string","minLength":3},"secretKey":{"type":"string","minLength":8}},"required":["bucketName","server","accessToken","secretKey"],"additionalProperties":false},"vdi;components;rabbitmq.json;connection":{"type":"object","properties":{"name":{"title":"Connection Name","description":"Used in RabbitMQ error logging in the RabbitMQ instance as well as the RabbitMQ Java library.","type":"string","default":"vdi"},"server":{"title":"RabbitMQ Server Details","description":"Port defaults to `5671` with TLS enabled, or `5672` with TLS disabled.","oneOf":[{"$ref":"#/$defs/common.json;addressString"},{"$ref":"#/$defs/common.json;addressObject"}],"examples":["rabbit.site.com","rabbit.site.com:5671",{"host":"rabbit.site.com"},{"host":"rabbit.site.com","port":"5672"}]},"username":{"type":"string","minLength":3},"password":{"type":"string","minLength":3},"tls":{"type":"boolean","default":true},"timeout":{"$ref":"#/$defs/common.json;duration","default":"10s"}},"required":["server","username","password"],"additionalProperties":false},"vdi;components;rabbitmq.json;exchange":{"type":"object","properties":{"name":{"type":"string","minLength":3},"type":{"enum":["direct","fanout","topic"],"default":"direct"},"autoDelete":{"type":"boolean","default":false},"durable":{"type":"boolean","default":true},"arguments":{"type":"object","additionalProperties":{"type":"string"}}},"required":["name"],"additionalProperties":false},"vdi;components;rabbitmq.json;queue":{"type":"object","properties":{"name":{"type":"string","minLength":3},"autoDelete":{"type":"boolean","default":false},"durable":{"type":"boolean","default":true},"exclusive":{"type":"boolean","default":false},"arguments":{"type":"object","additionalProperties":{"type":"string"}}},"required":["name"],"additionalProperties":false},"vdi;components;rabbitmq.json;routing":{"type":"object","properties":{"key":{"type":"string","minLength":3},"arguments":{"type":"object","additionalProperties":{"type":"string"}}},"additionalProperties":false},"vdi;components;rabbitmq.json":{"title":"RabbitMQ Configuration","type":"object","properties":{"pollInterval":{"$ref":"#/$defs/common.json;duration","default":"1s"},"connection":{"$ref":"#/$defs/vdi;components;rabbitmq.json;connection"},"exchange":{"$ref":"#/$defs/vdi;components;rabbitmq.json;exchange"},"queue":{"$ref":"#/$defs/vdi;components;rabbitmq.json;queue"},"routing":{"$ref":"#/$defs/vdi;components;rabbitmq.json;routing"}},"required":["connection","exchange","queue"],"additionalProperties":false},"vdi;components;plugin-map.json":{"title":"Plugin Registration","description":"Map of plugin definitions.\n\nThese map keys are not significant to VDI, they are only used for logging and human reference.","type":"object","additionalProperties":{"$ref":"#/$defs/vdi;components;plugin.json"},"minProperties":1,"unevaluatedItems":false},"vdi;components;kafka.json;consumers":{"type":"object","properties":{"autoCommitInterval":{"$ref":"#/$defs/common.json;duration","default":"5s"},"autoOffsetReset":{"enum":["earliest","latest","none"],"default":"earliest"},"connectionsMaxIdle":{"$ref":"#/$defs/common.json;duration","default":"9m"},"groupId":{"type":"string","default":"vdi-kafka-consumers"},"groupInstanceId":{"type":"string","default":null},"defaultApiTimeout":{"$ref":"#/$defs/common.json;duration","default":"1m"},"enableAutoCommit":{"type":"boolean","default":true},"fetchMaxBytes":{"type":"integer","minimum":0,"default":52428800},"fetchMinBytes":{"type":"integer","minimum":0,"default":1},"heartbeatInterval":{"$ref":"#/$defs/common.json;duration","default":"3s"},"maxPollInterval":{"$ref":"#/$defs/common.json;duration","default":"5m"},"maxPollRecords":{"type":"integer","minimum":0,"default":500},"pollDuration":{"$ref":"#/$defs/common.json;duration","default":"2s"},"receiveBufferSize":{"type":"integer","minimum":-1,"default":65536},"reconnectBackoffMaxTime":{"$ref":"#/$defs/common.json;duration","default":"1s"},"reconnectBackoffTime":{"$ref":"#/$defs/common.json;duration","default":"50ms"},"requestTimeout":{"$ref":"#/$defs/common.json;duration","default":"30s"},"retryBackoffTime":{"$ref":"#/$defs/common.json;duration","default":"100ms"},"sendBufferSize":{"type":"integer","minimum":-1,"default":131072},"sessionTimeout":{"$ref":"#/$defs/common.json;duration","default":"45s"}},"additionalProperties":false},"vdi;components;kafka.json;producers":{"type":"object","properties":{"bufferMemory":{"type":"integer","minimum":0,"default":33554432},"compressionType":{"enum":["none","gzip","snappy","lz4","zstd"],"default":"none"},"sendRetries":{"type":"integer","minimum":0,"maximum":2147483647,"default":2147483647},"batchSize":{"type":"integer","minimum":0,"default":16384},"connectionsMaxIdle":{"$ref":"#/$defs/common.json;duration","default":"9m"},"deliveryTimeout":{"$ref":"#/$defs/common.json;duration","default":"2m"},"lingerTime":{"$ref":"#/$defs/common.json;duration","default":"5ms"},"maxBlockingTimeout":{"$ref":"#/$defs/common.json;duration","default":"1m"},"maxRequestSize":{"type":"integer","minimum":0,"default":1048576},"receiveBufferSize":{"type":"integer","default":32768,"minimum":-1},"requestTimeout":{"$ref":"#/$defs/common.json;duration","default":"30s"},"sendBufferSize":{"type":"integer","minimum":-1,"default":131072},"reconnectBackoffMaxTime":{"$ref":"#/$defs/common.json;duration","default":"1s"},"reconnectBackoffTime":{"$ref":"#/$defs/common.json;duration","default":"50ms"},"retryBackoffTime":{"$ref":"#/$defs/common.json;duration","default":"100ms"}},"additionalProperties":false},"vdi;components;kafka.json":{"title":"Kafka Configuration","type":"object","properties":{"servers":{"type":"array","items":{"oneOf":[{"$ref":"#/$defs/common.json;addressString"},{"$ref":"#/$defs/common.json;addressObject"}]},"unevaluatedItems":false},"consumers":{"$ref":"#/$defs/vdi;components;kafka.json;consumers"},"producers":{"$ref":"#/$defs/vdi;components;kafka.json;producers"}},"required":["servers"],"additionalProperties":false},"vdi;components;lanes;update-meta.json":{"title":"Dataset Metadata Upsert Lane Config","type":"object","properties":{"kafkaConsumerId":{"$ref":"#/$defs/vdi;components;lanes;lane-common.json;kafkaConsumerId","default":"update-meta-lane-receive"},"kafkaProducerId":{"$ref":"#/$defs/vdi;components;lanes;lane-common.json;kafkaProducerId","default":"update-meta-lane-send"},"inMemoryQueueSize":{"$ref":"#/$defs/vdi;components;lanes;lane-common.json;inMemoryQueueSize","default":5},"workerCount":{"$ref":"#/$defs/vdi;components;lanes;lane-common.json;workerCount","default":5},"eventChannel":{"$ref":"#/$defs/vdi;components;lanes;lane-common.json;eventChannel","default":"update-meta-triggers"},"eventKey":{"$ref":"#/$defs/vdi;components;lanes;lane-common.json;eventKey","default":"update-meta-trigger"}},"unevaluatedProperties":false},"vdi;components;daemons;pruner.json":{"title":"Dataset Pruner Config","type":"object","properties":{"retentionWindow":{"title":"Deleted Dataset Retention Window","$ref":"#/$defs/common.json;duration","default":"30d"},"pruneInterval":{"title":"Pruning Interval","description":"Interval at which the dataset pruner will prune deleted datasets that have been marked as deleted for longer than the configured retention window.","$ref":"#/$defs/common.json;duration","default":"6h"},"wakeInterval":{"title":"Wakeup Interval","description":"Interval at which the pruner will wake up and check for a service shutdown signal.","$ref":"#/$defs/common.json;duration","default":"2s"}},"additionalProperties":false},"vdi;components;lanes;hard-delete.json":{"title":"Hard Delete Lane Config","type":"object","properties":{"kafkaConsumerId":{"$ref":"#/$defs/vdi;components;lanes;lane-common.json;kafkaConsumerId","default":"hard-delete-lane-receive"},"inMemoryQueueSize":{"$ref":"#/$defs/vdi;components;lanes;lane-common.json;inMemoryQueueSize","default":10},"workerCount":{"$ref":"#/$defs/vdi;components;lanes;lane-common.json;workerCount","default":10},"eventChannel":{"$ref":"#/$defs/vdi;components;lanes;lane-common.json;eventChannel","default":"hard-delete-triggers"},"eventKey":{"$ref":"#/$defs/vdi;components;lanes;lane-common.json;eventKey","default":"hard-delete-trigger"}},"unevaluatedProperties":false},"vdi;components;plugin.json;scriptConfig":{"type":"object","properties":{"maxDuration":{"title":"Maximum Script Execution Time","$ref":"#/$defs/common.json;duration"},"pathOverride":{"title":"Script Path Override","$ref":"#/$defs/vdi;components;plugin.json;scriptPath"}},"additionalProperties":false},"vdi;components;plugin.json;scriptPath":{"type":"string","format":"uri-reference","examples":["/opt/vpdb/bin/import.sh"]},"vdi;components;plugin.json":{"title":"VDI Plugin Config","type":"object","properties":{"server":{"title":"Plugin Server Host Address","description":"Address of the plugin HTTP server.  Most likely the VDI-internal network alias of the container.","oneOf":[{"$ref":"#/$defs/common.json;addressString"},{"$ref":"#/$defs/common.json;addressObject"}]},"dataTypes":{"title":"Data Types","description":"Types and versions of dataset data handled by the plugin being defined.","type":"array","items":{"$ref":"#/$defs/vdi;components;data-type.json"},"minItems":1,"uniqueItems":true,"unevaluatedItems":false},"customPath":{"title":"PATH Extension","description":"Allows adding additional paths to the PATH environment variable passed to plugin scripts on execution in the typical colon (`:`) divided format.\nLeading or trailing colon characters are not required.","type":"string","examples":["/opt/something/bin:/opt/other/bin"]},"installRoot":{"title":"Dataset File Install Root","description":"The root mount path INSIDE THE CONTAINER which will contain the site build directory hierarchy into which dataset files will be installed.  The build directory itself MUST NOT be part of this path.","type":"string","format":"uri-reference","default":"/datasets","examples":["/datasets"]},"scripts":{"type":"object","properties":{"checkCompatibility":{"title":"Data Compatibility Test","$ref":"#/$defs/vdi;components;plugin.json;scriptConfig"},"dataCleaning":{"title":"Data Import/Cleanup","$ref":"#/$defs/vdi;components;plugin.json;scriptConfig"},"dataInstall":{"title":"Data Installation","$ref":"#/$defs/vdi;components;plugin.json;scriptConfig"},"metaUpdate":{"title":"Dataset Metadata Upsert","$ref":"#/$defs/vdi;components;plugin.json;scriptConfig"},"uninstall":{"title":"Dataset Uninstallation","$ref":"#/$defs/vdi;components;plugin.json;scriptConfig"}},"additionalProperties":false}},"required":["server","dataTypes"],"additionalProperties":false},"vdi;components;lanes;install.json":{"title":"Data Installation Lane Config","type":"object","properties":{"kafkaConsumerId":{"$ref":"#/$defs/vdi;components;lanes;lane-common.json;kafkaConsumerId","default":"install-data-lane-receive"},"inMemoryQueueSize":{"$ref":"#/$defs/vdi;components;lanes;lane-common.json;inMemoryQueueSize","default":5},"workerCount":{"$ref":"#/$defs/vdi;components;lanes;lane-common.json;workerCount","default":5},"eventChannel":{"$ref":"#/$defs/vdi;components;lanes;lane-common.json;eventChannel","default":"install-triggers"},"eventKey":{"$ref":"#/$defs/vdi;components;lanes;lane-common.json;eventKey","default":"install-trigger"}},"unevaluatedProperties":false},"vdi;components;daemons;reconciler.json":{"title":"Dataset Reconciler Config","type":"object","properties":{"enabled":{"title":"Enable Automatic Reconciliation","description":"Whether the reconciler daemon should be active.\nFor developing or running locally against a shared install-target, this should likely be set to `false` to avoid accidentally breaking other developers' test data.","type":"boolean","default":true},"fullRunInterval":{"title":"Full Reconciliation Interval","description":"Interval at which a full synchronization of all dataset install targets will be performed.","$ref":"#/$defs/common.json;duration","default":"6h"},"slimRunInterval":{"title":"Slim Reconciliation Interval","description":"Interval at which a synchronization of the internal cache database will be executed.  This is needed to accommodate for MinIO lacking the S3 event-on-replication feature.","$ref":"#/$defs/common.json;duration","default":"5m"},"performDeletes":{"title":"Uninstall Missing Datasets","description":"Whether the reconciler should attempt to uninstall datasets that are absent from the object store.\nWhen testing or running locally against a shared install-target, this should be set to `false` to avoid breaking other developers' test data.","type":"boolean","default":true}},"additionalProperties":false},"vdi;components;install-target.json":{"title":"Dataset Installation Target","type":"object","properties":{"enabled":{"title":"Enabled","description":"Whether the install target should be enabled for use in the VDI service.","type":"boolean","default":true},"targetId":{"$ref":"#/$defs/common.json;installTarget"},"targetName":{"title":"Install Target Display Name","description":"Optional display name for an install target, used when the install target ID differs from the name users should see.\n\nDefaults to the same value as `targetId`","type":"string","minLength":3,"maxLength":128},"datasetFileRoot":{"title":"Dataset File Root","description":"Alternative dataset file installation root directory to be used instead of `siteBuild` when constructing dataset directory paths.","type":"string","minLength":3},"dataTypes":{"title":"Supported Data Types","description":"Optional list of data types that the install target supports.\n\nDefaults to supporting all data types from any plugins enabled for the install target.","oneOf":[{"title":"Specific Data Types","type":"array","items":{"$ref":"#/$defs/vdi;components;data-type.json;baseDataType","unevaluatedProperties":false},"unevaluatedItems":false,"uniqueItems":true,"minItems":1},{"title":"Catch-All","type":"array","items":{"const":"*"},"minItems":1,"maxItems":1,"unevaluatedItems":false}],"default":["*"]},"controlDb":{"$comment":"type defined in 'allOf' block below","title":"Dataset Control Database/Schema"},"dataDb":{"$comment":"type defined in 'allOf' block below","title":"Dataset Data Database/Schema"},"metaValidation":{"description":"Additional JSON schema validation to apply to metadata for this install target.","$ref":"https://json-schema.org/draft/2020-12/schema"}},"allOf":[{"if":{"oneOf":[{"title":"Explicitly Enabled","description":"The `enabled` field is explicitly set to `true`.","properties":{"enabled":{"const":true}}},{"title":"Enabled by Default","description":"The `enabled` field is omitted, using the default value of `true`.","not":{"properties":{"enabled":{}}}}]},"then":{"properties":{"controlDb":{"$ref":"#/$defs/common.json;database"},"dataDb":{"$ref":"#/$defs/common.json;database"}},"required":["targetId","controlDb","dataDb"]}}],"unevaluatedProperties":false},"vdi;core-service.json;cacheDb":{"type":"object","properties":{"server":{"oneOf":[{"$ref":"#/$defs/common.json;addressString"},{"$ref":"#/$defs/common.json;addressObject"}]},"username":{"type":"string","minLength":3},"password":{"type":"string","minLength":3},"name":{"type":"string","minLength":3,"default":"vdi"},"poolSize":{"type":"integer","minimum":1,"maximum":32,"default":5}},"required":["server","username","password"]},"vdi;core-service.json":{"title":"VDI Plugin Configuration Schema","type":"object","properties":{"cacheDb":{"$ref":"#/$defs/vdi;core-service.json;cacheDb"},"restService":{"$ref":"#/$defs/vdi;components;rest-service.json"},"daemons":{"type":"object","properties":{"eventRouter":{"$ref":"#/$defs/vdi;components;daemons;event-router.json"},"pruner":{"$ref":"#/$defs/vdi;components;daemons;pruner.json"},"reconciler":{"$ref":"#/$defs/vdi;components;daemons;reconciler.json"}},"additionalProperties":false},"kafka":{"$ref":"#/$defs/vdi;components;kafka.json"},"lanes":{"type":"object","properties":{"hardDelete":{"$ref":"#/$defs/vdi;components;lanes;hard-delete.json"},"import":{"$ref":"#/$defs/vdi;components;lanes;import.json"},"install":{"$ref":"#/$defs/vdi;components;lanes;install.json"},"reconciliation":{"$ref":"#/$defs/vdi;components;lanes;reconciliation.json"},"sharing":{"$ref":"#/$defs/vdi;components;lanes;sharing.json"},"softDelete":{"$ref":"#/$defs/vdi;components;lanes;soft-delete.json"},"updateMeta":{"$ref":"#/$defs/vdi;components;lanes;update-meta.json"}}},"ldap":{"$ref":"#/$defs/common.json;ldap"},"objectStore":{"$ref":"#/$defs/vdi;components;object-store.json"},"plugins":{"$ref":"#/$defs/vdi;components;plugin-map.json"},"rabbit":{"type":"object","properties":{"global":{"$ref":"#/$defs/vdi;components;rabbitmq.json"}},"required":["global"],"additionalProperties":false},"siteBuild":{"title":"Site Build Directory Name","description":"Name of the parent directory containing the per-project dataset files subdirectories.\n\nThis directory name will be used to form paths such as `{siteBuild}/{installTarget}/{datasetId}`.","type":"string","examples":["build-65"]},"sharedTargetDbPooling":{"title":"Shared Install-Target Connection Pool Options","description":"Configuration options for database connection pools that are shared between multiple install-targets.","type":"object","additionalProperties":false,"properties":{"poolSize":{"title":"Maximum Connection Pool Size","type":"integer","minimum":5,"maximum":255,"default":20},"idleTimeout":{"title":"Idle Connection Timeout","description":"Maximum time an idle connection is allowed to live before being removed from the pool.","$ref":"#/$defs/common.json;duration","default":"10m"}}},"installTargets":{"title":"Dataset Installation Targets","type":"array","items":{"$ref":"#/$defs/vdi;components;install-target.json"},"minItems":1,"unevaluatedItems":false,"uniqueItems":true}},"unevaluatedProperties":false,"required":["cacheDb","kafka","objectStore","plugins","rabbit","siteBuild","installTargets"]},"vdi;components;data-type.json;baseDataType":{"type":"object","properties":{"name":{"title":"Internal Name","type":"string","minLength":3},"version":{"oneOf":[{"type":"string","minLength":1},{"type":"number","minimum":0}]}},"required":["name","version"]},"vdi;components;data-type.json":{"title":"VDI Data-Type Config","type":"object","allOf":[{"$ref":"#/$defs/vdi;components;data-type.json;baseDataType"}],"properties":{"name":{"title":"Internal Name","type":"string","minLength":3},"version":{"oneOf":[{"type":"string","minLength":1},{"type":"number","minimum":0}]},"category":{"title":"Data Type Category/Display Name","type":"string","minLength":3},"typeChangesEnabled":{"description":"Whether datasets can be revised from this data type to another.","type":"boolean","default":false},"maxFileSize":{"title":"Maximum File Size","description":"Maximum permitted file size in bytes.\n\nIf this value exceeds the global max upload size configuration option, that value will be used instead.","type":"integer","minimum":0,"maximum":9223372036854775807},"allowedFileExtensions":{"title":"Permitted File Extensions","description":"File extensions that are allowed on raw uploaded files, or on the content files of archive uploads.\n\nThis list should not include the supported vdi archive extensions.","type":"array","items":{"type":"string","pattern":"\\..+"},"uniqueItems":true,"unevaluatedItems":false},"usesDataProperties":{"title":"Enable Data Properties Files","description":"Flag indicating whether the data type allows the use of additional data properties/metadata files.","type":"boolean","default":false},"projectIds":{"type":"array","items":{"$ref":"#/$defs/common.json;installTarget"},"unevaluatedItems":false}},"required":["category"],"unevaluatedProperties":false},"vdi;components;daemons;event-router.json":{"title":"Object Store Event Demuxer Config","type":"object","properties":{"kafkaProducerId":{"title":"Kafka Producer ID","description":"Identifier the event router will announce itself with when publishing events to Kafka.","type":"string","default":"event-router","minLength":3,"maxLength":32}},"additionalProperties":false},"vdi;components;lanes;import.json":{"title":"Data Preprocessing Lane Config","type":"object","properties":{"kafkaConsumerId":{"$ref":"#/$defs/vdi;components;lanes;lane-common.json;kafkaConsumerId","default":"import-lane-receive"},"inMemoryQueueSize":{"$ref":"#/$defs/vdi;components;lanes;lane-common.json;inMemoryQueueSize","default":10},"workerCount":{"$ref":"#/$defs/vdi;components;lanes;lane-common.json;workerCount","default":10},"eventChannel":{"$ref":"#/$defs/vdi;components;lanes;lane-common.json;eventChannel","default":"import-triggers"},"eventKey":{"$ref":"#/$defs/vdi;components;lanes;lane-common.json;eventKey","default":"import-trigger"}},"unevaluatedProperties":false},"vdi;components;lanes;lane-common.json;kafkaConsumerId":{"title":"Kafka Consumer ID","description":"Name the lane will identify itself with when fetching events from Kafka.","type":"string","minLength":3,"maxLength":32},"vdi;components;lanes;lane-common.json;inMemoryQueueSize":{"title":"In-Memory Job Queue Size","description":"Number of jobs that should be pulled from the event channel and kept in memory for processing.  If there is a service shutdown, the in-memory jobs may be lost and need to be re-queued by the reconciler.","type":"integer","minimum":1,"maximum":100},"vdi;components;lanes;lane-common.json;workerCount":{"title":"Worker Count","description":"Number of worker coroutines that should be actively processing events.","type":"integer","minimum":1,"maximum":20},"vdi;components;lanes;lane-common.json;eventChannel":{"title":"Event Channel Name","description":"Name of the event channel (topic) the lane will subscribe to.","type":"string","minLength":3,"maxLength":32},"vdi;components;lanes;lane-common.json;eventKey":{"title":"Event Message Key","description":"Message key used to filter events.","type":"string","minLength":3,"maxLength":32},"vdi;components;lanes;lane-common.json;kafkaProducerId":{"title":"Kafka Producer ID","description":"Name the lane will identify itself with when publishing events to Kafka.","type":"string","minLength":3,"maxLength":32},"vdi;components;lanes;lane-common.json":{"title":"Common Lane Config Options"},"vdi;components;lanes;soft-delete.json":{"title":"Soft Delete Lane Config","type":"object","properties":{"kafkaConsumerId":{"$ref":"#/$defs/vdi;components;lanes;lane-common.json;kafkaConsumerId","default":"soft-delete-lane-receive"},"inMemoryQueueSize":{"$ref":"#/$defs/vdi;components;lanes;lane-common.json;inMemoryQueueSize","default":5},"workerCount":{"$ref":"#/$defs/vdi;components;lanes;lane-common.json;workerCount","default":5},"eventChannel":{"$ref":"#/$defs/vdi;components;lanes;lane-common.json;eventChannel","default":"soft-delete-triggers"},"eventKey":{"$ref":"#/$defs/vdi;components;lanes;lane-common.json;eventKey","default":"soft-delete-trigger"}},"unevaluatedProperties":false},"vdi;components;lanes;sharing.json":{"title":"Dataset Share Lane Config","type":"object","properties":{"kafkaConsumerId":{"$ref":"#/$defs/vdi;components;lanes;lane-common.json;kafkaConsumerId","default":"share-lane-receive"},"inMemoryQueueSize":{"$ref":"#/$defs/vdi;components;lanes;lane-common.json;inMemoryQueueSize","default":10},"workerCount":{"$ref":"#/$defs/vdi;components;lanes;lane-common.json;workerCount","default":10},"eventChannel":{"$ref":"#/$defs/vdi;components;lanes;lane-common.json;eventChannel","default":"share-triggers"},"eventKey":{"$ref":"#/$defs/vdi;components;lanes;lane-common.json;eventKey","default":"share-trigger"}},"unevaluatedProperties":false},"common.json;addressCsv":{"title":"Comma Separated Address List","type":"string","pattern":"^(?:(?=[\\da-zA-Z.-]{1,253}(?::|,|$))([\\da-zA-Z][\\da-zA-Z-]{0,62}(?:\\.[\\da-zA-Z][\\da-zA-Z-]{0,62})*)(?::([1-9]\\d{0,3}|[1-5]\\d{4}|6(?:[0-4]\\d{3}|5(?:[0-4]\\d{2}|5(?:[0-2]\\d|3[0-5])))))?(?:,(?=.+)|$))+$","examples":["something:8080,foo.com","foo.com,apple-service:9001"]},"common.json;addressObject":{"title":"Address Config Object","type":"object","properties":{"host":{"$ref":"#/$defs/common.json;host"},"port":{"$ref":"#/$defs/common.json;port"}},"unevaluatedProperties":false,"examples":[{"host":"abc.def.com","port":1234},{"host":"abc.def.com"}],"required":["host"]},"common.json;addressString":{"title":"Host Address String","type":"string","pattern":"^(?=[\\da-zA-Z.-]{1,253}(?::|$))([\\da-zA-Z][\\da-zA-Z-]{0,62}(?:\\.[\\da-zA-Z][\\da-zA-Z-]{0,62})*)(?::([1-9]\\d{0,3}|[1-5]\\d{4}|6(?:[0-4]\\d{3}|5(?:[0-4]\\d{2}|5(?:[0-2]\\d|3[0-5])))))?$","examples":["something:8080","foo.com:1234","portless.host.string"]},"common.json;database":{"title":"Database Connection Config","type":"object","allOf":[{"title":"Basic Options","properties":{"username":{"type":"string","minLength":3},"password":{"type":"string","minLength":8},"poolSize":{"type":"integer","minimum":5,"maximum":32,"default":5},"schema":{"description":"Target database schema name.  If not provided, the username value is used.","type":"string","minLength":3},"idleTimeout":{"title":"Idle Connection Timeout","description":"Maximum time an idle connection is allowed to live before being removed from the pool.","$ref":"#/$defs/common.json;duration","default":"10m"}},"required":["username","password"]},{"title":"Connection Details","oneOf":[{"title":"LDAP Common Name","properties":{"lookupCn":{"type":"string","minLength":3}},"required":["lookupCn"]},{"title":"Direct Connection Config","properties":{"server":{"title":"Database Host Details","oneOf":[{"$ref":"#/$defs/common.json;addressString"},{"$ref":"#/$defs/common.json;addressObject"}]},"name":{"title":"Database/Userspace Name","type":"string"},"platform":{"enum":["oracle","postgres"],"default":null}},"required":["server","name","platform"]}]}],"unevaluatedProperties":false},"common.json;duration":{"title":"Duration String","type":"string","pattern":"^(?=.{2,})((?:\\d+d)? ?(?:(?<!\\S)\\d+h)? ?(?:(?<!\\S)\\d+m)? ?(?:(?<!\\S)\\d+(?:\\.\\d+s$|s))? ?(?:(?<!\\S)\\d+(?:\\.\\d+ms$|ms))? ?(?:(?<!\\S)\\d+(?:\\.\\d+us$|us))? ?(?:(?<!\\S)\\d+ns)?)$","examples":["1d 12h 32m 30.340s","12s","1h 22us 5ns"]},"common.json;host":{"title":"Hostname String","type":"string","pattern":"^(?=[\\da-zA-Z.-]{1,253}$)([\\da-zA-Z][\\da-zA-Z-]{0,62}(?:\\.[\\da-zA-Z][\\da-zA-Z-]{0,62})*)$","minLength":1,"maxLength":253},"common.json;installTarget":{"title":"Dataset Installation Target","enum":["AmoebaDB","ClinEpiDB","CryptoDB","DataExplorer","FungiDB","GiardiaDB","HostDB","MicrobiomeDB","MicrosporidiaDB","OrthoMCL","PiroplasmaDB","PlasmoDB","ToxoDB","TrichDB","TriTrypDB","VectorBase","UniDB"]},"common.json;ldap":{"title":"LDAP Connection Configuration","type":"object","properties":{"servers":{"title":"LDAP Server List","description":"List of servers that container core will use to lookup database details.  Servers will be tried in the order they are defined.","oneOf":[{"title":"Host Strings","type":"array","items":{"$ref":"#/$defs/common.json;addressString"},"unevaluatedItems":false},{"title":"Host Details","type":"array","items":{"$ref":"#/$defs/common.json;addressObject"},"unevaluatedItems":false},{"$ref":"#/$defs/common.json;addressCsv"}]},"baseDn":{"type":"string"}},"required":["servers","baseDn"],"unevaluatedProperties":false},"common.json;port":{"title":"Connection Port","type":"integer","minimum":1,"maximum":65535},"common.json":{},"vdi;components;rest-service.json":{"title":"VDI Rest Service Config","type":"object","properties":{"maxUploadSize":{"title":"Max Dataset Upload Size","description":"Maximum allowed size, in bytes, for an individual dataset data upload request.\n\nDefaults to 1GiB.","type":"integer","minimum":1048576,"default":1073741824},"userMaxStorageSize":{"title":"Max User Storage Quota","description":"Maximum allowed total storage usage, in bytes, for raw user upload files.\n\nDefaults to 10GiB","type":"integer","minimum":1073741824,"default":10737418240},"enableJerseyTrace":{"title":"Enable Trace Response Headers","type":"boolean","default":false}},"unevaluatedProperties":false},"vdi;components;lanes;reconciliation.json":{"title":"Dataset Reconciliation Lane Config","type":"object","properties":{"kafkaConsumerId":{"$ref":"#/$defs/vdi;components;lanes;lane-common.json;kafkaConsumerId","default":"reconciliation-lane-receive"},"kafkaProducerId":{"$ref":"#/$defs/vdi;components;lanes;lane-common.json;kafkaProducerId","default":"reconciliation-lane-send"},"inMemoryQueueSize":{"$ref":"#/$defs/vdi;components;lanes;lane-common.json;inMemoryQueueSize","default":10},"workerCount":{"$ref":"#/$defs/vdi;components;lanes;lane-common.json;workerCount","default":10},"eventChannel":{"$ref":"#/$defs/vdi;components;lanes;lane-common.json;eventChannel","default":"reconciliation-triggers"},"eventKey":{"$ref":"#/$defs/vdi;components;lanes;lane-common.json;eventKey","default":"reconciliation-trigger"}},"unevaluatedProperties":false},"container-core;core-config.json;altAuthentication":{"title":"Service Authentication Config","properties":{"adminToken":{"type":"string","minLength":32},"oauth":{"$ref":"#/$defs/container-core;core-config.json;oauth"}},"required":["adminToken","oauth"],"additionalProperties":false},"container-core;core-config.json;http":{"title":"HTTP Server Config","type":"object","properties":{"enableCors":{"title":"Enable Cross-Origin Resource Sharing","type":"boolean","default":false},"bindPort":{"title":"HTTP Server Port Binding","$ref":"#/$defs/common.json;port","default":80}}},"container-core;core-config.json;oauth":{"title":"OAuth Connection Config","type":"object","properties":{"clientId":{"type":"string","minLength":3},"clientSecret":{"type":"string","minLength":3},"url":{"type":"string","format":"uri"},"keystoreFile":{"type":"string","format":"uri-reference"},"keystorePass":{"type":"string"}},"required":["clientId","clientSecret","url"]},"container-core;core-config.json":{"title":"Container Core Library Config","type":"object","properties":{"ldap":{"$ref":"#/$defs/common.json;ldap"},"authentication":{"$ref":"#/$defs/container-core;core-config.json;altAuthentication"},"http":{"$ref":"#/$defs/container-core;core-config.json;http"},"databases":{"type":"object","properties":{"accountDb":{"$ref":"#/$defs/common.json;database"},"appDb":{"$ref":"#/$defs/common.json;database"},"userDb":{"$ref":"#/$defs/common.json;database"}}}},"required":["authentication"],"additionalProperties":false}}}