Project

General

Profile

Cluster configuration » History » Version 27

Tom Clegg, 04/24/2019 01:00 PM

1 1 Tom Clegg
h1. Cluster configuration
2
3 18 Tom Clegg
We are (2019) consolidating configuration from per-microservice yaml/json/ini files into a single cluster configuration document that is used by all components.
4 1 Tom Clegg
* Long term: system nodes automatically keep their configs synchronized (using something like consul).
5
* Short term: sysadmin uses tools like puppet and terraform to ensure /etc/arvados/config.yml is identical on all system nodes.
6
* Hosts without config files (e.g., hosts outside the cluster) can retrieve the config document from the API server.
7
8
h2. Discovery document
9
10
Previously, we copied selected config values from the API server config into the API discovery document so clients could see them. When clients can get the configuration document itself, this won't be needed. The discovery document should advertise APIs provided by the server, not cluster configuration.
11
12 7 Tom Clegg
h2. Secrets
13
14
Secrets like BlobSigningKey can be given literally in the config file (convenient for dev/test, consul-template, etc) or indirectly using a secret backend. Anticipated backends:
15
* <code class="yaml">BlobSigningKey: foobar</code> &rArr; the secret is literally <code>foobar</code>
16
* <code class="yaml">BlobSigningKey: "vault:foobar"</code> &rArr; the secret can be obtained from vault using the vault key "foobar"
17
* <code class="yaml">BlobSigningKey: "file:/foobar"</code> &rArr; the secret can be read from the local file @/foobar@
18
* <code class="yaml">BlobSigningKey: "env:FOOBAR"</code> &rArr; the secret can be read from the environment variable @FOOBAR@
19
20 22 Tom Clegg
h2. Instructions for ops
21
22 24 Tom Clegg
Tentative instructions for switching config file format/location:
23
# Upgrade Arvados to a version that supports loading all configs from the new cluster-wide config file (maybe 1.4). When services come back up, they will still use your old configuration files, but they will log some deprecation warnings.
24 22 Tom Clegg
# Migrate your configuration to the new config file, one component at a time. For each component:
25
## Restart the component.
26
## Inspect the deprecation warning that is logged at startup. It will tell you either "old config file is superfluous" or "new config file is incomplete".
27
## If your old config file is superfluous, delete it. You're done.
28 23 Tom Clegg
## Run the component with the "--config-diff" flag. This suggests changes to your new config file which will make your old config file obsolete. (Alternatively, run the component with the "--config-dump" flag. This outputs a new config file that would make your old config file obsolete. Saving this might be easier than applying a diff, but it will reorder keys and lose comments.)
29 22 Tom Clegg
## Make the suggested changes.
30 1 Tom Clegg
## Repeat until finished.
31 22 Tom Clegg
# Upgrade to a version that doesn't support old config files at all (maybe 1.5).
32 24 Tom Clegg
33 22 Tom Clegg
34 19 Tom Clegg
h2. Implementation
35 1 Tom Clegg
36 22 Tom Clegg
Development strategy for facilitating the above ops instructions:
37 1 Tom Clegg
# Read the new config file into an internal struct, if the new config file exists.
38
# Copy old config file values into the new config struct.
39 19 Tom Clegg
# Use the new config struct internally (the old config is no longer referenced except in the load-and-copy-to-new-struct step).
40 22 Tom Clegg
# Add a mechanism for showing the effect of the old config file on the resulting config struct (see "--config-diff" above).
41
# At startup, if the old config has any effect (i.e., some parts haven't been migrated to the new config file by the operator), log a deprecation warning recommending "--config-diff" and RTFM.
42 1 Tom Clegg
# Wait one minor version release cycle.
43 19 Tom Clegg
# Error out if the new config file does not exist.
44
# Error out if the old config file exists (...and some parts of the old config are not redundant [optional?]).
45 22 Tom Clegg
46 27 Tom Clegg
h2. Example/template config file
47 1 Tom Clegg
48 26 Peter Amstutz
See also [[Config migration key mapping]]
49
50 1 Tom Clegg
(Format not yet frozen!)
51
52 20 Tom Clegg
Notes:
53
* Keys are CamelCase &mdash; except in special cases like PostgreSQL connection settings, which are passed through to another system without being interpreted by Arvados.
54
* Arrays and lists are not permitted. These cannot be expressed natively in consul, and tend to be troublesome anyway: "what changed?" is harder to answer usefully, significance of duplicate elements is unclear, etc.
55
56 1 Tom Clegg
<pre><code class="yaml">
57
Clusters:
58 27 Tom Clegg
  xyzzy:                     # api-server/uuid_prefix, sso/uuid_prefix
