Project

General

Profile

Cluster configuration » History » Version 31

Peter Amstutz, 07/22/2019 07:06 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
      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 30 Tom Clegg
      CrunchRunArgumentsList: ["-cgroup-parent-subsystem=memory", "-foo=bar"]     # c-d-s/CrunchRunCommand
239 27 Tom Clegg
      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 30 Tom Clegg
        SbatchArguments: ["-partition=PartitionName"]                         # c-d-s/SbatchArguments
283 1 Tom Clegg
        KeepServices:
284 27 Tom Clegg
          00000-bi6l4-000000000000000:
285 28 Tom Clegg
            InternalURLs:
286
              "http://127.0.0.1:25107": {}          # c-d-s/KeepServiceURIs
287 27 Tom Clegg
        Managed:
288
          Enable:                        # arvados-node-manager is in use
289
          DNSServerConfDir:              # api-server/dns_server_conf_dir
290
          DNSServerConfTemplate:         # api-server/dns_server_conf_template
291
          DNSServerReloadCommand:        # api-server/dns_server_reload_command
292
          DNSServerUpdateCommand:        # api-server/dns_server_update_command
293
          ComputeNodeDomain:             # api-server/compute_node_domain
294
          ComputeNodeNameservers:        # api-server/compute_node_nameservers
295
          AssignNodeHostname:            # api-server/assign_node_hostname
296
      JobsAPI:
297
        Enable:                        # api-server/enable_legacy_jobs_api (crunch1)
298
        CrunchJobWrapper:              # api-server/crunch_job_wrapper (crunch1)
299
        CrunchJobUser:                 # api-server/crunch_job_user (crunch1)
300
        CrunchRefreshTrigger:          # api-server/crunch_refresh_trigger (crunch1)
301
        GitInternalDir:                # api-server/git_internal_dir (crunch1)
302
        ReuseJobIfOutputsDiffer:       # api-server/reuse_job_if_outputs_differ
303
        DefaultDockerImage:            # api-server/default_docker_image_for_jobs
304 1 Tom Clegg
    Volumes:                              # keepstore/Volumes, keep-balance/KeepServiceTypes
305 27 Tom Clegg
      # TODO: some keepstores are closer to specific volumes
306
      zzzzz-ivpuk-voihjznerfweefq:
307
        AccessViaHosts:                     # replaces differing configs on keepstore hosts
308 28 Tom Clegg
          "http://keep0:25107": {ReadOnly: true}
309
          "http://keep1:25107": {}
310
          "http://keep2:25107": {ReadOnly: true}
311
          "http://keep3:25107": {ReadOnly: true}
312 27 Tom Clegg
        StorageClasses:                     # keepstore/S3Volume.StorageClasses, keepstore/AzureBlobVolume.StorageClasses, keepstore/UnixVolume.StorageClasses
313
          default: true
314
          cold: true
315
        Replication: 2                      # keepstore/S3Volume.S3Replication, keepstore/AzureBlobVolume.AzureReplication, keepstore/UnixVolume.DirectoryReplication
316
        ReadOnly: false                     # keepstore/S3Volume.ReadOnly, keepstore/AzureBlobVolume.ReadOnly, keepstore/UnixVolume.ReadOnly
317
        Driver: S3                          # keepstore/Volumes[].Type
318
        DriverParameters:
319
          AccessKey:                        # keepstore/S3Volume.AccessKey
320
          SecretKey:                        # keepstore/S3Volume.SecretKey
321
          Endpoint:                         # keepstore/S3Volume.Endpoint
322
          Region:                           # keepstore/S3Volume.Region
323
          Bucket:                           # keepstore/S3Volume.Bucket
324
          LocationConstraint:               # keepstore/S3Volume.LocationConstraint
325
          IndexPageSize:                    # keepstore/S3Volume.IndexPageSize
326 1 Tom Clegg
          S3Replication:
327 27 Tom Clegg
          ConnectTimeout:                   # keepstore/S3Volume.ConnectTimeout
328
          ReadTimeout:                      # keepstore/S3Volume.ReadTimeout
329
          RaceWindow:                       # keepstore/S3Volume.RaceWindow
330
          ReadOnly:                         # 
331
          UnsafeDelete:                     # keepstore/S3Volume.UnsafeDelete
332
      zzzzz-ivpuk-adbtuyuiivjhbnmb:
333
        AccessViaHosts:                     # replaces differing configs on keepstore hosts (TBD: do we need “readonly from these hosts”?)
334 28 Tom Clegg
          "http://keep1:25107": {ReadOnly: false}
335 27 Tom Clegg
        StorageClasses:                     # keepstore/S3Volume.StorageClasses, keepstore/AzureBlobVolume.StorageClasses, keepstore/UnixVolume.StorageClasses
336
          default: true
337
          cold: false
338
        Replication: 2                      # keepstore/S3Volume.S3Replication, keepstore/AzureBlobVolume.AzureReplication, keepstore/UnixVolume.DirectoryReplication
339
        ReadOnly: false                     # keepstore/S3Volume.ReadOnly, keepstore/AzureBlobVolume.ReadOnly, keepstore/UnixVolume.ReadOnly
