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[string]struct{}
207 IssueTrustedTokens bool
210 MailchimpAPIKey string
211 MailchimpListID string
212 SendUserSetupNotificationEmail bool
213 IssueReporterEmailFrom string
214 IssueReporterEmailTo string
215 SupportEmailAddress string
221 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
251 ActivityLoggingPeriod Duration
253 StorageClasses map[string]StorageClassConfig
254 Volumes map[string]Volume
256 ActivationContactLink string
257 APIClientConnectTimeout Duration
258 APIClientReceiveTimeout Duration
259 APIResponseCompression bool
260 ApplicationMimetypesWithViewIcon StringSet
261 ArvadosDocsite string
262 ArvadosPublicDataDocURL string
263 DefaultOpenIdPrefix string
264 DisableSharingURLsUI bool
265 EnableGettingStartedPopup bool
266 EnablePublicProjectsPage bool
267 FileViewersConfigURL string
268 LogViewerMaxBytes ByteSize
269 MultiSiteSearch string
270 ProfilingEnabled bool
272 RepositoryCache string
273 RunningJobLogRecordsToFetch int
275 ShowRecentCollectionsOnDashboard bool
276 ShowUserAgreementInline bool
277 ShowUserNotifications bool
280 UserProfileFormFields map[string]struct {
282 FormFieldTitle string
283 FormFieldDescription string
286 Options map[string]struct{}
288 UserProfileFormMessage string
289 WelcomePageHTML string
290 InactivePageHTML string
291 SSHHelpPageHTML string
292 SSHHelpHostSuffix string
297 type StorageClassConfig struct {
303 AccessViaHosts map[URL]VolumeAccess
306 StorageClasses map[string]bool
308 DriverParameters json.RawMessage
311 type S3VolumeDriverParameters struct {
314 SecretAccessKey string
318 LocationConstraint bool
320 UseAWSS3v2Driver bool
322 ConnectTimeout Duration
329 type AzureVolumeDriverParameters struct {
330 StorageAccountName string
331 StorageAccountKey string
332 StorageBaseURL string
334 RequestTimeout Duration
335 ListBlobsRetryDelay Duration
336 ListBlobsMaxAttempts int
339 type DirectoryVolumeDriverParameters struct {
344 type VolumeAccess struct {
348 type Services struct {
351 DispatchCloud Service
353 DispatchSLURM Service
361 WebDAVDownload Service
369 type Service struct {
370 InternalURLs map[URL]ServiceInstance
374 type TestUser struct {
379 // URL is a url.URL that is also usable as a JSON key/value.
382 // UnmarshalText implements encoding.TextUnmarshaler so URL can be
383 // used as a JSON key/value.
384 func (su *URL) UnmarshalText(text []byte) error {
385 u, err := url.Parse(string(text))
388 if su.Path == "" && su.Host != "" {
389 // http://example really means http://example/
396 func (su URL) MarshalText() ([]byte, error) {
397 return []byte(fmt.Sprintf("%s", (*url.URL)(&su).String())), nil
400 func (su URL) String() string {
401 return (*url.URL)(&su).String()
404 type ServiceInstance struct {
406 Rendezvous string `json:",omitempty"`
409 type PostgreSQL struct {
410 Connection PostgreSQLConnection
414 type PostgreSQLConnection map[string]string
416 type RemoteCluster struct {
424 type CUDAFeatures struct {
426 HardwareCapability string
430 type InstanceType struct {
431 Name string `json:"-"`
435 Scratch ByteSize `json:"-"`
436 IncludedScratch ByteSize
437 AddedScratch ByteSize
443 type ContainersConfig struct {
444 CloudVMs CloudVMsConfig
445 CrunchRunCommand string
446 CrunchRunArgumentsList []string
447 DefaultKeepCacheRAM ByteSize
448 DispatchPrivateKey string
449 LogReuseDecisions bool
451 MaxDispatchAttempts int
453 MinRetryPeriod Duration
454 ReserveExtraRAM ByteSize
455 StaleLockTimeout Duration
456 SupportedDockerImageFormats StringSet
457 AlwaysUsePreemptibleInstances bool
458 PreemptiblePriceFactor float64
460 LocalKeepBlobBuffersPerVCPU int
461 LocalKeepLogsToContainerLog string
465 GitInternalDir string
470 LogSecondsBetweenEvents Duration
471 LogThrottlePeriod Duration
474 LimitLogBytesPerJob int
475 LogPartialLineThrottlePeriod Duration
476 LogUpdatePeriod Duration
477 LogUpdateSize ByteSize
485 SbatchArgumentsList []string
486 SbatchEnvironmentVariables map[string]string
488 DNSServerConfDir string
489 DNSServerConfTemplate string
490 DNSServerReloadCommand string
491 DNSServerUpdateCommand string
492 ComputeNodeDomain string
493 ComputeNodeNameservers StringSet
494 AssignNodeHostname string
499 BsubArgumentsList []string
500 BsubCUDAArguments []string
504 type CloudVMsConfig struct {
507 BootProbeCommand string
508 DeployRunnerBinary string
510 MaxCloudOpsPerSecond int
511 MaxProbesPerSecond int
512 MaxConcurrentInstanceCreateOps int
513 PollInterval Duration
514 ProbeInterval Duration
516 SyncInterval Duration
517 TimeoutBooting Duration
519 TimeoutProbe Duration
520 TimeoutShutdown Duration
521 TimeoutSignal Duration
522 TimeoutStaleRunLock Duration
524 ResourceTags map[string]string
528 DriverParameters json.RawMessage
531 type InstanceTypeMap map[string]InstanceType
533 var errDuplicateInstanceTypeName = errors.New("duplicate instance type name")
535 // UnmarshalJSON does special handling of InstanceTypes:
536 // * populate computed fields (Name and Scratch)
537 // * error out if InstancesTypes are populated as an array, which was
538 // deprecated in Arvados 1.2.0
539 func (it *InstanceTypeMap) UnmarshalJSON(data []byte) error {
540 fixup := func(t InstanceType) (InstanceType, error) {
541 if t.ProviderType == "" {
542 t.ProviderType = t.Name
544 // If t.Scratch is set in the configuration file, it will be ignored and overwritten.
545 // It will also generate a "deprecated or unknown config entry" warning.
546 t.Scratch = t.IncludedScratch + t.AddedScratch
550 if len(data) > 0 && data[0] == '[' {
551 return fmt.Errorf("InstanceTypes must be specified as a map, not an array, see https://doc.arvados.org/admin/config.html")
553 var hash map[string]InstanceType
554 err := json.Unmarshal(data, &hash)
558 // Fill in Name field (and ProviderType field, if not
559 // specified) using hash key.
560 *it = InstanceTypeMap(hash)
561 for name, t := range *it {
572 type StringSet map[string]struct{}
574 // UnmarshalJSON handles old config files that provide an array of
575 // instance types instead of a hash.
576 func (ss *StringSet) UnmarshalJSON(data []byte) error {
577 if len(data) > 0 && data[0] == '[' {
579 err := json.Unmarshal(data, &arr)
587 *ss = make(map[string]struct{}, len(arr))
588 for _, t := range arr {
589 (*ss)[t] = struct{}{}
593 var hash map[string]struct{}
594 err := json.Unmarshal(data, &hash)
598 *ss = make(map[string]struct{}, len(hash))
599 for t := range hash {
600 (*ss)[t] = struct{}{}
606 type ServiceName string
609 ServiceNameController ServiceName = "arvados-controller"
610 ServiceNameDispatchCloud ServiceName = "arvados-dispatch-cloud"
611 ServiceNameDispatchLSF ServiceName = "arvados-dispatch-lsf"
612 ServiceNameDispatchSLURM ServiceName = "crunch-dispatch-slurm"
613 ServiceNameGitHTTP ServiceName = "arvados-git-httpd"
614 ServiceNameHealth ServiceName = "arvados-health"
615 ServiceNameKeepbalance ServiceName = "keep-balance"
616 ServiceNameKeepproxy ServiceName = "keepproxy"
617 ServiceNameKeepstore ServiceName = "keepstore"
618 ServiceNameKeepweb ServiceName = "keep-web"
619 ServiceNameRailsAPI ServiceName = "arvados-api-server"
620 ServiceNameWebsocket ServiceName = "arvados-ws"
621 ServiceNameWorkbench1 ServiceName = "arvados-workbench1"
622 ServiceNameWorkbench2 ServiceName = "arvados-workbench2"
625 // Map returns all services as a map, suitable for iterating over all
626 // services or looking up a service by name.
627 func (svcs Services) Map() map[ServiceName]Service {
628 return map[ServiceName]Service{
629 ServiceNameController: svcs.Controller,
630 ServiceNameDispatchCloud: svcs.DispatchCloud,
631 ServiceNameDispatchLSF: svcs.DispatchLSF,
632 ServiceNameDispatchSLURM: svcs.DispatchSLURM,
633 ServiceNameGitHTTP: svcs.GitHTTP,
634 ServiceNameHealth: svcs.Health,
635 ServiceNameKeepbalance: svcs.Keepbalance,
636 ServiceNameKeepproxy: svcs.Keepproxy,
637 ServiceNameKeepstore: svcs.Keepstore,
638 ServiceNameKeepweb: svcs.WebDAV,
639 ServiceNameRailsAPI: svcs.RailsAPI,
640 ServiceNameWebsocket: svcs.Websocket,
641 ServiceNameWorkbench1: svcs.Workbench1,
642 ServiceNameWorkbench2: svcs.Workbench2,