59
    SystemRootToken:         # arvados-git-sync.rb/arvados_api_token, keepstore/SystemAuthTokenFile, c-d-s/AuthToken
60
    ManagementToken:         # {arvados-ws,keepstore,keepproxy,keep-balance}/ManagementToken (& others)
61
    Services:
62
      RailsAPI:
63
        InternalURLs:
64
          "http://zzzzz:8000/": {}            # api-server/(protocol,host,port)
65
        ExternalURL: “https://zzzzz.arvadosapi.com/"
66
        Insecure: false
67
      GitHTTP:
68
        InternalURLs:
69
          "http://git:9001/": {}
70
        ExternalURL: "https://git.zzzzz.arvadosapi.com/" # api-server/git_repo_https_base
71
      Keepstore:
72
        InternalURLs:
73
          "http://keep0:25107/": {Unlisted: true}
74
          "http://keep1:25107/": {Debug: true}
75
      Controller:
76
        InternalURLs:
77
          "http://zzzzz:9004/": {}                       # controller/NodeProfiles.$cluster.Controller.Listen
78
        ExternalURL: "https://zzzzz.arvadosapi.com/"     # composer/apiEndPoint, workbench2/API_HOST, workbench/arvados_{login,v1}_base, arvados-ws/Client, keepproxy/Client
79
      Websocket:
80
        InternalURLs:
81
          "http://ws:9003/": {}                          # arvados-ws/Listen
82
        ExternalURL: "https://ws.zzzzz.arvadosapi.com/"  # api-server/websocket_address
83
      Keepbalance:
84
        InternalURLs:
85
          "http://zzzzz:9005": {}                        # keepbalance/Listen
86
      GitHTTP:
87
        InternalURLs:
88
          "http://zzzzz:9001": {}                        # arvados-git-httpd/Listen
89
        ExternalURL: "https://git.zzzzz.arvadosapi.com/" # api-server/git_repo_https_base
90
      GitSSH:
91
        ExternalURL: "git@git.zzzzz.arvadosapi.com"      # api-server/git_repo_ssh_base
92
      DispatchCloud:
93
        InternalURLs:
94
          "http://zzzzz:9006": {}                        # a-d-c/NodeProfiles
95
      SSO:
96
        ExternalURL: "https://auth.zzzzz.arvadosapi.com/"   # api-server/sso_provider_url
97
      Keepproxy:
98
        InternalURLs:
99
          "http://keep:25107/": {}               # keepproxy/Listen
100
        ExternalURL: "https://keep.zzzzz.arvadosapi.com/"
101
      WebDAV:
102
        InternalURLs:
103
          "http://keep:9002/": {}   # keep-web/Listen
104
        ExternalURL: "https://*.collections.zzzzz.arvadosapi.com/" # api-server/keep_web_service_url, workbench/keep_web_url
105
      WebDAVDownload:
106
        InternalURLs:
107
          "http://keep:9002/": {}   # keep-web/Listen
108
          ExternalURL: "https://download.zzzzz.arvadosapi.com/" # keep-web/AttachmentOnlyHost, workbench/keep_web_download_url
109
      Keepstore:
110
        InternalURLs:
111
          "https://keep0:25107/": {}                            # keepstore/Listen
112
          "https://keep1:25107/": {}                            # keepstore/Listen
113
      Composer:
114
        ExternalURL: "http://composer.zzzzz.arvadosapi.com/"  # workbench/composer_url
115
      WebShell:
116
        ExternalURL: "http://webshell.zzzzz.arvadosapi.com/"  # workbench/shell_in_a_box_url
117
      Workbench1:
118
        InternalURLs:
119
          "http://workbench:9000": {}                               # workbench/Nginx.server.listen
120
        ExternalURL: "http://workbench.zzzzz.arvadosapi.com/" # workbench/Nginx.server.listen, api-server/workbench_address
121
      Workbench2:
122
        ExternalURL: "http://workbench2.zzzzz.arvadosapi.com/" # workbench/workbench2_url
123 1 Tom Clegg
    PostgreSQL:
