Project

General

Profile

Cluster configuration » History » Version 33

Tom Clegg, 09/03/2019 03:44 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 29 Tom Clegg
## Run "arvados-server config-diff". This suggests changes to your new config file which will make your old config file obsolete. (Alternatively, run "arvados-server config-dump". 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 30 Tom Clegg
* Arrays and lists are not to be used unless order is truly significant. 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. If a list is used, its key must end with the chars "List". This way the value can be stored as a list (in a JSON/YAML file on disk) or a JSON-encoded string (in a system like Consul), and generically encoded/decoded between the two.
55 20 Tom Clegg
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 31 Peter Amstutz
      SendTimeout:        # arvados-ws/PingTimeout
149 27 Tom Clegg
      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 33 Tom Clegg
      BlobMissingReport:                      # keep-balance/LostBlockFile
222
      BalancePeriod: 10m                      # keep-balance/RunPeriod
223
      BalanceCollectionBatch:                 # keep-balance/CollectionBatchSize
224
      BalanceCollectionBuffers:               # keep-balance/CollectionBuffers
225 27 Tom Clegg
      WebDAVCache:
226
        TTL:                   # keep-web/Cache.TTL
227
        UUIDTTL:               # keep-web/Cache.UUIDTTL
228
        MaxCollectionEntries:  # keep-web/Cache.MaxCollectionEntries
229
        MaxCollectionBytes:    # keep-web/Cache.MaxCollectionBytes
230
        MaxPermissionEntries:  # keep-web/Cache.MaxPermissionEntries
231
        MaxUUIDEntries:        # keep-web/Cache.MaxUUIDEntries
232
    Containers: # control how Arvados runs user containers
233
      SupportedDockerImageFormats:                  # api-server/docker_image_formats
234
      LogReuseDecisions:                            # api-server/log_reuse_decisions
235
      DefaultKeepCacheRAM:                          # api-server/container_default_keep_cache_ram
236
      MaxDispatchAttempts:                          # api-server/max_container_dispatch_attempts
237
      MaxRetryAttempts:                             # api-server/container_count_max
238
      PollInterval: 10s                             # c-d-s/PollPeriod, a-d-c/Dispatch/PollInterval
239
      MinRetryPeriod: 30s                           # c-d-s/MinRetryPeriod (optional? in case ContainerDispatchPollInterval is too short)
240
      CrunchRunCommand: "crunch-run"                # c-d-s/CrunchRunCommand
241 30 Tom Clegg
      CrunchRunArgumentsList: ["-cgroup-parent-subsystem=memory", "-foo=bar"]     # c-d-s/CrunchRunCommand
242 27 Tom Clegg
      ReserveExtraRAM: 256MiB                       # c-d-s/ReserveExtraRAM
243
      UsePreemptibleInstances:                      # api-server/preemptible_instances
244
      MaxComputeVMs:                                # api-server/max_compute_nodes
245
      DispatchPrivateKey:                           # a-d-c/Dispatch/PrivateKey
246
      StaleLockTimeout:                             # a-d-c/Dispatch/StaleLockTimeout
247
      Logging:
248
        LogBytesPerEvent:              # api-server/crunch_log_bytes_per_event
249
        LogSecondsBetweenEvents:       # api-server/crunch_log_seconds_between_events
250
        LogThrottlePeriod:             # api-server/crunch_log_throttle_period
251
        LogThrottleBytes:              # api-server/crunch_log_throttle_bytes
252
        LogThrottleLines:              # api-server/crunch_log_throttle_lines
253
        LimitLogBytesPerJob:           # api-server/crunch_limit_log_bytes_per_job
254
        LogPartialLineThrottlePeriod:  # api-server/crunch_log_partial_line_throttle_period
255
        LogUpdatePeriod:               # api-server/crunch_log_update_period
256
        LogUpdateSize:                 # api-server/crunch_log_update_size
257
        MaxAge:                        # api-server/clean_container_log_rows_after, api-server/clean_job_log_rows_after
