1 // Copyright (C) The Arvados Authors. All rights reserved.
3 // SPDX-License-Identifier: Apache-2.0
15 "git.arvados.org/arvados.git/sdk/go/config"
18 var DefaultConfigFile = func() string {
19 if path := os.Getenv("ARVADOS_CONFIG"); path != "" {
22 return "/etc/arvados/config.yml"
26 Clusters map[string]Cluster
28 SourceTimestamp time.Time
32 // GetConfig returns the current system config, loading it from
33 // configFile if needed.
34 func GetConfig(configFile string) (*Config, error) {
36 err := config.LoadFile(&cfg, configFile)
40 // GetCluster returns the cluster ID and config for the given
41 // cluster, or the default/only configured cluster if clusterID is "".
42 func (sc *Config) GetCluster(clusterID string) (*Cluster, error) {
44 if len(sc.Clusters) == 0 {
45 return nil, fmt.Errorf("no clusters configured")
46 } else if len(sc.Clusters) > 1 {
47 return nil, fmt.Errorf("multiple clusters configured, cannot choose")
49 for id, cc := range sc.Clusters {
55 cc, ok := sc.Clusters[clusterID]
57 return nil, fmt.Errorf("cluster %q is not configured", clusterID)
59 cc.ClusterID = clusterID
63 type WebDAVCacheConfig struct {
67 MaxCollectionEntries int
68 MaxCollectionBytes int64
73 type UploadDownloadPermission struct {
78 type UploadDownloadRolePermissions struct {
79 User UploadDownloadPermission
80 Admin UploadDownloadPermission
83 type ManagedProperties map[string]struct {
90 ClusterID string `json:"-"`
91 ManagementToken string
92 SystemRootToken string
94 InstanceTypes InstanceTypeMap
95 Containers ContainersConfig
96 RemoteClusters map[string]RemoteCluster
100 AsyncPermissionsUpdateInterval Duration
101 DisabledAPIs StringSet
102 MaxIndexDatabaseRead int
103 MaxItemsPerResponse int
104 MaxConcurrentRequests int
105 MaxKeepBlobBuffers int
106 MaxRequestAmplification int
108 MaxTokenLifetime Duration
109 RequestTimeout Duration
111 WebsocketClientEventQueue int
112 WebsocketServerEventQueue int
113 KeepServiceRequestTimeout Duration
114 VocabularyPath string
115 FreezeProjectRequiresDescription bool
116 FreezeProjectRequiresProperties StringSet
117 UnfreezeProjectRequiresAdmin bool
122 UnloggedAttributes StringSet
126 BlobSigningKey string
127 BlobSigningTTL Duration
129 BlobTrashLifetime Duration
130 BlobTrashCheckInterval Duration
131 BlobTrashConcurrency int
132 BlobDeleteConcurrency int
133 BlobReplicateConcurrency int
134 CollectionVersioning bool
135 DefaultTrashLifetime Duration
136 DefaultReplication int
137 ManagedProperties ManagedProperties
138 PreserveVersionIfIdle Duration
139 TrashSweepInterval Duration
141 ForwardSlashNameSubstitution string
144 BlobMissingReport string
145 BalancePeriod Duration
146 BalanceCollectionBatch int
147 BalanceCollectionBuffers int
148 BalanceTimeout Duration
149 BalanceUpdateLimit int
151 WebDAVCache WebDAVCacheConfig
153 KeepproxyPermission UploadDownloadRolePermissions
154 WebDAVPermission UploadDownloadRolePermissions
170 SearchAttribute string
171 SearchBindUser string
172 SearchBindPassword string
175 EmailAttribute string
176 UsernameAttribute string
182 AlternateEmailAddresses bool
183 AuthenticationRequestParameters map[string]string
185 OpenIDConnect struct {
191 EmailVerifiedClaim string
193 AcceptAccessToken bool
194 AcceptAccessTokenScope string
195 AuthenticationRequestParameters map[string]string
200 DefaultEmailDomain string
204 Users map[string]TestUser
207 RemoteTokenRefresh Duration
208 TokenLifetime Duration
209 TrustedClients map[string]struct{}
210 IssueTrustedTokens bool
213 MailchimpAPIKey string
214 MailchimpListID string
215 SendUserSetupNotificationEmail bool
216 IssueReporterEmailFrom string
217 IssueReporterEmailTo string
218 SupportEmailAddress string
224 MaxRequestLogParamsSize int
232 ActivatedUsersAreVisibleToOthers bool
233 AnonymousUserToken string
234 AdminNotifierEmailFrom string
235 AutoAdminFirstUser bool
236 AutoAdminUserWithEmail string
237 AutoSetupNewUsers bool
238 AutoSetupNewUsersWithRepository bool
239 AutoSetupNewUsersWithVmUUID string
240 AutoSetupUsernameBlacklist StringSet
241 EmailSubjectPrefix string
242 NewInactiveUserNotificationRecipients StringSet
243 NewUserNotificationRecipients StringSet
244 NewUsersAreActive bool
245 UserNotifierEmailFrom string
246 UserNotifierEmailBcc StringSet
247 UserProfileNotificationAddress string
248 PreferDomainForUsername string
249 UserSetupMailText string
250 RoleGroupsVisibleToAll bool
252 StorageClasses map[string]StorageClassConfig
253 Volumes map[string]Volume
255 ActivationContactLink string
256 APIClientConnectTimeout Duration
257 APIClientReceiveTimeout Duration
258 APIResponseCompression bool
259 ApplicationMimetypesWithViewIcon StringSet
260 ArvadosDocsite string
261 ArvadosPublicDataDocURL string
262 DefaultOpenIdPrefix string
263 DisableSharingURLsUI bool
264 EnableGettingStartedPopup bool
265 EnablePublicProjectsPage bool
266 FileViewersConfigURL string
267 LogViewerMaxBytes ByteSize
268 MultiSiteSearch string
269 ProfilingEnabled bool
271 RepositoryCache string
272 RunningJobLogRecordsToFetch int
274 ShowRecentCollectionsOnDashboard bool
275 ShowUserAgreementInline bool
276 ShowUserNotifications bool
279 UserProfileFormFields map[string]struct {
281 FormFieldTitle string
282 FormFieldDescription string
285 Options map[string]struct{}
287 UserProfileFormMessage string
288 WelcomePageHTML string
289 InactivePageHTML string
290 SSHHelpPageHTML string
291 SSHHelpHostSuffix string
296 type StorageClassConfig struct {
302 AccessViaHosts map[URL]VolumeAccess
305 StorageClasses map[string]bool
307 DriverParameters json.RawMessage
310 type S3VolumeDriverParameters struct {
313 SecretAccessKey string
317 LocationConstraint bool
319 UseAWSS3v2Driver bool
321 ConnectTimeout Duration
328 type AzureVolumeDriverParameters struct {
329 StorageAccountName string
330 StorageAccountKey string
331 StorageBaseURL string
333 RequestTimeout Duration
334 ListBlobsRetryDelay Duration
335 ListBlobsMaxAttempts int
338 type DirectoryVolumeDriverParameters struct {
343 type VolumeAccess struct {
347 type Services struct {
350 DispatchCloud Service
352 DispatchSLURM Service
360 WebDAVDownload Service
368 type Service struct {
369 InternalURLs map[URL]ServiceInstance
373 type TestUser struct {
378 // URL is a url.URL that is also usable as a JSON key/value.
381 // UnmarshalText implements encoding.TextUnmarshaler so URL can be
382 // used as a JSON key/value.
383 func (su *URL) UnmarshalText(text []byte) error {
384 u, err := url.Parse(string(text))
387 if su.Path == "" && su.Host != "" {
388 // http://example really means http://example/
395 func (su URL) MarshalText() ([]byte, error) {
396 return []byte(fmt.Sprintf("%s", (*url.URL)(&su).String())), nil
399 func (su URL) String() string {
400 return (*url.URL)(&su).String()
403 type ServiceInstance struct {
404 Rendezvous string `json:",omitempty"`
407 type PostgreSQL struct {
408 Connection PostgreSQLConnection
412 type PostgreSQLConnection map[string]string
414 type RemoteCluster struct {
422 type CUDAFeatures struct {
424 HardwareCapability string
428 type InstanceType struct {
429 Name string `json:"-"`
433 Scratch ByteSize `json:"-"`
434 IncludedScratch ByteSize
435 AddedScratch ByteSize
441 type ContainersConfig struct {
442 CloudVMs CloudVMsConfig
443 CrunchRunCommand string
444 CrunchRunArgumentsList []string
445 DefaultKeepCacheRAM ByteSize
446 DispatchPrivateKey string
447 LogReuseDecisions bool
449 MaxDispatchAttempts int
451 MinRetryPeriod Duration
452 ReserveExtraRAM ByteSize
453 StaleLockTimeout Duration
454 SupportedDockerImageFormats StringSet
455 AlwaysUsePreemptibleInstances bool
456 PreemptiblePriceFactor float64
458 LocalKeepBlobBuffersPerVCPU int
459 LocalKeepLogsToContainerLog string
463 GitInternalDir string
468 LogSecondsBetweenEvents Duration
469 LogThrottlePeriod Duration
472 LimitLogBytesPerJob int
473 LogPartialLineThrottlePeriod Duration
474 LogUpdatePeriod Duration
475 LogUpdateSize ByteSize
483 SbatchArgumentsList []string
484 SbatchEnvironmentVariables map[string]string
486 DNSServerConfDir string
487 DNSServerConfTemplate string
488 DNSServerReloadCommand string
489 DNSServerUpdateCommand string
490 ComputeNodeDomain string
491 ComputeNodeNameservers StringSet
492 AssignNodeHostname string
497 BsubArgumentsList []string
498 BsubCUDAArguments []string
502 type CloudVMsConfig struct {
505 BootProbeCommand string
506 DeployRunnerBinary string
508 MaxCloudOpsPerSecond int
509 MaxProbesPerSecond int
510 MaxConcurrentInstanceCreateOps int
511 PollInterval Duration
512 ProbeInterval Duration
514 SyncInterval Duration
515 TimeoutBooting Duration
517 TimeoutProbe Duration
518 TimeoutShutdown Duration
519 TimeoutSignal Duration
520 TimeoutStaleRunLock Duration
522 ResourceTags map[string]string
526 DriverParameters json.RawMessage
529 type InstanceTypeMap map[string]InstanceType
531 var errDuplicateInstanceTypeName = errors.New("duplicate instance type name")
533 // UnmarshalJSON does special handling of InstanceTypes:
534 // * populate computed fields (Name and Scratch)
535 // * error out if InstancesTypes are populated as an array, which was
536 // deprecated in Arvados 1.2.0
537 func (it *InstanceTypeMap) UnmarshalJSON(data []byte) error {
538 fixup := func(t InstanceType) (InstanceType, error) {
539 if t.ProviderType == "" {
540 t.ProviderType = t.Name
542 // If t.Scratch is set in the configuration file, it will be ignored and overwritten.
543 // It will also generate a "deprecated or unknown config entry" warning.
544 t.Scratch = t.IncludedScratch + t.AddedScratch
548 if len(data) > 0 && data[0] == '[' {
549 return fmt.Errorf("InstanceTypes must be specified as a map, not an array, see https://doc.arvados.org/admin/config.html")
551 var hash map[string]InstanceType
552 err := json.Unmarshal(data, &hash)
556 // Fill in Name field (and ProviderType field, if not
557 // specified) using hash key.
558 *it = InstanceTypeMap(hash)
559 for name, t := range *it {
570 type StringSet map[string]struct{}
572 // UnmarshalJSON handles old config files that provide an array of
573 // instance types instead of a hash.
574 func (ss *StringSet) UnmarshalJSON(data []byte) error {
575 if len(data) > 0 && data[0] == '[' {
577 err := json.Unmarshal(data, &arr)
585 *ss = make(map[string]struct{}, len(arr))
586 for _, t := range arr {
587 (*ss)[t] = struct{}{}
591 var hash map[string]struct{}
592 err := json.Unmarshal(data, &hash)
596 *ss = make(map[string]struct{}, len(hash))
597 for t := range hash {
598 (*ss)[t] = struct{}{}
604 type ServiceName string
607 ServiceNameController ServiceName = "arvados-controller"
608 ServiceNameDispatchCloud ServiceName = "arvados-dispatch-cloud"
609 ServiceNameDispatchLSF ServiceName = "arvados-dispatch-lsf"
610 ServiceNameDispatchSLURM ServiceName = "crunch-dispatch-slurm"
611 ServiceNameGitHTTP ServiceName = "arvados-git-httpd"
612 ServiceNameHealth ServiceName = "arvados-health"
613 ServiceNameKeepbalance ServiceName = "keep-balance"
614 ServiceNameKeepproxy ServiceName = "keepproxy"
615 ServiceNameKeepstore ServiceName = "keepstore"
616 ServiceNameKeepweb ServiceName = "keep-web"
617 ServiceNameRailsAPI ServiceName = "arvados-api-server"
618 ServiceNameWebsocket ServiceName = "arvados-ws"
619 ServiceNameWorkbench1 ServiceName = "arvados-workbench1"
620 ServiceNameWorkbench2 ServiceName = "arvados-workbench2"
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 ServiceNameController: svcs.Controller,
628 ServiceNameDispatchCloud: svcs.DispatchCloud,
629 ServiceNameDispatchLSF: svcs.DispatchLSF,
630 ServiceNameDispatchSLURM: svcs.DispatchSLURM,
631 ServiceNameGitHTTP: svcs.GitHTTP,
632 ServiceNameHealth: svcs.Health,
633 ServiceNameKeepbalance: svcs.Keepbalance,
634 ServiceNameKeepproxy: svcs.Keepproxy,
635 ServiceNameKeepstore: svcs.Keepstore,
636 ServiceNameKeepweb: svcs.WebDAV,
637 ServiceNameRailsAPI: svcs.RailsAPI,
638 ServiceNameWebsocket: svcs.Websocket,
639 ServiceNameWorkbench1: svcs.Workbench1,
640 ServiceNameWorkbench2: svcs.Workbench2,