124 27 Tom Clegg
      Connection:                        # arvados-ws/Postgres, controller/PostgreSQL.Connection
125 1 Tom Clegg
        # All parameters here are passed to the PG client library in a connection string;
126
        # see https://www.postgresql.org/docs/current/static/libpq-connect.html#LIBPQ-PARAMKEYWORDS
127
        Host: localhost
128
        Port: 5432
129
        User: arvados
130
        Password: s3cr3t
131
        DBName: arvados_production
132
        client_encoding: utf8
133
        fallback_application_name: arvados
134 27 Tom Clegg
      ConnectionPool:                    # arvados-ws/PostgresPool
135
    TLS:
136
      Certificate:                       # (literal, file, or acme dir) keepstore/TLSCertificateFile
137
      Key:                               # (literal, file, or acme dir) keepstore/TLSKeyFile
138
      Insecure: true                     # workbench/arvados_insecure_https, api-server/sso_insecure
139
    Git:
140
      GitoliteAdminRepo:       # arvados-git-sync.rb/gitolite_url
141
      GitoliteAdminPublicKey:  # arvados-git-sync.rb/gitolite_arvados_git_user_key
142
      GitoliteSyncWorkDir:     # arvados-git-sync.rb/gitolite_tmp
143
      GitCommand:              # arv-git-httpd/GitCommand
144
      GitoliteHome:            # arv-git-httpd/GitoliteHome
145
      Repositories:            # api-server/git_repositories_dir (crunch1 only; just assume {GitoliteHome}/repositories?)
146
    API:
147
      DisabledAPIs:                     # api-server/disable_api_methods
148
      WebsocketKeepaliveTimeout:        # arvados-ws/PingTimeout
149
      WebsocketClientEventQueue:        # arvados-ws/ClientEventQueue
150
      WebsocketServerEventQueue:        # arvados-ws/ServerEventQueue
151
      KeepServiceRequestTimeout:        # keepproxy/Timeout
152
      MaxMemoryBuffers:                 # keepstore/MaxBuffers
153
      MaxConcurrentRequests:            # keepstore/MaxRequests
154
      MaxRequestSize:                   # api-server/max_request_size
155
      MaxIndexDatabaseRead:             # api-server/max_index_database_read
156
      MaxItemsPerResponse:              # api-server/max_items_per_response, keep-balance/CollectionBatchSize, keep-balance/CollectionBuffers
157
      MaxRequestAmplification:          # controller/RequestLimits.MultiClusterRequestConcurrency
158
      AsyncPermissionsUpdateInterval:   # api-server/async_permissions_update_interval 
159
    Users:
160
      AutoSetupNewUsers:                # api-server/auto_setup_new_users
161
      AutoSetupNewUsersWithVmUUID:      # api-server/auto_setup_new_users_with_vm_uuid
162
      AutoSetupNewUsersWithRepository:  # api-server/auto_setup_new_users_with_repository
163
      AutoSetupUsernameBlacklist:       # api-server/auto_setup_name_blacklist
164
      NewUsersAreActive:                # api-server/new_users_are_active
165
      AutoAdminUserWithEmail:           # api-server/auto_admin_user
166
      AutoAdminFirstUser:               # api-server/auto_admin_first_user
167
      UserProfileNotificationAddress:   # api-server/user_profile_notification_address
168
      AdminNotifierEmailFrom:           # api-server/admin_notifier_email_from
169
      EmailSubjectPrefix:               # api-server/email_subject_prefix
170
      UserNotifierEmailFrom:            # api-server/user_notifier_email_from
171
      NewUserNotificationRecipients:    # api-server/new_user_notification_recipients
172
      NewInactiveUserNotificationRecipients:  # api-server/new_inactive_user_notification_recipients
173
      AnonymousUserToken:               # workbench/anonymous_user_token, keep-web/AnonymousTokens
174
    Login:
175
      SiteTitle:                 # sso/site_title
176
      DefaultLinkTitle:          # sso/default_link_title
177
      DefaultLinkURL:            # sso/default_link_url
178
      AllowAccountRegistration:  # sso/allow_account_registration
179
      RequireEmailConfirmation:  # sso/require_email_confirmation
180
      Google:
181
        ClientID:                # sso/google_oauth2_client_id
182
        ClientSecret:            # sso/google_oauth2_client_secret