258
      CloudVMs:
259
        Enable:                                     # arvados-dispatch-cloud is in use
260
        BootProbeCommand:                           # a-d-c/CloudVMs/BootProbeCommand
261
        ProbeInterval:                              # a-d-c/Dispatch/ProbeInterval
262
        MaxProbesPerSecond:                         # a-d-c/Dispatch/MaxProbesPerSecond
263
        TimeoutSignal:                              # a-d-c/Dispatch/TimeoutSignal
264
        TimeoutTERM:                                # a-d-c/Dispatch/TimeoutTERM
265
        MaxCloudOpsPerSecond:                       # a-d-c/CloudVMs/MaxCloudOpsPerSecond
266
        SSHPort:                                    # a-d-c/CloudVMs/SSHPort
267
        SyncInterval:                               # a-d-c/CloudVMs/SyncInterval
268
        TimeoutIdle:                                # a-d-c/CloudVMs/TimeoutIdle
269
        TimeoutBooting:                             # a-d-c/CloudVMs/TimeoutBooting
270
        TimeoutProbe:                               # a-d-c/CloudVMs/TimeoutProbe
271
        TimeoutShutdown:                            # a-d-c/CloudVMs/TimeoutShutdown
272
        ImageID:                                    # a-d-c/CloudVMs/ImageID
273
        Driver: Amazon                              # a-d-c/CloudVMs/Driver
274
        DriverParameters:                           # a-d-c/CloudVMs/DriverParameters
275
          Region: us-east-1
276
          APITimeout: 20s
277
          AWSAccessKeyID: abcdef
278
          AWSSecretAccessKey: abcdefghijklmnopqrstuvwxyz
279
          ImageID: ami-0a01b48b88d14541e
280
          SubnetID: subnet-24f5ae62
281
          SecurityGroups: sg-3ec53e2a
282
      SLURM:
283
        Enable:                                     # crunch-dispatch-slurm is in use
284
        PrioritySpread: 1000                        # c-d-s/PrioritySpread
285 30 Tom Clegg
        SbatchArguments: ["-partition=PartitionName"]                         # c-d-s/SbatchArguments
286 32 Tom Clegg
        SbatchEnvironmentVariables:
287
          ARVADOS_KEEP_SERVICES: "http://127.0.0.1:25107"                     # c-d-s/KeepServiceURIs
288 27 Tom Clegg
        Managed:
289
          Enable:                        # arvados-node-manager is in use
290
          DNSServerConfDir:              # api-server/dns_server_conf_dir
291
          DNSServerConfTemplate:         # api-server/dns_server_conf_template
292
          DNSServerReloadCommand:        # api-server/dns_server_reload_command
293
          DNSServerUpdateCommand:        # api-server/dns_server_update_command
294
          ComputeNodeDomain:             # api-server/compute_node_domain
295
          ComputeNodeNameservers:        # api-server/compute_node_nameservers
296
          AssignNodeHostname:            # api-server/assign_node_hostname
297
      JobsAPI:
298
        Enable:                        # api-server/enable_legacy_jobs_api (crunch1)
299
        CrunchJobWrapper:              # api-server/crunch_job_wrapper (crunch1)
300
        CrunchJobUser:                 # api-server/crunch_job_user (crunch1)
301
        CrunchRefreshTrigger:          # api-server/crunch_refresh_trigger (crunch1)
302
        GitInternalDir:                # api-server/git_internal_dir (crunch1)
303
        ReuseJobIfOutputsDiffer:       # api-server/reuse_job_if_outputs_differ
304
        DefaultDockerImage:            # api-server/default_docker_image_for_jobs
305 1 Tom Clegg
    Volumes:                              # keepstore/Volumes, keep-balance/KeepServiceTypes
306 27 Tom Clegg
      # TODO: some keepstores are closer to specific volumes
307
      zzzzz-ivpuk-voihjznerfweefq:
308
        AccessViaHosts:                     # replaces differing configs on keepstore hosts