340
        Driver: Azure                       # keepstore/Volumes[].Type
341
        DriverParameters:
342
          StorageAccountName:               # keepstore/AzureBlobVolume.StorageAccountName
343
          StorageAccountKey:                # keepstore/AzureBlobVolume.StorageAccountKeyFile
344
          StorageBaseURL:                   # keepstore/AzureBlobVolume.StorageBaseURL
345
          ContainerName:                    # keepstore/AzureBlobVolume.ContainerName
346
          RequestTimeout:                   # keepstore/AzureBlobVolume.RequestTimeout
347
      zzzzz-ivpuk-2344guvaiubbae4wa:
348
        Driver: Filesystem                  # keepstore/Volumes[].Type
349
        DriverParameters:
350
          Root:                             # keepstore/UnixVolume.Root
351
          Serialize:                        # keepstore/UnixVolume.Serialize
352
          BlockDeviceUUID:                  # (disable if this is non-empty and does not match the local filesystem device)
353
    Mail:
354
      MailchimpAPIKey:            # api-server/mailchimp_api_key
355
      MailchimpListID:            # api-server/mailchimp_list_id
356
      SendUserSetupNotificationEmail:  # workbench/send_user_setup_notification_email
357
      IssueReporterEmailFrom:     # workbench/issue_reporter_email_from
358
      IssueReporterEmailTo:       # workbench/issue_reporter_email_to
359 1 Tom Clegg
      SupportEmailAddress:        # workbench/support_email_address
360 27 Tom Clegg
      EmailFrom:                  # workbench/email_from
361
    RemoteClusters:               # api-server/remote_hosts
362
      xyzzx:
363
        Host:
364
        Proxy: false
365
        Scheme: https
366
        Insecure: false
367
        ActivateUsers: false
368 28 Tom Clegg
      "*":                        # api-server/remote_hosts_via_dns
369 27 Tom Clegg
        ActivateUsers: false
370 1 Tom Clegg
    Workbench:
371 27 Tom Clegg
      Theme: default              # workbench/arvados_theme
372
      ActivationContactLink:      # workbench/activation_contact_link
373
      ArvadosDocsite:             # workbench/arvados_docsite
374
      ArvadosPublicDataDocURL:    # workbench/arvados_public_data_doc_url
375
      ShowUserAgreementInline:    # workbench/show_user_agreement_inline
376
      SecretToken:                # workbench/secret_token
377
      SecretKeyBase:              # workbench/secret_key_base
378
      RepositoryCache:            # workbench/repository_cache
379
      UserProfileFormFields:      # workbench/user_profile_form_fields
380 28 Tom Clegg
      UserProfileFormMessage:     # workbench/user_profile_form_message
381 27 Tom Clegg
      ApplicationMimetypesWithViewIcon:   # workbench/application_mimetypes_with_view_icon
382
      LogViewerMaxBytes:          # workbench/log_viewer_max_bytes
383
      EnablePublicProjectsPage:   # workbench/enable_public_projects_page
384
      EnableGettingStartedPopup:  # workbench/enable_getting_started_popup
385
      ApiResponseCompression:     # workbench/api_response_compression
386
      APIClientConnectTimeout:    # workbench/api_client_connect_timeout
387
      APIClientReceiveTimeout:    # workbench/api_client_receive_timeout
388
      RunningJobLogRecordsToFetch:       # workbench/running_job_log_records_to_fetch
389
      ShowRecentCollectionsOnDashboard:  # workbench/show_recent_collections_on_dashboard
390
      ShowUserNotifications:      # workbench/show_user_notifications
391
      MultiSiteSearch:            # workbench/multi_site_search
392
      Repositories:               # workbench/repositories
393
      SiteName:                   # workbench/site_name
394
      VocabularyURL:              # workbench2/VOCABULARY_URL
395
      FileViewersConfigURL:       # workbench2/FILE_VIEWERS_CONFIG_URL
396 1 Tom Clegg
    InstanceTypes:
397 27 Tom Clegg
      x1l:
398
        ProviderType: x1.large
399
        VCPUs: 16
400
        RAM: 128GiB
401
        Scratch: 128GB
402
        IncludedScratch: 128GB
403
        AddedScratch: 0
404
        Price: 1.23
405
        Preemptible: false
406
    TODO:
407 28 Tom Clegg
      KeepproxyDisableGet:              # keepproxy/DisableGet (retire this feature / use Nginx instead / use a per-token permission instead)
408
      KeepproxyDisablePut:              # keepproxy/DisablePut (retire this feature / use Nginx instead / use a per-token permission instead)
409 27 Tom Clegg
      RailsSessionSecretToken:          # api-server/secret_token (should this be generated at runtime from superusertoken?)
410
      InternalIPNetworks:               # Nginx $external_client
411 1 Tom Clegg
</code></pre>
412
413
h2. Go Configuration Framework Options
414
415
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. 
416
417
*spf13/viper:* https://github.com/spf13/viper
418
419
*micro/go-config* https://github.com/micro/go-config - more useful - https://micro.mu/docs/go-config.html
420
421 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.