183
      LDAP:                      # sso/use_ldap
184
        Title:                   # sso/use_ldap.title
185
        Host:                    # sso/use_ldap.host
186
        Port:                    # sso/use_ldap.port
187
        Method:                  # sso/use_ldap.method
188
        Base:                    # sso/use_ldap.base
189
        Uid:                     # sso/use_ldap.uid
190
        EmailDomain:             # sso/use_ldap.email_domain
191
        BindDN:                  # sso/use_ldap.BindDN
192
        Password:                # sso/user_ldap.password
193
      SecretToken:               # sso/secret_token
194
      ProviderAppSecret:         # api-server/sso_app_secret
195
      ProviderAppID:             # api-server/sso_app_id
196 1 Tom Clegg
    AuditLogs:
197 27 Tom Clegg
      Enable:
198
      MaxAge:                         # api-server/max_audit_log_age
199
      MaxDeleteBatch:                 # api-server/max_audit_log_delete_batch
200
      UnloggedAttributes:             # api-server/unlogged_attributes (applies to logs table)
201
    SystemLogs:
202
      LogLevel:                    # keepstore/Debug, keepproxy/Debug, arvados-ws/LogLevel
203
      Format:                      # keepstore/LogFormat, arvados-ws/LogFormat
204
      MaxRequestLogParamsSize:     # api-server/max_request_log_params_size
205
    Collections:
206
      DefaultReplication:                 # api-server/default_collection_replication, keepproxy/DefaultReplicas
207
      DefaultTrashLifetime:               # api-server/default_trash_lifetime
208
      CollectionVersioning:               # api-server/collection_versioning
209
      PreserveVersionIfIdle:              # api-server/preserve_version_if_idle
210
      TrustAllContent:                    # keep-web/TrustAllContent, workbench/trust_all_content
211
      TrashSweepInterval:                     # api-server/trash_sweep_interval
212
      BlobSigningKey:                         # api-server/blob_signing_key, keepstore/BlobSigningKeyFile
213
      BlobSigningTTL:                         # api-server/blob_signature_ttl, keepstore/BlobSignatureTTL
214
      BlobSigning:                            # keepstore/RequireSignatures, api-server/permit_create_collection_with_unsigned_manifest
215
      BlobTrash:                              # keepstore/EnableDelete
216
      BlobTrashLifetime:                      # keepstore/TrashLifetime
217
      BlobTrashCheckInterval:                 # keepstore/TrashCheckInterval
218
      BlobTrashConcurrency:                   # keepstore/TrashWorkers, keep-balance/-commit-trash
219
      BlobDeleteConcurrency:                  # keepstore/EmptyTrashWorkers
220
      BlobReplicateConcurrency:               # keepstore/PullWorkers, keep-balance/-commit-pulls
221
      KeepBalanceRunPeriod: 10m               # keepbalance/RunPeriod
222
      WebDAVCache:
223
        TTL:                   # keep-web/Cache.TTL
224
        UUIDTTL:               # keep-web/Cache.UUIDTTL
225
        MaxCollectionEntries:  # keep-web/Cache.MaxCollectionEntries
226
        MaxCollectionBytes:    # keep-web/Cache.MaxCollectionBytes
227
        MaxPermissionEntries:  # keep-web/Cache.MaxPermissionEntries
228
        MaxUUIDEntries:        # keep-web/Cache.MaxUUIDEntries
229
    Containers: # control how Arvados runs user containers
230
      SupportedDockerImageFormats:                  # api-server/docker_image_formats
231
      LogReuseDecisions:                            # api-server/log_reuse_decisions
232
      DefaultKeepCacheRAM:                          # api-server/container_default_keep_cache_ram
233
      MaxDispatchAttempts:                          # api-server/max_container_dispatch_attempts
234
      MaxRetryAttempts:                             # api-server/container_count_max
235
      PollInterval: 10s                             # c-d-s/PollPeriod, a-d-c/Dispatch/PollInterval
236
      MinRetryPeriod: 30s                           # c-d-s/MinRetryPeriod (optional? in case ContainerDispatchPollInterval is too short)
237
      CrunchRunCommand: "crunch-run"                # c-d-s/CrunchRunCommand
238
      CrunchRunArguments: ‘[“-cgroup-parent-subsystem=memory”, “-foo=bar”]’     # c-d-s/CrunchRunCommand (should this be named CrunchRunArgumentsJSON?)