309 28 Tom Clegg
          "http://keep0:25107": {ReadOnly: true}
310
          "http://keep1:25107": {}
311
          "http://keep2:25107": {ReadOnly: true}
312
          "http://keep3:25107": {ReadOnly: true}
313 27 Tom Clegg
        StorageClasses:                     # keepstore/S3Volume.StorageClasses, keepstore/AzureBlobVolume.StorageClasses, keepstore/UnixVolume.StorageClasses
314
          default: true
315
          cold: true
316
        Replication: 2                      # keepstore/S3Volume.S3Replication, keepstore/AzureBlobVolume.AzureReplication, keepstore/UnixVolume.DirectoryReplication
317
        ReadOnly: false                     # keepstore/S3Volume.ReadOnly, keepstore/AzureBlobVolume.ReadOnly, keepstore/UnixVolume.ReadOnly
318
        Driver: S3                          # keepstore/Volumes[].Type
319
        DriverParameters:
320
          AccessKey:                        # keepstore/S3Volume.AccessKey
321
          SecretKey:                        # keepstore/S3Volume.SecretKey
322
          Endpoint:                         # keepstore/S3Volume.Endpoint
323
          Region:                           # keepstore/S3Volume.Region
324
          Bucket:                           # keepstore/S3Volume.Bucket
325
          LocationConstraint:               # keepstore/S3Volume.LocationConstraint
326
          IndexPageSize:                    # keepstore/S3Volume.IndexPageSize
327 1 Tom Clegg
          S3Replication:
328 27 Tom Clegg
          ConnectTimeout:                   # keepstore/S3Volume.ConnectTimeout
329
          ReadTimeout:                      # keepstore/S3Volume.ReadTimeout
330
          RaceWindow:                       # keepstore/S3Volume.RaceWindow
331
          ReadOnly:                         # 
332
          UnsafeDelete:                     # keepstore/S3Volume.UnsafeDelete
333
      zzzzz-ivpuk-adbtuyuiivjhbnmb:
334
        AccessViaHosts:                     # replaces differing configs on keepstore hosts (TBD: do we need “readonly from these hosts”?)
335 28 Tom Clegg
          "http://keep1:25107": {ReadOnly: false}
336 27 Tom Clegg
        StorageClasses:                     # keepstore/S3Volume.StorageClasses, keepstore/AzureBlobVolume.StorageClasses, keepstore/UnixVolume.StorageClasses
337
          default: true
338
          cold: false
339
        Replication: 2                      # keepstore/S3Volume.S3Replication, keepstore/AzureBlobVolume.AzureReplication, keepstore/UnixVolume.DirectoryReplication
340
        ReadOnly: false                     # keepstore/S3Volume.ReadOnly, keepstore/AzureBlobVolume.ReadOnly, keepstore/UnixVolume.ReadOnly
341
        Driver: Azure                       # keepstore/Volumes[].Type
342
        DriverParameters:
343
          StorageAccountName:               # keepstore/AzureBlobVolume.StorageAccountName
344
          StorageAccountKey:                # keepstore/AzureBlobVolume.StorageAccountKeyFile
345
          StorageBaseURL:                   # keepstore/AzureBlobVolume.StorageBaseURL
346
          ContainerName:                    # keepstore/AzureBlobVolume.ContainerName
347
          RequestTimeout:                   # keepstore/AzureBlobVolume.RequestTimeout
348
      zzzzz-ivpuk-2344guvaiubbae4wa:
349
        Driver: Filesystem                  # keepstore/Volumes[].Type
350
        DriverParameters:
351
          Root:                             # keepstore/UnixVolume.Root
352
          Serialize:                        # keepstore/UnixVolume.Serialize
353
          BlockDeviceUUID:                  # (disable if this is non-empty and does not match the local filesystem device)
354
    Mail:
355
      MailchimpAPIKey:            # api-server/mailchimp_api_key
356
      MailchimpListID:            # api-server/mailchimp_list_id
