1 // Copyright (C) The Arvados Authors. All rights reserved.
3 // SPDX-License-Identifier: Apache-2.0
14 "git.arvados.org/arvados.git/sdk/go/config"
17 var DefaultConfigFile = func() string {
18 if path := os.Getenv("ARVADOS_CONFIG"); path != "" {
21 return "/etc/arvados/config.yml"
25 Clusters map[string]Cluster
29 // GetConfig returns the current system config, loading it from
30 // configFile if needed.
31 func GetConfig(configFile string) (*Config, error) {
33 err := config.LoadFile(&cfg, configFile)
37 // GetCluster returns the cluster ID and config for the given
38 // cluster, or the default/only configured cluster if clusterID is "".
39 func (sc *Config) GetCluster(clusterID string) (*Cluster, error) {
41 if len(sc.Clusters) == 0 {
42 return nil, fmt.Errorf("no clusters configured")
43 } else if len(sc.Clusters) > 1 {
44 return nil, fmt.Errorf("multiple clusters configured, cannot choose")
46 for id, cc := range sc.Clusters {
52 cc, ok := sc.Clusters[clusterID]
54 return nil, fmt.Errorf("cluster %q is not configured", clusterID)
56 cc.ClusterID = clusterID
60 type WebDAVCacheConfig struct {
64 MaxCollectionEntries int
65 MaxCollectionBytes int64
70 type UploadDownloadPermission struct {
75 type UploadDownloadRolePermissions struct {
76 User UploadDownloadPermission
77 Admin UploadDownloadPermission
81 ClusterID string `json:"-"`
82 ManagementToken string
83 SystemRootToken string
85 InstanceTypes InstanceTypeMap
86 Containers ContainersConfig
87 RemoteClusters map[string]RemoteCluster
91 AsyncPermissionsUpdateInterval Duration
92 DisabledAPIs StringSet
93 MaxIndexDatabaseRead int
94 MaxItemsPerResponse int
95 MaxConcurrentRequests int
96 MaxKeepBlobBuffers int
97 MaxRequestAmplification int
99 MaxTokenLifetime Duration
100 RequestTimeout Duration
102 WebsocketClientEventQueue int
103 WebsocketServerEventQueue int
104 KeepServiceRequestTimeout Duration
109 UnloggedAttributes StringSet
113 BlobSigningKey string
114 BlobSigningTTL Duration
116 BlobTrashLifetime Duration
117 BlobTrashCheckInterval Duration
118 BlobTrashConcurrency int
119 BlobDeleteConcurrency int
120 BlobReplicateConcurrency int
121 CollectionVersioning bool
122 DefaultTrashLifetime Duration
123 DefaultReplication int
124 ManagedProperties map[string]struct {
129 PreserveVersionIfIdle Duration
130 TrashSweepInterval Duration
132 ForwardSlashNameSubstitution string
135 BlobMissingReport string
136 BalancePeriod Duration
137 BalanceCollectionBatch int
138 BalanceCollectionBuffers int
139 BalanceTimeout Duration
140 BalanceUpdateLimit int
142 WebDAVCache WebDAVCacheConfig
144 KeepproxyPermission UploadDownloadRolePermissions
145 WebDAVPermission UploadDownloadRolePermissions
161 SearchAttribute string
162 SearchBindUser string
163 SearchBindPassword string
166 EmailAttribute string
167 UsernameAttribute string
173 AlternateEmailAddresses bool
174 AuthenticationRequestParameters map[string]string
176 OpenIDConnect struct {
182 EmailVerifiedClaim string
184 AcceptAccessToken bool
185 AcceptAccessTokenScope string
186 AuthenticationRequestParameters map[string]string
191 DefaultEmailDomain string
195 Users map[string]TestUser
198 RemoteTokenRefresh Duration
199 TokenLifetime Duration
200 TrustedClients map[string]struct{}
201 IssueTrustedTokens bool
204 MailchimpAPIKey string
205 MailchimpListID string
206 SendUserSetupNotificationEmail bool
207 IssueReporterEmailFrom string
208 IssueReporterEmailTo string
209 SupportEmailAddress string
215 MaxRequestLogParamsSize int
223 AnonymousUserToken string
224 AdminNotifierEmailFrom string
225 AutoAdminFirstUser bool
226 AutoAdminUserWithEmail string
227 AutoSetupNewUsers bool
228 AutoSetupNewUsersWithRepository bool
229 AutoSetupNewUsersWithVmUUID string
230 AutoSetupUsernameBlacklist StringSet
231 EmailSubjectPrefix string
232 NewInactiveUserNotificationRecipients StringSet
233 NewUserNotificationRecipients StringSet
234 NewUsersAreActive bool
235 UserNotifierEmailFrom string
236 UserNotifierEmailBcc StringSet
237 UserProfileNotificationAddress string
238 PreferDomainForUsername string
239 UserSetupMailText string
241 StorageClasses map[string]StorageClassConfig
242 Volumes map[string]Volume
244 ActivationContactLink string
245 APIClientConnectTimeout Duration
246 APIClientReceiveTimeout Duration
247 APIResponseCompression bool
248 ApplicationMimetypesWithViewIcon StringSet
249 ArvadosDocsite string
250 ArvadosPublicDataDocURL string
251 DefaultOpenIdPrefix string
252 EnableGettingStartedPopup bool
253 EnablePublicProjectsPage bool
254 FileViewersConfigURL string
255 LogViewerMaxBytes ByteSize
256 MultiSiteSearch string
257 ProfilingEnabled bool
259 RepositoryCache string
260 RunningJobLogRecordsToFetch int
262 ShowRecentCollectionsOnDashboard bool
263 ShowUserAgreementInline bool
264 ShowUserNotifications bool
267 UserProfileFormFields map[string]struct {
269 FormFieldTitle string
270 FormFieldDescription string
273 Options map[string]struct{}
275 UserProfileFormMessage string
277 WelcomePageHTML string
278 InactivePageHTML string
279 SSHHelpPageHTML string
280 SSHHelpHostSuffix string
285 type StorageClassConfig struct {
291 AccessViaHosts map[URL]VolumeAccess
294 StorageClasses map[string]bool
296 DriverParameters json.RawMessage
299 type S3VolumeDriverParameters struct {
302 SecretAccessKey string
306 LocationConstraint bool
308 UseAWSS3v2Driver bool
310 ConnectTimeout Duration
316 type AzureVolumeDriverParameters struct {
317 StorageAccountName string
318 StorageAccountKey string
319 StorageBaseURL string
321 RequestTimeout Duration
322 ListBlobsRetryDelay Duration
323 ListBlobsMaxAttempts int
326 type DirectoryVolumeDriverParameters struct {
331 type VolumeAccess struct {
335 type Services struct {
338 DispatchCloud Service
347 WebDAVDownload Service
355 type Service struct {
356 InternalURLs map[URL]ServiceInstance
360 type TestUser struct {
365 // URL is a url.URL that is also usable as a JSON key/value.
368 // UnmarshalText implements encoding.TextUnmarshaler so URL can be
369 // used as a JSON key/value.
370 func (su *URL) UnmarshalText(text []byte) error {
371 u, err := url.Parse(string(text))
374 if su.Path == "" && su.Host != "" {
375 // http://example really means http://example/
382 func (su URL) MarshalText() ([]byte, error) {
383 return []byte(fmt.Sprintf("%s", (*url.URL)(&su).String())), nil
386 func (su URL) String() string {
387 return (*url.URL)(&su).String()
390 type ServiceInstance struct {
391 Rendezvous string `json:",omitempty"`
394 type PostgreSQL struct {
395 Connection PostgreSQLConnection
399 type PostgreSQLConnection map[string]string
401 type RemoteCluster struct {
409 type InstanceType struct {
415 IncludedScratch ByteSize
416 AddedScratch ByteSize
421 type ContainersConfig struct {
422 CloudVMs CloudVMsConfig
423 CrunchRunCommand string
424 CrunchRunArgumentsList []string
425 DefaultKeepCacheRAM ByteSize
426 DispatchPrivateKey string
427 LogReuseDecisions bool
429 MaxDispatchAttempts int
431 MinRetryPeriod Duration
432 ReserveExtraRAM ByteSize
433 StaleLockTimeout Duration
434 SupportedDockerImageFormats StringSet
435 UsePreemptibleInstances bool
440 GitInternalDir string
445 LogSecondsBetweenEvents Duration
446 LogThrottlePeriod Duration
449 LimitLogBytesPerJob int
450 LogPartialLineThrottlePeriod Duration
451 LogUpdatePeriod Duration
452 LogUpdateSize ByteSize
460 SbatchArgumentsList []string
461 SbatchEnvironmentVariables map[string]string
463 DNSServerConfDir string
464 DNSServerConfTemplate string
465 DNSServerReloadCommand string
466 DNSServerUpdateCommand string
467 ComputeNodeDomain string
468 ComputeNodeNameservers StringSet
469 AssignNodeHostname string
474 BsubArgumentsList []string
478 type CloudVMsConfig struct {
481 BootProbeCommand string
482 DeployRunnerBinary string
484 MaxCloudOpsPerSecond int
485 MaxProbesPerSecond int
486 MaxConcurrentInstanceCreateOps int
487 PollInterval Duration
488 ProbeInterval Duration
490 SyncInterval Duration
491 TimeoutBooting Duration
493 TimeoutProbe Duration
494 TimeoutShutdown Duration
495 TimeoutSignal Duration
496 TimeoutStaleRunLock Duration
498 ResourceTags map[string]string
502 DriverParameters json.RawMessage
505 type InstanceTypeMap map[string]InstanceType
507 var errDuplicateInstanceTypeName = errors.New("duplicate instance type name")
509 // UnmarshalJSON handles old config files that provide an array of
510 // instance types instead of a hash.
511 func (it *InstanceTypeMap) UnmarshalJSON(data []byte) error {
512 fixup := func(t InstanceType) (InstanceType, error) {
513 if t.ProviderType == "" {
514 t.ProviderType = t.Name
517 t.Scratch = t.IncludedScratch + t.AddedScratch
518 } else if t.AddedScratch == 0 {
519 t.AddedScratch = t.Scratch - t.IncludedScratch
520 } else if t.IncludedScratch == 0 {
521 t.IncludedScratch = t.Scratch - t.AddedScratch
524 if t.Scratch != (t.IncludedScratch + t.AddedScratch) {
525 return t, fmt.Errorf("InstanceType %q: Scratch != (IncludedScratch + AddedScratch)", t.Name)
530 if len(data) > 0 && data[0] == '[' {
531 var arr []InstanceType
532 err := json.Unmarshal(data, &arr)
540 *it = make(map[string]InstanceType, len(arr))
541 for _, t := range arr {
542 if _, ok := (*it)[t.Name]; ok {
543 return errDuplicateInstanceTypeName
553 var hash map[string]InstanceType
554 err := json.Unmarshal(data, &hash)
558 // Fill in Name field (and ProviderType field, if not
559 // specified) using hash key.
560 *it = InstanceTypeMap(hash)
561 for name, t := range *it {
572 type StringSet map[string]struct{}
574 // UnmarshalJSON handles old config files that provide an array of
575 // instance types instead of a hash.
576 func (ss *StringSet) UnmarshalJSON(data []byte) error {
577 if len(data) > 0 && data[0] == '[' {
579 err := json.Unmarshal(data, &arr)
587 *ss = make(map[string]struct{}, len(arr))
588 for _, t := range arr {
589 (*ss)[t] = struct{}{}
593 var hash map[string]struct{}
594 err := json.Unmarshal(data, &hash)
598 *ss = make(map[string]struct{}, len(hash))
599 for t := range hash {
600 (*ss)[t] = struct{}{}
606 type ServiceName string
609 ServiceNameRailsAPI ServiceName = "arvados-api-server"
610 ServiceNameController ServiceName = "arvados-controller"
611 ServiceNameDispatchCloud ServiceName = "arvados-dispatch-cloud"
612 ServiceNameDispatchLSF ServiceName = "arvados-dispatch-lsf"
613 ServiceNameHealth ServiceName = "arvados-health"
614 ServiceNameWorkbench1 ServiceName = "arvados-workbench1"
615 ServiceNameWorkbench2 ServiceName = "arvados-workbench2"
616 ServiceNameWebsocket ServiceName = "arvados-ws"
617 ServiceNameKeepbalance ServiceName = "keep-balance"
618 ServiceNameKeepweb ServiceName = "keep-web"
619 ServiceNameKeepproxy ServiceName = "keepproxy"
620 ServiceNameKeepstore ServiceName = "keepstore"
623 // Map returns all services as a map, suitable for iterating over all
624 // services or looking up a service by name.
625 func (svcs Services) Map() map[ServiceName]Service {
626 return map[ServiceName]Service{
627 ServiceNameRailsAPI: svcs.RailsAPI,
628 ServiceNameController: svcs.Controller,
629 ServiceNameDispatchCloud: svcs.DispatchCloud,
630 ServiceNameDispatchLSF: svcs.DispatchLSF,
631 ServiceNameHealth: svcs.Health,
632 ServiceNameWorkbench1: svcs.Workbench1,
633 ServiceNameWorkbench2: svcs.Workbench2,
634 ServiceNameWebsocket: svcs.Websocket,
635 ServiceNameKeepbalance: svcs.Keepbalance,
636 ServiceNameKeepweb: svcs.WebDAV,
637 ServiceNameKeepproxy: svcs.Keepproxy,
638 ServiceNameKeepstore: svcs.Keepstore,