239
      ReserveExtraRAM: 256MiB                       # c-d-s/ReserveExtraRAM
240
      UsePreemptibleInstances:                      # api-server/preemptible_instances
241
      MaxComputeVMs:                                # api-server/max_compute_nodes
242
      DispatchPrivateKey:                           # a-d-c/Dispatch/PrivateKey
243
      StaleLockTimeout:                             # a-d-c/Dispatch/StaleLockTimeout
244
      Logging:
245
        LogBytesPerEvent:              # api-server/crunch_log_bytes_per_event
246
        LogSecondsBetweenEvents:       # api-server/crunch_log_seconds_between_events
247
        LogThrottlePeriod:             # api-server/crunch_log_throttle_period
248
        LogThrottleBytes:              # api-server/crunch_log_throttle_bytes
249
        LogThrottleLines:              # api-server/crunch_log_throttle_lines
250
        LimitLogBytesPerJob:           # api-server/crunch_limit_log_bytes_per_job
251
        LogPartialLineThrottlePeriod:  # api-server/crunch_log_partial_line_throttle_period
252
        LogUpdatePeriod:               # api-server/crunch_log_update_period
253
        LogUpdateSize:                 # api-server/crunch_log_update_size
254
        MaxAge:                        # api-server/clean_container_log_rows_after, api-server/clean_job_log_rows_after
255
      CloudVMs:
256
        Enable:                                     # arvados-dispatch-cloud is in use
257
        BootProbeCommand:                           # a-d-c/CloudVMs/BootProbeCommand
258
        ProbeInterval:                              # a-d-c/Dispatch/ProbeInterval
259
        MaxProbesPerSecond:                         # a-d-c/Dispatch/MaxProbesPerSecond
260
        TimeoutSignal:                              # a-d-c/Dispatch/TimeoutSignal
261
        TimeoutTERM:                                # a-d-c/Dispatch/TimeoutTERM
262
        MaxCloudOpsPerSecond:                       # a-d-c/CloudVMs/MaxCloudOpsPerSecond
263
        SSHPort:                                    # a-d-c/CloudVMs/SSHPort
264
        SyncInterval:                               # a-d-c/CloudVMs/SyncInterval
265
        TimeoutIdle:                                # a-d-c/CloudVMs/TimeoutIdle
266
        TimeoutBooting:                             # a-d-c/CloudVMs/TimeoutBooting
267
        TimeoutProbe:                               # a-d-c/CloudVMs/TimeoutProbe
268
        TimeoutShutdown:                            # a-d-c/CloudVMs/TimeoutShutdown
269
        ImageID:                                    # a-d-c/CloudVMs/ImageID
270
        Driver: Amazon                              # a-d-c/CloudVMs/Driver
271
        DriverParameters:                           # a-d-c/CloudVMs/DriverParameters
272
          Region: us-east-1
273
          APITimeout: 20s
274
          AWSAccessKeyID: abcdef
275
          AWSSecretAccessKey: abcdefghijklmnopqrstuvwxyz
276
          ImageID: ami-0a01b48b88d14541e
277
          SubnetID: subnet-24f5ae62
278
          SecurityGroups: sg-3ec53e2a
279
      SLURM:
280
        Enable:                                     # crunch-dispatch-slurm is in use
281
        PrioritySpread: 1000                        # c-d-s/PrioritySpread
282
        SbatchArguments: ‘[“-partition=PartitionName”]’                         # c-d-s/SbatchArguments
283
        KeepServices:
284
          00000-bi6l4-000000000000000:
285
            “http://127.0.0.1:25107”                # c-d-s/KeepServiceURIs
286
        Managed:
287
          Enable:                        # arvados-node-manager is in use
288
          DNSServerConfDir:              # api-server/dns_server_conf_dir
289
          DNSServerConfTemplate:         # api-server/dns_server_conf_template
290
          DNSServerReloadCommand:        # api-server/dns_server_reload_command
291
          DNSServerUpdateCommand:        # api-server/dns_server_update_command
292
          ComputeNodeDomain:             # api-server/compute_node_domain
293
          ComputeNodeNameservers:        # api-server/compute_node_nameservers
294
          AssignNodeHostname:            # api-server/assign_node_hostname
295
      JobsAPI:
296
        Enable:                        # api-server/enable_legacy_jobs_api (crunch1)
