1 // Copyright (C) The Arvados Authors. All rights reserved.
3 // SPDX-License-Identifier: Apache-2.0
16 "git.arvados.org/arvados.git/sdk/go/config"
19 var DefaultConfigFile = func() string {
20 if path := os.Getenv("ARVADOS_CONFIG"); path != "" {
23 return "/etc/arvados/config.yml"
27 Clusters map[string]Cluster
29 SourceTimestamp time.Time
33 // GetConfig returns the current system config, loading it from
34 // configFile if needed.
35 func GetConfig(configFile string) (*Config, error) {
37 err := config.LoadFile(&cfg, configFile)
41 // GetCluster returns the cluster ID and config for the given
42 // cluster, or the default/only configured cluster if clusterID is "".
43 func (sc *Config) GetCluster(clusterID string) (*Cluster, error) {
45 if len(sc.Clusters) == 0 {
46 return nil, fmt.Errorf("no clusters configured")
47 } else if len(sc.Clusters) > 1 {
48 return nil, fmt.Errorf("multiple clusters configured, cannot choose")
50 for id, cc := range sc.Clusters {
56 cc, ok := sc.Clusters[clusterID]
58 return nil, fmt.Errorf("cluster %q is not configured", clusterID)
60 cc.ClusterID = clusterID
64 type WebDAVCacheConfig struct {
66 DiskCacheSize ByteSizeOrPercent
67 MaxCollectionBytes ByteSize
71 type UploadDownloadPermission struct {
76 type UploadDownloadRolePermissions struct {
77 User UploadDownloadPermission
78 Admin UploadDownloadPermission
81 type ManagedProperties map[string]struct {
88 ClusterID string `json:"-"`
89 ManagementToken string
90 SystemRootToken string
92 InstanceTypes InstanceTypeMap
93 Containers ContainersConfig
94 RemoteClusters map[string]RemoteCluster
98 AsyncPermissionsUpdateInterval Duration
99 DisabledAPIs StringSet
100 MaxIndexDatabaseRead int
101 MaxItemsPerResponse int
102 MaxConcurrentRailsRequests int
103 MaxConcurrentRequests int
104 MaxQueuedRequests int
105 MaxGatewayTunnels int
106 MaxQueueTimeForLockRequests Duration
107 MaxKeepBlobBuffers int
108 MaxRequestAmplification int
110 MaxTokenLifetime Duration
111 RequestTimeout Duration
113 WebsocketClientEventQueue int
114 WebsocketServerEventQueue int
115 KeepServiceRequestTimeout Duration
116 VocabularyPath string
117 FreezeProjectRequiresDescription bool
118 FreezeProjectRequiresProperties StringSet
119 UnfreezeProjectRequiresAdmin bool
120 LockBeforeUpdate bool
125 UnloggedAttributes StringSet
129 BlobSigningKey string
130 BlobSigningTTL Duration
132 BlobTrashLifetime Duration
133 BlobTrashCheckInterval Duration
134 BlobTrashConcurrency int
135 BlobDeleteConcurrency int
136 BlobReplicateConcurrency int
137 CollectionVersioning bool
138 DefaultTrashLifetime Duration
139 DefaultReplication int
140 ManagedProperties ManagedProperties
141 PreserveVersionIfIdle Duration
142 TrashSweepInterval Duration
144 ForwardSlashNameSubstitution string
147 BlobMissingReport string
148 BalancePeriod Duration
149 BalanceCollectionBatch int
150 BalanceCollectionBuffers int
151 BalanceTimeout Duration
152 BalanceUpdateLimit int
154 BalanceTrashLimit int
156 WebDAVCache WebDAVCacheConfig
158 KeepproxyPermission UploadDownloadRolePermissions
159 WebDAVPermission UploadDownloadRolePermissions
161 WebDAVLogDownloadInterval Duration
162 WebDAVOutputBuffer ByteSize
170 MinTLSVersion TLSVersion
173 SearchAttribute string
174 SearchBindUser string
175 SearchBindPassword string
178 EmailAttribute string
179 UsernameAttribute string
185 AlternateEmailAddresses bool
186 AuthenticationRequestParameters map[string]string
188 OpenIDConnect struct {
194 EmailVerifiedClaim string
196 AcceptAccessToken bool
197 AcceptAccessTokenScope string
198 AuthenticationRequestParameters map[string]string
203 DefaultEmailDomain string
207 Users map[string]TestUser
210 RemoteTokenRefresh Duration
211 TokenLifetime Duration
212 TrustedClients map[URL]struct{}
213 TrustPrivateNetworks bool
214 IssueTrustedTokens bool
219 MaxRequestLogParamsSize int
220 RequestQueueDumpDirectory string
231 ActivatedUsersAreVisibleToOthers bool
232 AnonymousUserToken string
233 AdminNotifierEmailFrom string
234 AutoAdminFirstUser bool
235 AutoAdminUserWithEmail string
236 AutoSetupNewUsers bool
237 AutoSetupNewUsersWithVmUUID string
238 AutoSetupUsernameBlacklist StringSet
239 EmailSubjectPrefix string
240 NewInactiveUserNotificationRecipients StringSet
241 NewUserNotificationRecipients StringSet
242 NewUsersAreActive bool
243 SendUserSetupNotificationEmail bool
244 SupportEmailAddress string
245 UserNotifierEmailFrom string
246 UserNotifierEmailBcc StringSet
247 UserProfileNotificationAddress string
248 PreferDomainForUsername string
249 UserSetupMailText string
250 RoleGroupsVisibleToAll bool
251 CanCreateRoleGroups bool
252 ActivityLoggingPeriod Duration
253 SyncIgnoredGroups []string
254 SyncRequiredGroups []string
255 SyncUserAccounts bool
256 SyncUserAPITokens bool
260 StorageClasses map[string]StorageClassConfig
261 Volumes map[string]Volume
263 ActivationContactLink string
264 ArvadosDocsite string
265 ArvadosPublicDataDocURL string
266 DisableSharingURLsUI bool
267 FileViewersConfigURL string
268 ShowUserAgreementInline bool
271 UserProfileFormFields map[string]struct {
273 FormFieldTitle string
274 FormFieldDescription string
277 Options map[string]struct{}
279 UserProfileFormMessage string
280 WelcomePageHTML string
281 InactivePageHTML string
282 SSHHelpPageHTML string
283 SSHHelpHostSuffix string
289 type StorageClassConfig struct {
295 AccessViaHosts map[URL]VolumeAccess
297 AllowTrashWhenReadOnly bool
299 StorageClasses map[string]bool
301 DriverParameters json.RawMessage
304 type S3VolumeDriverParameters struct {
306 SecretAccessKey string
310 LocationConstraint bool
313 ConnectTimeout Duration
320 type AzureVolumeDriverParameters struct {
321 StorageAccountName string
322 StorageAccountKey string
323 StorageBaseURL string
325 RequestTimeout Duration
326 ListBlobsRetryDelay Duration
327 ListBlobsMaxAttempts int
330 type DirectoryVolumeDriverParameters struct {
335 type VolumeAccess struct {
339 type Services struct {
342 DispatchCloud Service
344 DispatchSLURM Service
350 WebDAVDownload Service
358 type Service struct {
359 InternalURLs map[URL]ServiceInstance
363 type TestUser struct {
368 // URL is a url.URL that is also usable as a JSON key/value.
371 // UnmarshalText implements encoding.TextUnmarshaler so URL can be
372 // used as a JSON key/value.
373 func (su *URL) UnmarshalText(text []byte) error {
374 u, err := url.Parse(string(text))
377 if su.Path == "" && su.Host != "" {
378 // http://example really means http://example/
385 func (su URL) MarshalText() ([]byte, error) {
386 return []byte(su.String()), nil
389 func (su URL) String() string {
390 return (*url.URL)(&su).String()
393 type TLSVersion uint16
395 func (v TLSVersion) MarshalText() ([]byte, error) {
399 case tls.VersionTLS10:
400 return []byte("1.0"), nil
401 case tls.VersionTLS11:
402 return []byte("1.1"), nil
403 case tls.VersionTLS12:
404 return []byte("1.2"), nil
405 case tls.VersionTLS13:
406 return []byte("1.3"), nil
408 return nil, fmt.Errorf("unsupported TLSVersion %x", v)
412 func (v *TLSVersion) UnmarshalJSON(text []byte) error {
413 if len(text) > 0 && text[0] == '"' {
415 err := json.Unmarshal(text, &s)
421 switch string(text) {
425 *v = tls.VersionTLS10
427 *v = tls.VersionTLS11
429 *v = tls.VersionTLS12
431 *v = tls.VersionTLS13
433 return fmt.Errorf("unsupported TLSVersion %q", text)
438 type ServiceInstance struct {
440 Rendezvous string `json:",omitempty"`
443 type PostgreSQL struct {
444 Connection PostgreSQLConnection
448 type PostgreSQLConnection map[string]string
450 type RemoteCluster struct {
458 type CUDAFeatures struct {
460 HardwareCapability string
464 type InstanceType struct {
465 Name string `json:"-"`
469 Scratch ByteSize `json:"-"`
470 IncludedScratch ByteSize
471 AddedScratch ByteSize
477 type ContainersConfig struct {
478 CloudVMs CloudVMsConfig
479 CrunchRunCommand string
480 CrunchRunArgumentsList []string
481 DefaultKeepCacheRAM ByteSize
482 DispatchPrivateKey string
483 LogReuseDecisions bool
484 MaxDispatchAttempts int
486 MinRetryPeriod Duration
487 ReserveExtraRAM ByteSize
488 StaleLockTimeout Duration
489 SupportedDockerImageFormats StringSet
490 AlwaysUsePreemptibleInstances bool
491 PreemptiblePriceFactor float64
492 MaximumPriceFactor float64
494 LocalKeepBlobBuffersPerVCPU int
495 LocalKeepLogsToContainerLog string
498 LogUpdatePeriod Duration
499 LogUpdateSize ByteSize
507 SbatchArgumentsList []string
508 SbatchEnvironmentVariables map[string]string
512 BsubArgumentsList []string
513 BsubCUDAArguments []string
514 MaxRunTimeOverhead Duration
515 MaxRunTimeDefault Duration
519 type CloudVMsConfig struct {
522 BootProbeCommand string
523 InstanceInitCommand string
524 DeployRunnerBinary string
527 MaxCloudOpsPerSecond int
528 MaxProbesPerSecond int
529 MaxConcurrentInstanceCreateOps int
531 InitialQuotaEstimate int
532 SupervisorFraction float64
533 PollInterval Duration
534 ProbeInterval Duration
536 SyncInterval Duration
537 TimeoutBooting Duration
539 TimeoutProbe Duration
540 TimeoutShutdown Duration
541 TimeoutSignal Duration
542 TimeoutStaleRunLock Duration
544 ResourceTags map[string]string
548 DriverParameters json.RawMessage
551 type InstanceTypeMap map[string]InstanceType
553 var errDuplicateInstanceTypeName = errors.New("duplicate instance type name")
555 // UnmarshalJSON does special handling of InstanceTypes:
557 // - populate computed fields (Name and Scratch)
559 // - error out if InstancesTypes are populated as an array, which was
560 // deprecated in Arvados 1.2.0
561 func (it *InstanceTypeMap) UnmarshalJSON(data []byte) error {
562 fixup := func(t InstanceType) (InstanceType, error) {
563 if t.ProviderType == "" {
564 t.ProviderType = t.Name
566 // If t.Scratch is set in the configuration file, it will be ignored and overwritten.
567 // It will also generate a "deprecated or unknown config entry" warning.
568 t.Scratch = t.IncludedScratch + t.AddedScratch
572 if len(data) > 0 && data[0] == '[' {
573 return fmt.Errorf("InstanceTypes must be specified as a map, not an array, see https://doc.arvados.org/admin/config.html")
575 var hash map[string]InstanceType
576 err := json.Unmarshal(data, &hash)
580 // Fill in Name field (and ProviderType field, if not
581 // specified) using hash key.
582 *it = InstanceTypeMap(hash)
583 for name, t := range *it {
594 type StringSet map[string]struct{}
596 // UnmarshalJSON handles old config files that provide an array of
597 // instance types instead of a hash.
598 func (ss *StringSet) UnmarshalJSON(data []byte) error {
599 if len(data) > 0 && data[0] == '[' {
601 err := json.Unmarshal(data, &arr)
609 *ss = make(map[string]struct{}, len(arr))
610 for _, t := range arr {
611 (*ss)[t] = struct{}{}
615 var hash map[string]struct{}
616 err := json.Unmarshal(data, &hash)
620 *ss = make(map[string]struct{}, len(hash))
621 for t := range hash {
622 (*ss)[t] = struct{}{}
628 type ServiceName string
631 ServiceNameController ServiceName = "arvados-controller"
632 ServiceNameDispatchCloud ServiceName = "arvados-dispatch-cloud"
633 ServiceNameDispatchLSF ServiceName = "arvados-dispatch-lsf"
634 ServiceNameDispatchSLURM ServiceName = "crunch-dispatch-slurm"
635 ServiceNameHealth ServiceName = "arvados-health"
636 ServiceNameKeepbalance ServiceName = "keep-balance"
637 ServiceNameKeepproxy ServiceName = "keepproxy"
638 ServiceNameKeepstore ServiceName = "keepstore"
639 ServiceNameKeepweb ServiceName = "keep-web"
640 ServiceNameRailsAPI ServiceName = "arvados-api-server"
641 ServiceNameWebsocket ServiceName = "arvados-ws"
642 ServiceNameWorkbench1 ServiceName = "arvados-workbench1"
643 ServiceNameWorkbench2 ServiceName = "arvados-workbench2"
646 // Map returns all services as a map, suitable for iterating over all
647 // services or looking up a service by name.
648 func (svcs Services) Map() map[ServiceName]Service {
649 return map[ServiceName]Service{
650 ServiceNameController: svcs.Controller,
651 ServiceNameDispatchCloud: svcs.DispatchCloud,
652 ServiceNameDispatchLSF: svcs.DispatchLSF,
653 ServiceNameDispatchSLURM: svcs.DispatchSLURM,
654 ServiceNameHealth: svcs.Health,
655 ServiceNameKeepbalance: svcs.Keepbalance,
656 ServiceNameKeepproxy: svcs.Keepproxy,
657 ServiceNameKeepstore: svcs.Keepstore,
658 ServiceNameKeepweb: svcs.WebDAV,
659 ServiceNameRailsAPI: svcs.RailsAPI,
660 ServiceNameWebsocket: svcs.Websocket,
661 ServiceNameWorkbench1: svcs.Workbench1,
662 ServiceNameWorkbench2: svcs.Workbench2,