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 {
66 MaxCollectionBytes int64
70 type UploadDownloadPermission struct {
75 type UploadDownloadRolePermissions struct {
76 User UploadDownloadPermission
77 Admin UploadDownloadPermission
80 type ManagedProperties map[string]struct {
87 ClusterID string `json:"-"`
88 ManagementToken string
89 SystemRootToken string
91 InstanceTypes InstanceTypeMap
92 Containers ContainersConfig
93 RemoteClusters map[string]RemoteCluster
97 AsyncPermissionsUpdateInterval Duration
98 DisabledAPIs StringSet
99 MaxIndexDatabaseRead int
100 MaxItemsPerResponse int
101 MaxConcurrentRequests int
102 MaxKeepBlobBuffers int
103 MaxRequestAmplification int
105 MaxTokenLifetime Duration
106 RequestTimeout Duration
108 WebsocketClientEventQueue int
109 WebsocketServerEventQueue int
110 KeepServiceRequestTimeout Duration
111 VocabularyPath string
112 FreezeProjectRequiresDescription bool
113 FreezeProjectRequiresProperties StringSet
114 UnfreezeProjectRequiresAdmin bool
119 UnloggedAttributes StringSet
123 BlobSigningKey string
124 BlobSigningTTL Duration
126 BlobTrashLifetime Duration
127 BlobTrashCheckInterval Duration
128 BlobTrashConcurrency int
129 BlobDeleteConcurrency int
130 BlobReplicateConcurrency int
131 CollectionVersioning bool
132 DefaultTrashLifetime Duration
133 DefaultReplication int
134 ManagedProperties ManagedProperties
135 PreserveVersionIfIdle Duration
136 TrashSweepInterval Duration
138 ForwardSlashNameSubstitution string
141 BlobMissingReport string
142 BalancePeriod Duration
143 BalanceCollectionBatch int
144 BalanceCollectionBuffers int
145 BalanceTimeout Duration
146 BalanceUpdateLimit int
148 WebDAVCache WebDAVCacheConfig
150 KeepproxyPermission UploadDownloadRolePermissions
151 WebDAVPermission UploadDownloadRolePermissions
167 SearchAttribute string
168 SearchBindUser string
169 SearchBindPassword string
172 EmailAttribute string
173 UsernameAttribute string
179 AlternateEmailAddresses bool
180 AuthenticationRequestParameters map[string]string
182 OpenIDConnect struct {
188 EmailVerifiedClaim string
190 AcceptAccessToken bool
191 AcceptAccessTokenScope string
192 AuthenticationRequestParameters map[string]string
197 DefaultEmailDomain string
201 Users map[string]TestUser
204 RemoteTokenRefresh Duration
205 TokenLifetime Duration
206 TrustedClients map[URL]struct{}
207 TrustPrivateNetworks bool
208 IssueTrustedTokens bool
211 MailchimpAPIKey string
212 MailchimpListID string
213 SendUserSetupNotificationEmail bool
214 IssueReporterEmailFrom string
215 IssueReporterEmailTo string
216 SupportEmailAddress string
222 MaxRequestLogParamsSize int
233 ActivatedUsersAreVisibleToOthers bool
234 AnonymousUserToken string
235 AdminNotifierEmailFrom string
236 AutoAdminFirstUser bool
237 AutoAdminUserWithEmail string
238 AutoSetupNewUsers bool
239 AutoSetupNewUsersWithRepository bool
240 AutoSetupNewUsersWithVmUUID string
241 AutoSetupUsernameBlacklist StringSet
242 EmailSubjectPrefix string
243 NewInactiveUserNotificationRecipients StringSet
244 NewUserNotificationRecipients StringSet
245 NewUsersAreActive bool
246 UserNotifierEmailFrom string
247 UserNotifierEmailBcc StringSet
248 UserProfileNotificationAddress string
249 PreferDomainForUsername string
250 UserSetupMailText string
251 RoleGroupsVisibleToAll bool
252 CanCreateRoleGroups bool
253 ActivityLoggingPeriod Duration
255 StorageClasses map[string]StorageClassConfig
256 Volumes map[string]Volume
258 ActivationContactLink string
259 APIClientConnectTimeout Duration
260 APIClientReceiveTimeout Duration
261 APIResponseCompression bool
262 ApplicationMimetypesWithViewIcon StringSet
263 ArvadosDocsite string
264 ArvadosPublicDataDocURL string
265 DefaultOpenIdPrefix string
266 DisableSharingURLsUI bool
267 EnableGettingStartedPopup bool
268 EnablePublicProjectsPage bool
269 FileViewersConfigURL string
270 LogViewerMaxBytes ByteSize
271 MultiSiteSearch string
272 ProfilingEnabled bool
274 RepositoryCache string
275 RunningJobLogRecordsToFetch int
277 ShowRecentCollectionsOnDashboard bool
278 ShowUserAgreementInline bool
279 ShowUserNotifications bool
282 UserProfileFormFields map[string]struct {
284 FormFieldTitle string
285 FormFieldDescription string
288 Options map[string]struct{}
290 UserProfileFormMessage string
291 WelcomePageHTML string
292 InactivePageHTML string
293 SSHHelpPageHTML string
294 SSHHelpHostSuffix string
300 type StorageClassConfig struct {
306 AccessViaHosts map[URL]VolumeAccess
309 StorageClasses map[string]bool
311 DriverParameters json.RawMessage
314 type S3VolumeDriverParameters struct {
317 SecretAccessKey string
321 LocationConstraint bool
323 UseAWSS3v2Driver bool
325 ConnectTimeout Duration
332 type AzureVolumeDriverParameters struct {
333 StorageAccountName string
334 StorageAccountKey string
335 StorageBaseURL string
337 RequestTimeout Duration
338 ListBlobsRetryDelay Duration
339 ListBlobsMaxAttempts int
342 type DirectoryVolumeDriverParameters struct {
347 type VolumeAccess struct {
351 type Services struct {
354 DispatchCloud Service
356 DispatchSLURM Service
364 WebDAVDownload Service
372 type Service struct {
373 InternalURLs map[URL]ServiceInstance
377 type TestUser struct {
382 // URL is a url.URL that is also usable as a JSON key/value.
385 // UnmarshalText implements encoding.TextUnmarshaler so URL can be
386 // used as a JSON key/value.
387 func (su *URL) UnmarshalText(text []byte) error {
388 u, err := url.Parse(string(text))
391 if su.Path == "" && su.Host != "" {
392 // http://example really means http://example/
399 func (su URL) MarshalText() ([]byte, error) {
400 return []byte(su.String()), nil
403 func (su URL) String() string {
404 return (*url.URL)(&su).String()
407 type ServiceInstance struct {
409 Rendezvous string `json:",omitempty"`
412 type PostgreSQL struct {
413 Connection PostgreSQLConnection
417 type PostgreSQLConnection map[string]string
419 type RemoteCluster struct {
427 type CUDAFeatures struct {
429 HardwareCapability string
433 type InstanceType struct {
434 Name string `json:"-"`
438 Scratch ByteSize `json:"-"`
439 IncludedScratch ByteSize
440 AddedScratch ByteSize
446 type ContainersConfig struct {
447 CloudVMs CloudVMsConfig
448 CrunchRunCommand string
449 CrunchRunArgumentsList []string
450 DefaultKeepCacheRAM ByteSize
451 DefaultKeepCacheDisk ByteSize
452 DispatchPrivateKey string
453 LogReuseDecisions bool
455 MaxDispatchAttempts int
457 MinRetryPeriod Duration
458 ReserveExtraRAM ByteSize
459 StaleLockTimeout Duration
460 SupportedDockerImageFormats StringSet
461 AlwaysUsePreemptibleInstances bool
462 PreemptiblePriceFactor float64
464 LocalKeepBlobBuffersPerVCPU int
465 LocalKeepLogsToContainerLog string
469 GitInternalDir string
473 SweepInterval Duration
475 LogSecondsBetweenEvents Duration
476 LogThrottlePeriod Duration
479 LimitLogBytesPerJob int
480 LogPartialLineThrottlePeriod Duration
481 LogUpdatePeriod Duration
482 LogUpdateSize ByteSize
490 SbatchArgumentsList []string
491 SbatchEnvironmentVariables map[string]string
493 DNSServerConfDir string
494 DNSServerConfTemplate string
495 DNSServerReloadCommand string
496 DNSServerUpdateCommand string
497 ComputeNodeDomain string
498 ComputeNodeNameservers StringSet
499 AssignNodeHostname string
504 BsubArgumentsList []string
505 BsubCUDAArguments []string
509 type CloudVMsConfig struct {
512 BootProbeCommand string
513 DeployRunnerBinary string
515 MaxCloudOpsPerSecond int
516 MaxProbesPerSecond int
517 MaxConcurrentInstanceCreateOps int
518 PollInterval Duration
519 ProbeInterval Duration
521 SyncInterval Duration
522 TimeoutBooting Duration
524 TimeoutProbe Duration
525 TimeoutShutdown Duration
526 TimeoutSignal Duration
527 TimeoutStaleRunLock Duration
529 ResourceTags map[string]string
533 DriverParameters json.RawMessage
536 type InstanceTypeMap map[string]InstanceType
538 var errDuplicateInstanceTypeName = errors.New("duplicate instance type name")
540 // UnmarshalJSON does special handling of InstanceTypes:
542 // - populate computed fields (Name and Scratch)
544 // - error out if InstancesTypes are populated as an array, which was
545 // deprecated in Arvados 1.2.0
546 func (it *InstanceTypeMap) UnmarshalJSON(data []byte) error {
547 fixup := func(t InstanceType) (InstanceType, error) {
548 if t.ProviderType == "" {
549 t.ProviderType = t.Name
551 // If t.Scratch is set in the configuration file, it will be ignored and overwritten.
552 // It will also generate a "deprecated or unknown config entry" warning.
553 t.Scratch = t.IncludedScratch + t.AddedScratch
557 if len(data) > 0 && data[0] == '[' {
558 return fmt.Errorf("InstanceTypes must be specified as a map, not an array, see https://doc.arvados.org/admin/config.html")
560 var hash map[string]InstanceType
561 err := json.Unmarshal(data, &hash)
565 // Fill in Name field (and ProviderType field, if not
566 // specified) using hash key.
567 *it = InstanceTypeMap(hash)
568 for name, t := range *it {
579 type StringSet map[string]struct{}
581 // UnmarshalJSON handles old config files that provide an array of
582 // instance types instead of a hash.
583 func (ss *StringSet) UnmarshalJSON(data []byte) error {
584 if len(data) > 0 && data[0] == '[' {
586 err := json.Unmarshal(data, &arr)
594 *ss = make(map[string]struct{}, len(arr))
595 for _, t := range arr {
596 (*ss)[t] = struct{}{}
600 var hash map[string]struct{}
601 err := json.Unmarshal(data, &hash)
605 *ss = make(map[string]struct{}, len(hash))
606 for t := range hash {
607 (*ss)[t] = struct{}{}
613 type ServiceName string
616 ServiceNameController ServiceName = "arvados-controller"
617 ServiceNameDispatchCloud ServiceName = "arvados-dispatch-cloud"
618 ServiceNameDispatchLSF ServiceName = "arvados-dispatch-lsf"
619 ServiceNameDispatchSLURM ServiceName = "crunch-dispatch-slurm"
620 ServiceNameGitHTTP ServiceName = "arvados-git-httpd"
621 ServiceNameHealth ServiceName = "arvados-health"
622 ServiceNameKeepbalance ServiceName = "keep-balance"
623 ServiceNameKeepproxy ServiceName = "keepproxy"
624 ServiceNameKeepstore ServiceName = "keepstore"
625 ServiceNameKeepweb ServiceName = "keep-web"
626 ServiceNameRailsAPI ServiceName = "arvados-api-server"
627 ServiceNameWebsocket ServiceName = "arvados-ws"
628 ServiceNameWorkbench1 ServiceName = "arvados-workbench1"
629 ServiceNameWorkbench2 ServiceName = "arvados-workbench2"
632 // Map returns all services as a map, suitable for iterating over all
633 // services or looking up a service by name.
634 func (svcs Services) Map() map[ServiceName]Service {
635 return map[ServiceName]Service{
636 ServiceNameController: svcs.Controller,
637 ServiceNameDispatchCloud: svcs.DispatchCloud,
638 ServiceNameDispatchLSF: svcs.DispatchLSF,
639 ServiceNameDispatchSLURM: svcs.DispatchSLURM,
640 ServiceNameGitHTTP: svcs.GitHTTP,
641 ServiceNameHealth: svcs.Health,
642 ServiceNameKeepbalance: svcs.Keepbalance,
643 ServiceNameKeepproxy: svcs.Keepproxy,
644 ServiceNameKeepstore: svcs.Keepstore,
645 ServiceNameKeepweb: svcs.WebDAV,
646 ServiceNameRailsAPI: svcs.RailsAPI,
647 ServiceNameWebsocket: svcs.Websocket,
648 ServiceNameWorkbench1: svcs.Workbench1,
649 ServiceNameWorkbench2: svcs.Workbench2,