297
        CrunchJobWrapper:              # api-server/crunch_job_wrapper (crunch1)
298
        CrunchJobUser:                 # api-server/crunch_job_user (crunch1)
299
        CrunchRefreshTrigger:          # api-server/crunch_refresh_trigger (crunch1)
300
        GitInternalDir:                # api-server/git_internal_dir (crunch1)
301
        ReuseJobIfOutputsDiffer:       # api-server/reuse_job_if_outputs_differ
302
        DefaultDockerImage:            # api-server/default_docker_image_for_jobs
303
    Volumes:                              # keepstore/Volumes, keep-balance/KeepServiceTypes
304
      # TODO: some keepstores are closer to specific volumes
305
      zzzzz-ivpuk-voihjznerfweefq:
306
        AccessViaHosts:                     # replaces differing configs on keepstore hosts
307
          “http://keep0:25107”: {ReadOnly: true}
308
          “http://keep1:25107”: {}
309
          “http://keep2:25107”: {ReadOnly: true}
310
          “http://keep3:25107”: {ReadOnly: true}
311
        StorageClasses:                     # keepstore/S3Volume.StorageClasses, keepstore/AzureBlobVolume.StorageClasses, keepstore/UnixVolume.StorageClasses
312
          default: true
313
          cold: true
314
        Replication: 2                      # keepstore/S3Volume.S3Replication, keepstore/AzureBlobVolume.AzureReplication, keepstore/UnixVolume.DirectoryReplication
315
        ReadOnly: false                     # keepstore/S3Volume.ReadOnly, keepstore/AzureBlobVolume.ReadOnly, keepstore/UnixVolume.ReadOnly
316
        Driver: S3                          # keepstore/Volumes[].Type
317
        DriverParameters:
318
          AccessKey:                        # keepstore/S3Volume.AccessKey
319
          SecretKey:                        # keepstore/S3Volume.SecretKey
320
          Endpoint:                         # keepstore/S3Volume.Endpoint
321
          Region:                           # keepstore/S3Volume.Region
322
          Bucket:                           # keepstore/S3Volume.Bucket
323
          LocationConstraint:               # keepstore/S3Volume.LocationConstraint
324
          IndexPageSize:                    # keepstore/S3Volume.IndexPageSize
325
          S3Replication:
326
          ConnectTimeout:                   # keepstore/S3Volume.ConnectTimeout
327
          ReadTimeout:                      # keepstore/S3Volume.ReadTimeout
328
          RaceWindow:                       # keepstore/S3Volume.RaceWindow
329
          ReadOnly:                         # 
330
          UnsafeDelete:                     # keepstore/S3Volume.UnsafeDelete
331
      zzzzz-ivpuk-adbtuyuiivjhbnmb:
332
        AccessViaHosts:                     # replaces differing configs on keepstore hosts (TBD: do we need “readonly from these hosts”?)
333
          “http://keep1:25107”: {ReadOnly: false}
334
        StorageClasses:                     # keepstore/S3Volume.StorageClasses, keepstore/AzureBlobVolume.StorageClasses, keepstore/UnixVolume.StorageClasses
335
          default: true
336
          cold: false
337
        Replication: 2                      # keepstore/S3Volume.S3Replication, keepstore/AzureBlobVolume.AzureReplication, keepstore/UnixVolume.DirectoryReplication
338
        ReadOnly: false                     # keepstore/S3Volume.ReadOnly, keepstore/AzureBlobVolume.ReadOnly, keepstore/UnixVolume.ReadOnly
339
        Driver: Azure                       # keepstore/Volumes[].Type
340
        DriverParameters:
341
          StorageAccountName:               # keepstore/AzureBlobVolume.StorageAccountName
342
          StorageAccountKey:                # keepstore/AzureBlobVolume.StorageAccountKeyFile
343
          StorageBaseURL:                   # keepstore/AzureBlobVolume.StorageBaseURL
344
          ContainerName:                    # keepstore/AzureBlobVolume.ContainerName
345
          RequestTimeout:                   # keepstore/AzureBlobVolume.RequestTimeout
346
      zzzzz-ivpuk-2344guvaiubbae4wa:
347
        Driver: Filesystem                  # keepstore/Volumes[].Type
348
        DriverParameters:
349
          Root:                             # keepstore/UnixVolume.Root