357
      SendUserSetupNotificationEmail:  # workbench/send_user_setup_notification_email
358
      IssueReporterEmailFrom:     # workbench/issue_reporter_email_from
359
      IssueReporterEmailTo:       # workbench/issue_reporter_email_to
360 1 Tom Clegg
      SupportEmailAddress:        # workbench/support_email_address
361 27 Tom Clegg
      EmailFrom:                  # workbench/email_from
362
    RemoteClusters:               # api-server/remote_hosts
363
      xyzzx:
364
        Host:
365
        Proxy: false
366
        Scheme: https
367
        Insecure: false
368
        ActivateUsers: false
369 28 Tom Clegg
      "*":                        # api-server/remote_hosts_via_dns
370 27 Tom Clegg
        ActivateUsers: false
371 1 Tom Clegg
    Workbench:
372 27 Tom Clegg
      Theme: default              # workbench/arvados_theme
373
      ActivationContactLink:      # workbench/activation_contact_link
374
      ArvadosDocsite:             # workbench/arvados_docsite
375
      ArvadosPublicDataDocURL:    # workbench/arvados_public_data_doc_url
376
      ShowUserAgreementInline:    # workbench/show_user_agreement_inline
377
      SecretToken:                # workbench/secret_token
378
      SecretKeyBase:              # workbench/secret_key_base
379
      RepositoryCache:            # workbench/repository_cache
380
      UserProfileFormFields:      # workbench/user_profile_form_fields
381 28 Tom Clegg
      UserProfileFormMessage:     # workbench/user_profile_form_message
382 27 Tom Clegg
      ApplicationMimetypesWithViewIcon:   # workbench/application_mimetypes_with_view_icon
383
      LogViewerMaxBytes:          # workbench/log_viewer_max_bytes
384
      EnablePublicProjectsPage:   # workbench/enable_public_projects_page
385
      EnableGettingStartedPopup:  # workbench/enable_getting_started_popup
386
      ApiResponseCompression:     # workbench/api_response_compression
387
      APIClientConnectTimeout:    # workbench/api_client_connect_timeout
388
      APIClientReceiveTimeout:    # workbench/api_client_receive_timeout
389
      RunningJobLogRecordsToFetch:       # workbench/running_job_log_records_to_fetch
390
      ShowRecentCollectionsOnDashboard:  # workbench/show_recent_collections_on_dashboard
391
      ShowUserNotifications:      # workbench/show_user_notifications
392
      MultiSiteSearch:            # workbench/multi_site_search
393
      Repositories:               # workbench/repositories
394
      SiteName:                   # workbench/site_name
395
      VocabularyURL:              # workbench2/VOCABULARY_URL
396
      FileViewersConfigURL:       # workbench2/FILE_VIEWERS_CONFIG_URL
397 1 Tom Clegg
    InstanceTypes:
398 27 Tom Clegg
      x1l:
399
        ProviderType: x1.large
400
        VCPUs: 16
401
        RAM: 128GiB
402
        Scratch: 128GB
403
        IncludedScratch: 128GB
404
        AddedScratch: 0
405
        Price: 1.23
406
        Preemptible: false
407
    TODO:
408 28 Tom Clegg
      KeepproxyDisableGet:              # keepproxy/DisableGet (retire this feature / use Nginx instead / use a per-token permission instead)
409
      KeepproxyDisablePut:              # keepproxy/DisablePut (retire this feature / use Nginx instead / use a per-token permission instead)
410 27 Tom Clegg
      RailsSessionSecretToken:          # api-server/secret_token (should this be generated at runtime from superusertoken?)
411
      InternalIPNetworks:               # Nginx $external_client
412 1 Tom Clegg
</code></pre>
413
414
h2. Go Configuration Framework Options
415
416
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. 
417
418
*spf13/viper:* https://github.com/spf13/viper
419
420
*micro/go-config* https://github.com/micro/go-config - more useful - https://micro.mu/docs/go-config.html
421
422 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.