diff --git a/charts/navi-async-matrix/README.md b/charts/navi-async-matrix/README.md index ab82fb334..74418d0b1 100644 --- a/charts/navi-async-matrix/README.md +++ b/charts/navi-async-matrix/README.md @@ -52,7 +52,7 @@ See the [documentation](https://docs.2gis.com/en/on-premise/navigation/distance- | Name | Description | Value | | ------------------ | ----------- | ----------------------------------- | | `image.repository` | Repository | `2gis-on-premise/navi-async-matrix` | -| `image.tag` | Tag | `1.11.2` | +| `image.tag` | Tag | `1.12.1` | | `image.pullPolicy` | Pull Policy | `IfNotPresent` | ### Service account settings @@ -139,51 +139,74 @@ See the [documentation](https://docs.2gis.com/en/on-premise/navigation/distance- ### Distance Matrix Async API settings -| Name | Description | Value | -| ----------------------- | ----------------------------------------------------------------------------------------------------------------------------- | ------ | -| `dm.port` | Distance Matrix Async API HTTP port. | `8000` | -| `dm.configType` | Configuration type. Must always be `env`. | `env` | -| `dm.logLevel` | Logging level, one of: DEBUG, INFO, WARNING, ERROR, CRITICAL. | `INFO` | -| `dm.workerCount` | Number of Distance Matrix Async workers. | `4` | -| `dm.citiesUrl` | URL of the information about cities provided by the Navi-Castle service, ex: http://navi-castle.svc/cities.conf. **Required** | `""` | -| `dm.citiesUpdatePeriod` | Period (in seconds) between requesting data from `citiesUrl`. | `3600` | +| Name | Description | Value | +| ---------------------------- | ----------------------------------------------------------------------------------------------------------------------------- | ------ | +| `dm.port` | Distance Matrix Async API HTTP port. | `8000` | +| `dm.configType` | Configuration type. Must always be `env`. | `env` | +| `dm.logLevel` | Logging level, one of: DEBUG, INFO, WARNING, ERROR, CRITICAL. | `INFO` | +| `dm.workerCount` | Number of Distance Matrix Async workers. | `4` | +| `dm.citiesUrl` | URL of the information about cities provided by the Navi-Castle service, ex: http://navi-castle.svc/cities.conf. **Required** | `""` | +| `dm.citiesUpdatePeriod` | Period (in seconds) between requesting data from `citiesUrl`. | `3600` | +| `dm.taskSplitSize` | Minimum size of matrix to get split in archiver job. | `5000` | +| `dm.compositeTaskTimeoutSec` | Timeout for executing split tasks. | `3600` | ### Database settings | Name | Description | Value | | ----------------- | ------------------------------------------- | ------------- | -| `db.host` | PostgreSQL hostname or IP. **Required** | `""` | +| `db.host` | PostgreSQL host. | `""` | | `db.port` | PostgreSQL port. | `5432` | -| `db.name` | PostgreSQL database name. **Required** | `""` | -| `db.user` | PostgreSQL username. **Required** | `""` | -| `db.password` | PostgreSQL password. **Required** | `""` | -| `db.schema` | PostgreSQL schema. | `public` | +| `db.name` | PostgreSQL database name. | `""` | +| `db.user` | PostgreSQL username. | `""` | +| `db.password` | PostgreSQL password. | `""` | +| `db.schema` | PostgreSQL scheme. | `public` | | `db.tls.enabled` | If tls connection to postgresql is enabled. | `false` | | `db.tls.rootCert` | Root certificate file. | `""` | | `db.tls.cert` | Certificate of postgresql server. | `""` | | `db.tls.key` | Key of postgresql server. | `""` | | `db.tls.mode` | Level of protection. | `verify-full` | +### Multi-DC settings + +| Name | Description | Value | +| -------------------------------------- | ----------------------------------------------------------------------------------- | --------------- | +| `multiDc.enabled` | If multi-DC functionality enabled | `false` | +| `multiDc.location` | Primary DC identifier. | `default` | +| `multiDc.redirectHeader` | HTTP header to tell requests original from redirected. Set empty to skip the check. | `""` | +| `multiDc.secondaryTopics.statusTopic` | Name of `statusTopic` in secondary DC. | `status_topic` | +| `multiDc.secondaryTopics.cancelTopic` | Name of `cancelTopic` in secondary DC. | `cancel_topic` | +| `multiDc.secondaryTopics.archiveTopic` | Name of `archiveTopic` in secondary DC. | `archive_topic` | + ### Kafka settings -| Name | Description | Value | -| --------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- | ------------------- | -| `kafka.groupId` | Distance Matrix Async API group identifier. | `navi_async_matrix` | -| `kafka.statusTopic` | Name of the topic for sending new tasks to. | `status_topic` | -| `kafka.cancelTopic` | Name of the topic for canceling or receiving information about finished tasks. | `cancel_topic` | -| `kafka.properties` | Properties as supported by kafka-python. Refer to inline comments for details. | | -| `kafka.sensitiveProperties` | As kafka.properties, but kept in Secrets. Refer to inlines comments for details. | `{}` | -| `kafka.fileProperties` | As kafka.properties, but kept in a file, which passed to application as a filename. Refer to inline comments for details. | `{}` | -| `kafka.consumerOverrides.properties` | Consumer specific properties as simple key-value pairs. | `{}` | -| `kafka.consumerOverrides.sensitiveProperties` | Consumer specific properties mounted as secrets. | `{}` | -| `kafka.consumerOverrides.fileProperties` | Consumer specific properties mounted as regular files. | `{}` | -| `kafka.producerOverrides.properties` | Consumer specific properties as simple key-value pairs. | `{}` | -| `kafka.producerOverrides.sensitiveProperties` | Consumer specific properties mounted as secrets. | `{}` | -| `kafka.producerOverrides.fileProperties` | Consumer specific properties mounted as regular files. | `{}` | -| `kafka.taskTopicRules` | **Information about the topics that Distance Matrix Async API will use to send the requests.** | | -| `kafka.taskTopicRules[].topic` | Name of the topic. | | -| `kafka.taskTopicRules[].default` | If this topic is used for projects by default. | | -| `kafka.taskTopicRules[].projects` | List of projects to use this topic for, e.g., `['moscow']`. | | +| Name | Description | Value | +| --------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- | -------------------- | +| `kafka.groupId` | Distance Matrix Async API group identifier. | `navi_async_matrix` | +| `kafka.statusTopic` | Name of the topic for sending new tasks to. | `status_topic` | +| `kafka.cancelTopic` | Name of the topic for canceling or receiving information about finished tasks. | `cancel_topic` | +| `kafka.archiveTopic` | Name of the topic for archiving tasks. | `archive_topic` | +| `kafka.attractTopic` | Name of the topic for for attract tasks results | `""` | +| `kafka.oneToManyTopic` | Name of the topic for oneToMany tasks results | `""` | +| `kafka.vrpStatusTopic` | Name of the topic for VRP service integration | `""` | +| `kafka.properties` | Properties as supported by kafka-python. Refer to inline comments for details. | | +| `kafka.sensitiveProperties` | As kafka.properties, but kept in Secrets. Refer to inlines comments for details. | `{}` | +| `kafka.fileProperties` | As kafka.properties, but kept in a file, which passed to application as a filename. Refer to inline comments for details. | `{}` | +| `kafka.consumerOverrides.properties` | Consumer specific properties as simple key-value pairs. | `{}` | +| `kafka.consumerOverrides.sensitiveProperties` | Consumer specific properties mounted as secrets. | `{}` | +| `kafka.consumerOverrides.fileProperties` | Consumer specific properties mounted as regular files. | `{}` | +| `kafka.producerOverrides.properties` | Consumer specific properties as simple key-value pairs. | `{}` | +| `kafka.producerOverrides.sensitiveProperties` | Consumer specific properties mounted as secrets. | `{}` | +| `kafka.producerOverrides.fileProperties` | Consumer specific properties mounted as regular files. | `{}` | +| `kafka.taskTopicRules` | **Information about the topics that Distance Matrix Async API will use to send the requests.** | | +| `kafka.taskTopicRules[].topic` | Name of the topic. | | +| `kafka.taskTopicRules[].default` | If this topic is used for projects by default. | | +| `kafka.taskTopicRules[].type` | Routing type for tasks in the topic (`car`, `truck`), defaults to `car` | | +| `kafka.taskTopicRules[].projects` | List of projects to use this topic for, e.g., `['dammam']`. | | +| `kafka.attractTopicRules` | ** Rules to map request type to topic for attract tasks ** | | +| `kafka.attractTopicRules[0].topic` | Name of the topic. | `attract_task_topic` | +| `kafka.attractTopicRules[0].default` | If this topic is used for projects by default. | `true` | +| `kafka.attractTopicRules[0].type` | Routing type for tasks in the topic (`car`, `truck`), defaults to `car` | `car` | +| `kafka.attractTopicRules[0].projects` | List of projects to use this topic for, e.g., `['moscow']`. | | ### S3-compatible storage settings @@ -191,16 +214,18 @@ See the [documentation](https://docs.2gis.com/en/on-premise/navigation/distance- | ----------------- | ---------------------------------------------------------------------------------------------- | ----- | | `s3.host` | S3 endpoint URL, ex: http://async-matrix-s3.host. **Required** | `""` | | `s3.bucket` | S3 bucket name. **Required** | `""` | +| `s3.region` | S3 region. | `""` | | `s3.accessKey` | S3 access key for accessing the bucket. **Required** | `""` | | `s3.secretKey` | S3 secret key for accessing the bucket. **Required** | `""` | -| `s3.publicNetloc` | Announce proxy URL for S3 results instead of s3.url if not empty. Must start with `http(s)://` | `""` | +| `s3.publicNetloc` | Announce proxy URL for S3 results instead of s3.url if not empty. Must start with `http(s)://` | `nil` | ### API keys service -| Name | Description | Value | -| ------------ | --------------------------------------------------------------------------- | ----- | -| `keys.url` | API keys service URL, ex: http://keys-api.svc/service/v1/keys. **Required** | `""` | -| `keys.token` | API token to authorize at the service. **Required** | `""` | +| Name | Description | Value | +| ----------------- | ------------------------------------------------------------------------------ | ----- | +| `keys.url` | API keys service URL, ex: http://keys-api.svc/service/v1/keys. **Required** | `""` | +| `keys.token` | API token to authorize at the service. Required if truck car routing in use. | `""` | +| `keys.truckToken` | Truck API token to authorize at the service. Required if truck routing in use. | `""` | ### customCAs **Custom Certificate Authority** diff --git a/charts/navi-async-matrix/templates/configmap-ca.yaml b/charts/navi-async-matrix/templates/configmap-ca.yaml index 87141aca4..1353d55f8 100644 --- a/charts/navi-async-matrix/templates/configmap-ca.yaml +++ b/charts/navi-async-matrix/templates/configmap-ca.yaml @@ -1,4 +1,3 @@ - {{- if .Values.customCAs.bundle }} apiVersion: v1 kind: ConfigMap diff --git a/charts/navi-async-matrix/templates/configmap.yaml b/charts/navi-async-matrix/templates/configmap.yaml index fbcf74fd4..44d4b2dd5 100644 --- a/charts/navi-async-matrix/templates/configmap.yaml +++ b/charts/navi-async-matrix/templates/configmap.yaml @@ -67,6 +67,10 @@ data: "name": "S3_BUCKET", "value": {{ .Values.s3.bucket | mustToJson }} }, + { + "name": "S3_REGION_NAME", + "value": {{ .Values.s3.region | mustToJson }} + }, { "name": "S3_ACCESS_KEY", "value": {{ .Values.s3.accessKey | mustToJson }} diff --git a/charts/navi-async-matrix/templates/secret.yaml b/charts/navi-async-matrix/templates/secret.yaml index ff9fbe39e..305ef80dc 100644 --- a/charts/navi-async-matrix/templates/secret.yaml +++ b/charts/navi-async-matrix/templates/secret.yaml @@ -19,6 +19,9 @@ data: | b64enc | quote }} s3key: {{ required "A valid .Values.s3.secretKey entry required" .Values.s3.secretKey | b64enc | quote }} dmApiKey: {{ .Values.keys.token | b64enc | quote }} +{{- if .Values.keys.truckToken }} + dmApiTruckKey: {{ .Values.keys.truckToken | b64enc | quote }} +{{- end }} {{- if ( (or .Values.kafka.sensitiveProperties .Values.kafka.fileProperties) | or (or .Values.kafka.consumerOverrides.sensitiveProperties .Values.kafka.consumerOverrides.fileProperties) | diff --git a/charts/navi-async-matrix/templates/statefulset.yaml b/charts/navi-async-matrix/templates/statefulset.yaml index b1a48dd73..76f586697 100644 --- a/charts/navi-async-matrix/templates/statefulset.yaml +++ b/charts/navi-async-matrix/templates/statefulset.yaml @@ -187,6 +187,8 @@ spec: value: {{ required "A valid .Values.s3.host entry required" .Values.s3.host | quote }} - name: DM_ASYNC_SERVICE_STORAGE_SETTING__S3_STORAGE_CONNECTION__S3_BUCKET value: {{ required "A valid .Values.s3.bucket entry required" .Values.s3.bucket | quote }} + - name: DM_ASYNC_SERVICE_STORAGE_SETTING__S3_STORAGE_CONNECTION__REGION_NAME + value: {{ .Values.s3.region | quote }} - name: DM_ASYNC_SERVICE_LOGGER_SETTING__LEVEL value: {{ .Values.dm.logLevel | quote }} {{- if .Values.s3.publicNetloc }} @@ -209,6 +211,22 @@ spec: - name: DM_ASYNC_SERVICE_TOPIC_RULES {{- /* topicRules is a structure, hence mustToJson */}} value: {{ .Values.kafka.taskTopicRules | mustToJson | quote }} + {{- if .Values.kafka.attractTopic }} + - name: DM_ASYNC_SERVICE_KAFKA_CONSUMER_SETTING__KAFKA_CONSUMER_ATTRACT_TOPIC + value: {{ .Values.kafka.attractTopic | quote }} + {{- end }} + {{- if .Values.kafka.oneToManyTopic }} + - name: DM_ASYNC_SERVICE_KAFKA_CONSUMER_SETTING__KAFKA_CONSUMER_ONE_TO_MANY_TOPIC + value: {{ .Values.kafka.oneToManyTopic | quote }} + {{- end }} + {{- if .Values.kafka.attractTopicRules }} + - name: DM_ASYNC_SERVICE_ATTRACT_TOPIC_RULES + value: {{ .Values.kafka.attractTopicRules | mustToJson | quote }} + {{- end }} + {{- if .Values.kafka.vrpStatusTopic }} + - name: DM_ASYNC_SERVICE_SUBSCRIBER_TOPIC + value: {{ .Values.kafka.vrpStatusTopic | quote }} + {{- end }} {{- if .Values.dm.archiver.enabled }} - name: DM_ASYNC_SERVICE_KAFKA_CONSUMER_SETTING__KAFKA_CONSUMER_ARCHIVE_RESPONSE_TOPIC value: {{ .Values.kafka.archiveTopic | quote }} @@ -228,6 +246,20 @@ spec: - name: DM_ASYNC_SERVICE_COMPOSITE_TASK_TIMEOUT_IN_SECONDS value: {{ .Values.dm.compositeTaskTimeoutSec | quote }} {{- end }}{{- /* .Values.dm.archiver.enabled */}} + {{- if .Values.multiDc.enabled }} + - name: DM_ASYNC_SERVICE_APP__LOCATION + value: {{ .Values.multiDc.location | quote }} + - name: DM_ASYNC_SERVICE_REDIRECT_HEADER + value: {{ .Values.multiDc.redirectHeader | default "" | quote }} + - name: DM_ASYNC_SERVICE_KAFKA_CONSUMER_SETTING__KAFKA_CONSUMER_SYNC_TASK_TOPIC + value: {{ .Values.multiDc.secondaryTopics.statusTopic | quote }} + - name: DM_ASYNC_SERVICE_KAFKA_CONSUMER_SETTING__KAFKA_CONSUMER_SYNC_CANCEL_TOPIC + value: {{ .Values.multiDc.secondaryTopics.cancelTopic | quote }} + {{- if .Values.dm.archiver.enabled }} + - name: DM_ASYNC_SERVICE_KAFKA_CONSUMER_SETTING__KAFKA_CONSUMER_SYNC_ARCHIVE_RESPONSE_TOPIC + value: {{ .Values.multiDc.secondaryTopics.archiveTopic | quote }} + {{- end }}{{- /* .Values.dm.archiver.enabled */}} + {{- end }}{{- /* .Values.kafka.secondaryTopics */}} - name: DM_ASYNC_SERVICE_NODE_ID valueFrom: fieldRef: @@ -276,6 +308,13 @@ spec: secretKeyRef: name: {{ include "navi-async-matrix.fullname" . | quote }} key: dmApiKey + {{- if .Values.keys.truckToken }} + - name: DM_ASYNC_SERVICE_KMS__TRUCK_DM_ASYNC_TOKEN + valueFrom: + secretKeyRef: + name: {{ include "navi-async-matrix.fullname" . | quote }} + key: dmApiTruckKey + {{- end }} {{- if .Values.customCAs.bundle }} - name: SSL_CERT_FILE value: {{ include "custom.ca.mountPath" . }}/custom-ca.crt diff --git a/charts/navi-async-matrix/values.yaml b/charts/navi-async-matrix/values.yaml index 7569c1393..331267f8b 100644 --- a/charts/navi-async-matrix/values.yaml +++ b/charts/navi-async-matrix/values.yaml @@ -51,7 +51,7 @@ prometheusEnabled: true image: repository: 2gis-on-premise/navi-async-matrix pullPolicy: IfNotPresent - tag: 1.11.2 + tag: 1.12.1 # @section Service account settings @@ -193,8 +193,8 @@ vpa: # @param dm.workerCount Number of Distance Matrix Async workers. # @param dm.citiesUrl URL of the information about cities provided by the Navi-Castle service, ex: http://navi-castle.svc/cities.conf. **Required** # @param dm.citiesUpdatePeriod Period (in seconds) between requesting data from `citiesUrl`. -# @skip dm.taskSplitSize -# @skip dm.compositeTaskTimeoutSec +# @param dm.taskSplitSize Minimum size of matrix to get split in archiver job. +# @param dm.compositeTaskTimeoutSec Timeout for executing split tasks. # @skip dm.host # @skip dm.archiver # @skip dm.labels @@ -218,12 +218,12 @@ dm: # @section Database settings -# @param db.host PostgreSQL hostname or IP. **Required** +# @param db.host PostgreSQL host. # @param db.port PostgreSQL port. -# @param db.name PostgreSQL database name. **Required** -# @param db.user PostgreSQL username. **Required** -# @param db.password PostgreSQL password. **Required** -# @param db.schema PostgreSQL schema. +# @param db.name PostgreSQL database name. +# @param db.user PostgreSQL username. +# @param db.password PostgreSQL password. +# @param db.schema PostgreSQL scheme. # @param db.tls.enabled If tls connection to postgresql is enabled. # @param db.tls.rootCert Root certificate file. # @param db.tls.cert Certificate of postgresql server. @@ -245,12 +245,34 @@ db: mode: verify-full +# @section Multi-DC settings + +# @param multiDc.enabled If multi-DC functionality enabled +# @param multiDc.location Primary DC identifier. +# @param multiDc.redirectHeader HTTP header to tell requests original from redirected. Set empty to skip the check. +# @param multiDc.secondaryTopics.statusTopic Name of `statusTopic` in secondary DC. +# @param multiDc.secondaryTopics.cancelTopic Name of `cancelTopic` in secondary DC. +# @param multiDc.secondaryTopics.archiveTopic Name of `archiveTopic` in secondary DC. + +multiDc: + enabled: false + location: default + redirectHeader: '' + secondaryTopics: + statusTopic: status_topic + cancelTopic: cancel_topic + archiveTopic: archive_topic + + # @section Kafka settings # @param kafka.groupId Distance Matrix Async API group identifier. # @param kafka.statusTopic Name of the topic for sending new tasks to. # @param kafka.cancelTopic Name of the topic for canceling or receiving information about finished tasks. -# @skip kafka.archiveTopic +# @param kafka.archiveTopic Name of the topic for archiving tasks. +# @param kafka.attractTopic Name of the topic for for attract tasks results +# @param kafka.oneToManyTopic Name of the topic for oneToMany tasks results +# @param kafka.vrpStatusTopic Name of the topic for VRP service integration # @extra kafka.properties Properties as supported by kafka-python. Refer to inline comments for details. # @skip kafka.properties.bootstrap.servers # @skip kafka.properties.security.protocol @@ -265,15 +287,31 @@ db: # @extra kafka.taskTopicRules **Information about the topics that Distance Matrix Async API will use to send the requests.** # @extra kafka.taskTopicRules[].topic Name of the topic. # @extra kafka.taskTopicRules[].default If this topic is used for projects by default. -# @extra kafka.taskTopicRules[].projects List of projects to use this topic for, e.g., `['moscow']`. +# @extra kafka.taskTopicRules[].type Routing type for tasks in the topic (`car`, `truck`), defaults to `car` +# @extra kafka.taskTopicRules[].projects List of projects to use this topic for, e.g., `['dammam']`. # @skip kafka.taskTopicRules[0].topic +# @skip kafka.taskTopicRules[0].type # @skip kafka.taskTopicRules[0].default +# @skip kafka.taskTopicRules[1].topic +# @skip kafka.taskTopicRules[1].type +# @skip kafka.taskTopicRules[1].default +# @skip kafka.taskTopicRules[2].topic +# @skip kafka.taskTopicRules[2].type +# @skip kafka.taskTopicRules[2].projects +# @extra kafka.attractTopicRules ** Rules to map request type to topic for attract tasks ** +# @param kafka.attractTopicRules[0].topic Name of the topic. +# @param kafka.attractTopicRules[0].default If this topic is used for projects by default. +# @param kafka.attractTopicRules[0].type Routing type for tasks in the topic (`car`, `truck`), defaults to `car` +# @extra kafka.attractTopicRules[0].projects List of projects to use this topic for, e.g., `['moscow']`. kafka: groupId: navi_async_matrix statusTopic: status_topic cancelTopic: cancel_topic archiveTopic: archive_topic + attractTopic: '' + oneToManyTopic: '' + vrpStatusTopic: '' properties: bootstrap.servers: '' security.protocol: PLAINTEXT @@ -289,10 +327,16 @@ kafka: fileProperties: {} taskTopicRules: - topic: task_topic + type: car default: true # - topic: task_topic_moscow + # type: car # projects: # - moscow + attractTopicRules: + - topic: attract_task_topic + type: car + default: true # More on Kafka properties. # @@ -326,30 +370,29 @@ kafka: # 1. SSL authentication with key file protected with password 'password': # # properties: -# bootstrap.servers: kafka.host:9092 +# bootstrap.servers: async-matrix-api.host:9092 # security.protocol: SSL -# ssl.check.hostname: '' # sensitiveProperties: -# ssl.password: 'password' +# ssl.password: "password" # fileProperties: -# ssl.cafile: '' -# ssl.certfile: '' -# ssl.keyfile: '' +# ssl.cafile: "" +# ssl.certfile: "" +# ssl.keyfile: "" # # 2. login/password SASL as kafkauser/123: # # properties: -# bootstrap.servers: kafka.host:9092 +# bootstrap.servers: async-matrix-api.host:9092 # security.protocol: SASL_PLAINTEXT # sasl.mechanism: SCRAM-SHA-512 # sasl.plain.username: user # sensitiveProperties: -# sasl.plain.password: 'password' +# sasl.plain.password: "password" # # 3. Unauthenticated: # # properties: -# bootstrap.servers: kafka.host:9092 +# bootstrap.servers: async-matrix-api.host:9092 # security.protocol: PLAINTEXT # # Note that .p12 or .jks formats are not supported, they need to be @@ -361,6 +404,7 @@ kafka: # @param s3.host S3 endpoint URL, ex: http://async-matrix-s3.host. **Required** # @param s3.bucket S3 bucket name. **Required** +# @param s3.region S3 region. # @param s3.accessKey S3 access key for accessing the bucket. **Required** # @param s3.secretKey S3 secret key for accessing the bucket. **Required** # @param s3.publicNetloc Announce proxy URL for S3 results instead of s3.url if not empty. Must start with `http(s)://` @@ -368,9 +412,10 @@ kafka: s3: host: '' bucket: '' + region: '' accessKey: '' secretKey: '' - publicNetloc: '' + publicNetloc: # @skip bss.enabled # @skip bss.url @@ -384,11 +429,13 @@ bss: # @section API keys service # @param keys.url API keys service URL, ex: http://keys-api.svc/service/v1/keys. **Required** -# @param keys.token API token to authorize at the service. **Required** +# @param keys.token API token to authorize at the service. Required if truck car routing in use. +# @param keys.truckToken Truck API token to authorize at the service. Required if truck routing in use. keys: url: '' token: '' + truckToken: '' # @section customCAs **Custom Certificate Authority**