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
321 type AzureVolumeDriverParameters struct {
322 StorageAccountName string
323 StorageAccountKey string
324 StorageBaseURL string
326 RequestTimeout Duration
327 ListBlobsRetryDelay Duration
328 ListBlobsMaxAttempts int
331 type DirectoryVolumeDriverParameters struct {
336 type VolumeAccess struct {
340 type Services struct {
342 ContainerWebServices ServiceWithPortRange
344 DispatchCloud Service
346 DispatchSLURM Service
352 WebDAVDownload Service
360 type Service struct {
361 InternalURLs map[URL]ServiceInstance
365 type ServiceWithPortRange struct {
371 type TestUser struct {
376 // URL is a url.URL that is also usable as a JSON key/value.
379 // UnmarshalText implements encoding.TextUnmarshaler so URL can be
380 // used as a JSON key/value.
381 func (su *URL) UnmarshalText(text []byte) error {
382 u, err := url.Parse(string(text))
385 if su.Path == "" && su.Host != "" {
386 // http://example really means http://example/
393 func (su URL) MarshalText() ([]byte, error) {
394 return []byte(su.String()), nil
397 func (su URL) String() string {
398 return (*url.URL)(&su).String()
401 type TLSVersion uint16
403 func (v TLSVersion) MarshalText() ([]byte, error) {
407 case tls.VersionTLS10:
408 return []byte("1.0"), nil
409 case tls.VersionTLS11:
410 return []byte("1.1"), nil
411 case tls.VersionTLS12:
412 return []byte("1.2"), nil
413 case tls.VersionTLS13:
414 return []byte("1.3"), nil
416 return nil, fmt.Errorf("unsupported TLSVersion %x", v)
420 func (v *TLSVersion) UnmarshalJSON(text []byte) error {
421 if len(text) > 0 && text[0] == '"' {
423 err := json.Unmarshal(text, &s)
429 switch string(text) {
433 *v = tls.VersionTLS10
435 *v = tls.VersionTLS11
437 *v = tls.VersionTLS12
439 *v = tls.VersionTLS13
441 return fmt.Errorf("unsupported TLSVersion %q", text)
446 type ServiceInstance struct {
448 Rendezvous string `json:",omitempty"`
451 type PostgreSQL struct {
452 Connection PostgreSQLConnection
456 type PostgreSQLConnection map[string]string
458 type RemoteCluster struct {
466 type GPUFeatures struct {
467 // as of this writing, stack is "cuda" or "rocm"
470 HardwareTarget string
475 type InstanceType struct {
476 Name string `json:"-"`
480 Scratch ByteSize `json:"-"`
481 IncludedScratch ByteSize
482 AddedScratch ByteSize
488 type ContainersConfig struct {
489 CloudVMs CloudVMsConfig
490 CrunchRunCommand string
491 CrunchRunArgumentsList []string
492 DefaultKeepCacheRAM ByteSize
493 DispatchPrivateKey string
494 LogReuseDecisions bool
495 MaxDispatchAttempts int
497 MinRetryPeriod Duration
498 ReserveExtraRAM ByteSize
499 StaleLockTimeout Duration
500 SupportedDockerImageFormats StringSet
501 AlwaysUsePreemptibleInstances bool
502 PreemptiblePriceFactor float64
503 MaximumPriceFactor float64
505 LocalKeepBlobBuffersPerVCPU int
506 LocalKeepLogsToContainerLog string
509 LogUpdatePeriod Duration
510 LogUpdateSize ByteSize
518 SbatchArgumentsList []string
519 SbatchEnvironmentVariables map[string]string
523 BsubArgumentsList []string
524 BsubGPUArguments []string
525 MaxRunTimeOverhead Duration
526 MaxRunTimeDefault Duration
530 type CloudVMsConfig struct {
533 BootProbeCommand string
534 InstanceInitCommand string
535 DeployRunnerBinary string
536 DeployRunnerDirectory string
539 MaxCloudOpsPerSecond int
540 MaxProbesPerSecond int
541 MaxConcurrentInstanceCreateOps int
543 InitialQuotaEstimate int
544 SupervisorFraction float64
545 PollInterval Duration
546 ProbeInterval Duration
548 SyncInterval Duration
549 TimeoutBooting Duration
551 TimeoutProbe Duration
552 TimeoutShutdown Duration
553 TimeoutSignal Duration
554 TimeoutStaleRunLock Duration
556 ResourceTags map[string]string
560 DriverParameters json.RawMessage
563 type InstanceTypeMap map[string]InstanceType
565 var errDuplicateInstanceTypeName = errors.New("duplicate instance type name")
567 // UnmarshalJSON does special handling of InstanceTypes:
569 // - populate computed fields (Name and Scratch)
571 // - error out if InstancesTypes are populated as an array, which was
572 // deprecated in Arvados 1.2.0
573 func (it *InstanceTypeMap) UnmarshalJSON(data []byte) error {
574 fixup := func(t InstanceType) (InstanceType, error) {
575 if t.ProviderType == "" {
576 t.ProviderType = t.Name
578 // If t.Scratch is set in the configuration file, it will be ignored and overwritten.
579 // It will also generate a "deprecated or unknown config entry" warning.
580 t.Scratch = t.IncludedScratch + t.AddedScratch
584 if len(data) > 0 && data[0] == '[' {
585 return fmt.Errorf("InstanceTypes must be specified as a map, not an array, see https://doc.arvados.org/admin/config.html")
587 var hash map[string]InstanceType
588 err := json.Unmarshal(data, &hash)
592 // Fill in Name field (and ProviderType field, if not
593 // specified) using hash key.
594 *it = InstanceTypeMap(hash)
595 for name, t := range *it {
606 type StringSet map[string]struct{}
608 // UnmarshalJSON handles old config files that provide an array of
609 // instance types instead of a hash.
610 func (ss *StringSet) UnmarshalJSON(data []byte) error {
611 if len(data) > 0 && data[0] == '[' {
613 err := json.Unmarshal(data, &arr)
621 *ss = make(map[string]struct{}, len(arr))
622 for _, t := range arr {
623 (*ss)[t] = struct{}{}
627 var hash map[string]struct{}
628 err := json.Unmarshal(data, &hash)
632 *ss = make(map[string]struct{}, len(hash))
633 for t := range hash {
634 (*ss)[t] = struct{}{}
640 type ServiceName string
643 ServiceNameController ServiceName = "arvados-controller"
644 ServiceNameDispatchCloud ServiceName = "arvados-dispatch-cloud"
645 ServiceNameDispatchLSF ServiceName = "arvados-dispatch-lsf"
646 ServiceNameDispatchSLURM ServiceName = "crunch-dispatch-slurm"
647 ServiceNameHealth ServiceName = "arvados-health"
648 ServiceNameKeepbalance ServiceName = "keep-balance"
649 ServiceNameKeepproxy ServiceName = "keepproxy"
650 ServiceNameKeepstore ServiceName = "keepstore"
651 ServiceNameKeepweb ServiceName = "keep-web"
652 ServiceNameRailsAPI ServiceName = "arvados-api-server"
653 ServiceNameWebsocket ServiceName = "arvados-ws"
654 ServiceNameWorkbench1 ServiceName = "arvados-workbench1"
655 ServiceNameWorkbench2 ServiceName = "arvados-workbench2"
658 // Map returns all services as a map, suitable for iterating over all
659 // services or looking up a service by name.
660 func (svcs Services) Map() map[ServiceName]Service {
661 return map[ServiceName]Service{
662 ServiceNameController: svcs.Controller,
663 ServiceNameDispatchCloud: svcs.DispatchCloud,
664 ServiceNameDispatchLSF: svcs.DispatchLSF,
665 ServiceNameDispatchSLURM: svcs.DispatchSLURM,
666 ServiceNameHealth: svcs.Health,
667 ServiceNameKeepbalance: svcs.Keepbalance,
668 ServiceNameKeepproxy: svcs.Keepproxy,
669 ServiceNameKeepstore: svcs.Keepstore,
670 ServiceNameKeepweb: svcs.WebDAV,
671 ServiceNameRailsAPI: svcs.RailsAPI,
672 ServiceNameWebsocket: svcs.Websocket,
673 ServiceNameWorkbench1: svcs.Workbench1,
674 ServiceNameWorkbench2: svcs.Workbench2,