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 DispatchPrivateKey string
452 LogReuseDecisions bool
454 MaxDispatchAttempts int
456 MinRetryPeriod Duration
457 ReserveExtraRAM ByteSize
458 StaleLockTimeout Duration
459 SupportedDockerImageFormats StringSet
460 AlwaysUsePreemptibleInstances bool
461 PreemptiblePriceFactor float64
463 LocalKeepBlobBuffersPerVCPU int
464 LocalKeepLogsToContainerLog string
468 GitInternalDir string
472 SweepInterval Duration
474 LogSecondsBetweenEvents Duration
475 LogThrottlePeriod Duration
478 LimitLogBytesPerJob int
479 LogPartialLineThrottlePeriod Duration
480 LogUpdatePeriod Duration
481 LogUpdateSize ByteSize
489 SbatchArgumentsList []string
490 SbatchEnvironmentVariables map[string]string
492 DNSServerConfDir string
493 DNSServerConfTemplate string
494 DNSServerReloadCommand string
495 DNSServerUpdateCommand string
496 ComputeNodeDomain string
497 ComputeNodeNameservers StringSet
498 AssignNodeHostname string
503 BsubArgumentsList []string
504 BsubCUDAArguments []string
508 type CloudVMsConfig struct {
511 BootProbeCommand string
512 DeployRunnerBinary string
514 MaxCloudOpsPerSecond int
515 MaxProbesPerSecond int
516 MaxConcurrentInstanceCreateOps int
517 PollInterval Duration
518 ProbeInterval Duration
520 SyncInterval Duration
521 TimeoutBooting Duration
523 TimeoutProbe Duration
524 TimeoutShutdown Duration
525 TimeoutSignal Duration
526 TimeoutStaleRunLock Duration
528 ResourceTags map[string]string
532 DriverParameters json.RawMessage
535 type InstanceTypeMap map[string]InstanceType
537 var errDuplicateInstanceTypeName = errors.New("duplicate instance type name")
539 // UnmarshalJSON does special handling of InstanceTypes:
541 // - populate computed fields (Name and Scratch)
543 // - error out if InstancesTypes are populated as an array, which was
544 // deprecated in Arvados 1.2.0
545 func (it *InstanceTypeMap) UnmarshalJSON(data []byte) error {
546 fixup := func(t InstanceType) (InstanceType, error) {
547 if t.ProviderType == "" {
548 t.ProviderType = t.Name
550 // If t.Scratch is set in the configuration file, it will be ignored and overwritten.
551 // It will also generate a "deprecated or unknown config entry" warning.
552 t.Scratch = t.IncludedScratch + t.AddedScratch
556 if len(data) > 0 && data[0] == '[' {
557 return fmt.Errorf("InstanceTypes must be specified as a map, not an array, see https://doc.arvados.org/admin/config.html")
559 var hash map[string]InstanceType
560 err := json.Unmarshal(data, &hash)
564 // Fill in Name field (and ProviderType field, if not
565 // specified) using hash key.
566 *it = InstanceTypeMap(hash)
567 for name, t := range *it {
578 type StringSet map[string]struct{}
580 // UnmarshalJSON handles old config files that provide an array of
581 // instance types instead of a hash.
582 func (ss *StringSet) UnmarshalJSON(data []byte) error {
583 if len(data) > 0 && data[0] == '[' {
585 err := json.Unmarshal(data, &arr)
593 *ss = make(map[string]struct{}, len(arr))
594 for _, t := range arr {
595 (*ss)[t] = struct{}{}
599 var hash map[string]struct{}
600 err := json.Unmarshal(data, &hash)
604 *ss = make(map[string]struct{}, len(hash))
605 for t := range hash {
606 (*ss)[t] = struct{}{}
612 type ServiceName string
615 ServiceNameController ServiceName = "arvados-controller"
616 ServiceNameDispatchCloud ServiceName = "arvados-dispatch-cloud"
617 ServiceNameDispatchLSF ServiceName = "arvados-dispatch-lsf"
618 ServiceNameDispatchSLURM ServiceName = "crunch-dispatch-slurm"
619 ServiceNameGitHTTP ServiceName = "arvados-git-httpd"
620 ServiceNameHealth ServiceName = "arvados-health"
621 ServiceNameKeepbalance ServiceName = "keep-balance"
622 ServiceNameKeepproxy ServiceName = "keepproxy"
623 ServiceNameKeepstore ServiceName = "keepstore"
624 ServiceNameKeepweb ServiceName = "keep-web"
625 ServiceNameRailsAPI ServiceName = "arvados-api-server"
626 ServiceNameWebsocket ServiceName = "arvados-ws"
627 ServiceNameWorkbench1 ServiceName = "arvados-workbench1"
628 ServiceNameWorkbench2 ServiceName = "arvados-workbench2"
631 // Map returns all services as a map, suitable for iterating over all
632 // services or looking up a service by name.
633 func (svcs Services) Map() map[ServiceName]Service {
634 return map[ServiceName]Service{
635 ServiceNameController: svcs.Controller,
636 ServiceNameDispatchCloud: svcs.DispatchCloud,
637 ServiceNameDispatchLSF: svcs.DispatchLSF,
638 ServiceNameDispatchSLURM: svcs.DispatchSLURM,
639 ServiceNameGitHTTP: svcs.GitHTTP,
640 ServiceNameHealth: svcs.Health,
641 ServiceNameKeepbalance: svcs.Keepbalance,
642 ServiceNameKeepproxy: svcs.Keepproxy,
643 ServiceNameKeepstore: svcs.Keepstore,
644 ServiceNameKeepweb: svcs.WebDAV,
645 ServiceNameRailsAPI: svcs.RailsAPI,
646 ServiceNameWebsocket: svcs.Websocket,
647 ServiceNameWorkbench1: svcs.Workbench1,
648 ServiceNameWorkbench2: svcs.Workbench2,