350
          Serialize:                        # keepstore/UnixVolume.Serialize
351
          BlockDeviceUUID:                  # (disable if this is non-empty and does not match the local filesystem device)
352
    Mail:
353
      MailchimpAPIKey:            # api-server/mailchimp_api_key
354
      MailchimpListID:            # api-server/mailchimp_list_id
355
      SendUserSetupNotificationEmail:  # workbench/send_user_setup_notification_email
356
      IssueReporterEmailFrom:     # workbench/issue_reporter_email_from
357
      IssueReporterEmailTo:       # workbench/issue_reporter_email_to
358
      SupportEmailAddress:        # workbench/support_email_address
359
      EmailFrom:                  # workbench/email_from
360
    RemoteClusters:               # api-server/remote_hosts
361
      xyzzx:
362
        Host:
363
        Proxy: false
364
        Scheme: https
365
        Insecure: false
366
        ActivateUsers: false
367
      “*”:                        # api-server/remote_hosts_via_dns
368
        ActivateUsers: false
369
    Workbench:
370
      Theme: default              # workbench/arvados_theme
371
      ActivationContactLink:      # workbench/activation_contact_link
372
      ArvadosDocsite:             # workbench/arvados_docsite
373
      ArvadosPublicDataDocURL:    # workbench/arvados_public_data_doc_url
374
      ShowUserAgreementInline:    # workbench/show_user_agreement_inline
375
      SecretToken:                # workbench/secret_token
376
      SecretKeyBase:              # workbench/secret_key_base
377
      RepositoryCache:            # workbench/repository_cache
378
      UserProfileFormFields:      # workbench/user_profile_form_fields
379
      UserProfileFormMessage      # workbench/user_profile_form_message
380
      ApplicationMimetypesWithViewIcon:   # workbench/application_mimetypes_with_view_icon
381
      LogViewerMaxBytes:          # workbench/log_viewer_max_bytes
382
      EnablePublicProjectsPage:   # workbench/enable_public_projects_page
383
      EnableGettingStartedPopup:  # workbench/enable_getting_started_popup
384
      ApiResponseCompression:     # workbench/api_response_compression
385
      APIClientConnectTimeout:    # workbench/api_client_connect_timeout
386
      APIClientReceiveTimeout:    # workbench/api_client_receive_timeout
387
      RunningJobLogRecordsToFetch:       # workbench/running_job_log_records_to_fetch
388
      ShowRecentCollectionsOnDashboard:  # workbench/show_recent_collections_on_dashboard
389
      ShowUserNotifications:      # workbench/show_user_notifications
390
      MultiSiteSearch:            # workbench/multi_site_search
391
      Repositories:               # workbench/repositories
392
      SiteName:                   # workbench/site_name
393
      VocabularyURL:              # workbench2/VOCABULARY_URL
394
      FileViewersConfigURL:       # workbench2/FILE_VIEWERS_CONFIG_URL
395 1 Tom Clegg
    InstanceTypes:
396 27 Tom Clegg
      x1l:
397
        ProviderType: x1.large
398
        VCPUs: 16
399
        RAM: 128GiB
400
        Scratch: 128GB
401
        IncludedScratch: 128GB
402
        AddedScratch: 0
403
        Price: 1.23
404
        Preemptible: false
405
    TODO:
406
      KeepproxyDisableGet               # keepproxy/DisableGet (retire this feature / use Nginx instead / use a per-token permission instead)
407
      KeepproxyDisablePut               # keepproxy/DisablePut (retire this feature / use Nginx instead / use a per-token permission instead)
408
      RailsSessionSecretToken:          # api-server/secret_token (should this be generated at runtime from superusertoken?)
409
      InternalIPNetworks:               # Nginx $external_client
410 1 Tom Clegg
</code></pre>
411
412
h2. Go Configuration Framework Options
413
414
Viper and go-config seem to be the leading go config framework contenders considering some of our long term goals (config synchronization); but viper seems to be the more widely adopted of the two. 
415
416
*spf13/viper:* https://github.com/spf13/viper
417
418
*micro/go-config* https://github.com/micro/go-config - more useful - https://micro.mu/docs/go-config.html
419
420 27 Tom Clegg
Both solutions are very similar in terms of reported functionality. Both have watch support, and would allow for merging flags, environment variables, remote key stores (Consul), and our master YAML config. Viper also supports encrypted remote key/value access.