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 {
67 MaxCollectionBytes int64
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 MaxConcurrentRequests int
103 LogCreateRequestFraction float64
104 MaxKeepBlobBuffers int
105 MaxRequestAmplification int
107 MaxTokenLifetime Duration
108 RequestTimeout Duration
110 WebsocketClientEventQueue int
111 WebsocketServerEventQueue int
112 KeepServiceRequestTimeout Duration
113 VocabularyPath string
114 FreezeProjectRequiresDescription bool
115 FreezeProjectRequiresProperties StringSet
116 UnfreezeProjectRequiresAdmin bool
117 LockBeforeUpdate 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
168 MinTLSVersion TLSVersion
171 SearchAttribute string
172 SearchBindUser string
173 SearchBindPassword string
176 EmailAttribute string
177 UsernameAttribute string
183 AlternateEmailAddresses bool
184 AuthenticationRequestParameters map[string]string
186 OpenIDConnect struct {
192 EmailVerifiedClaim string
194 AcceptAccessToken bool
195 AcceptAccessTokenScope string
196 AuthenticationRequestParameters map[string]string
201 DefaultEmailDomain string
205 Users map[string]TestUser
208 RemoteTokenRefresh Duration
209 TokenLifetime Duration
210 TrustedClients map[URL]struct{}
211 TrustPrivateNetworks bool
212 IssueTrustedTokens bool
215 MailchimpAPIKey string
216 MailchimpListID string
217 SendUserSetupNotificationEmail bool
218 IssueReporterEmailFrom string
219 IssueReporterEmailTo string
220 SupportEmailAddress string
226 MaxRequestLogParamsSize int
237 ActivatedUsersAreVisibleToOthers bool
238 AnonymousUserToken string
239 AdminNotifierEmailFrom string
240 AutoAdminFirstUser bool
241 AutoAdminUserWithEmail string
242 AutoSetupNewUsers bool
243 AutoSetupNewUsersWithRepository bool
244 AutoSetupNewUsersWithVmUUID string
245 AutoSetupUsernameBlacklist StringSet
246 EmailSubjectPrefix string
247 NewInactiveUserNotificationRecipients StringSet
248 NewUserNotificationRecipients StringSet
249 NewUsersAreActive bool
250 UserNotifierEmailFrom string
251 UserNotifierEmailBcc StringSet
252 UserProfileNotificationAddress string
253 PreferDomainForUsername string
254 UserSetupMailText string
255 RoleGroupsVisibleToAll bool
256 CanCreateRoleGroups bool
257 ActivityLoggingPeriod Duration
259 StorageClasses map[string]StorageClassConfig
260 Volumes map[string]Volume
262 ActivationContactLink string
263 APIClientConnectTimeout Duration
264 APIClientReceiveTimeout Duration
265 APIResponseCompression bool
266 ApplicationMimetypesWithViewIcon StringSet
267 ArvadosDocsite string
268 ArvadosPublicDataDocURL string
269 DefaultOpenIdPrefix string
270 DisableSharingURLsUI bool
271 EnableGettingStartedPopup bool
272 EnablePublicProjectsPage bool
273 FileViewersConfigURL string
274 LogViewerMaxBytes ByteSize
275 MultiSiteSearch string
276 ProfilingEnabled bool
278 RepositoryCache string
279 RunningJobLogRecordsToFetch int
281 ShowRecentCollectionsOnDashboard bool
282 ShowUserAgreementInline bool
283 ShowUserNotifications bool
286 UserProfileFormFields map[string]struct {
288 FormFieldTitle string
289 FormFieldDescription string
292 Options map[string]struct{}
294 UserProfileFormMessage string
295 WelcomePageHTML string
296 InactivePageHTML string
297 SSHHelpPageHTML string
298 SSHHelpHostSuffix string
304 type StorageClassConfig struct {
310 AccessViaHosts map[URL]VolumeAccess
313 StorageClasses map[string]bool
315 DriverParameters json.RawMessage
318 type S3VolumeDriverParameters struct {
321 SecretAccessKey string
325 LocationConstraint bool
327 UseAWSS3v2Driver bool
329 ConnectTimeout Duration
336 type AzureVolumeDriverParameters struct {
337 StorageAccountName string
338 StorageAccountKey string
339 StorageBaseURL string
341 RequestTimeout Duration
342 ListBlobsRetryDelay Duration
343 ListBlobsMaxAttempts int
346 type DirectoryVolumeDriverParameters struct {
351 type VolumeAccess struct {
355 type Services struct {
358 DispatchCloud Service
360 DispatchSLURM Service
368 WebDAVDownload Service
376 type Service struct {
377 InternalURLs map[URL]ServiceInstance
381 type TestUser struct {
386 // URL is a url.URL that is also usable as a JSON key/value.
389 // UnmarshalText implements encoding.TextUnmarshaler so URL can be
390 // used as a JSON key/value.
391 func (su *URL) UnmarshalText(text []byte) error {
392 u, err := url.Parse(string(text))
395 if su.Path == "" && su.Host != "" {
396 // http://example really means http://example/
403 func (su URL) MarshalText() ([]byte, error) {
404 return []byte(su.String()), nil
407 func (su URL) String() string {
408 return (*url.URL)(&su).String()
411 type TLSVersion uint16
413 func (v TLSVersion) MarshalText() ([]byte, error) {
417 case tls.VersionTLS10:
418 return []byte("1.0"), nil
419 case tls.VersionTLS11:
420 return []byte("1.1"), nil
421 case tls.VersionTLS12:
422 return []byte("1.2"), nil
423 case tls.VersionTLS13:
424 return []byte("1.3"), nil
426 return nil, fmt.Errorf("unsupported TLSVersion %x", v)
430 func (v *TLSVersion) UnmarshalJSON(text []byte) error {
431 if len(text) > 0 && text[0] == '"' {
433 err := json.Unmarshal(text, &s)
439 switch string(text) {
443 *v = tls.VersionTLS10
445 *v = tls.VersionTLS11
447 *v = tls.VersionTLS12
449 *v = tls.VersionTLS13
451 return fmt.Errorf("unsupported TLSVersion %q", text)
456 type ServiceInstance struct {
458 Rendezvous string `json:",omitempty"`
461 type PostgreSQL struct {
462 Connection PostgreSQLConnection
466 type PostgreSQLConnection map[string]string
468 type RemoteCluster struct {
476 type CUDAFeatures struct {
478 HardwareCapability string
482 type InstanceType struct {
483 Name string `json:"-"`
487 Scratch ByteSize `json:"-"`
488 IncludedScratch ByteSize
489 AddedScratch ByteSize
495 type ContainersConfig struct {
496 CloudVMs CloudVMsConfig
497 CrunchRunCommand string
498 CrunchRunArgumentsList []string
499 DefaultKeepCacheRAM ByteSize
500 DispatchPrivateKey string
501 LogReuseDecisions bool
502 MaxDispatchAttempts int
504 MinRetryPeriod Duration
505 ReserveExtraRAM ByteSize
506 StaleLockTimeout Duration
507 SupportedDockerImageFormats StringSet
508 AlwaysUsePreemptibleInstances bool
509 PreemptiblePriceFactor float64
511 LocalKeepBlobBuffersPerVCPU int
512 LocalKeepLogsToContainerLog string
516 GitInternalDir string
520 SweepInterval Duration
522 LogSecondsBetweenEvents Duration
523 LogThrottlePeriod Duration
526 LimitLogBytesPerJob int
527 LogPartialLineThrottlePeriod Duration
528 LogUpdatePeriod Duration
529 LogUpdateSize ByteSize
537 SbatchArgumentsList []string
538 SbatchEnvironmentVariables map[string]string
540 DNSServerConfDir string
541 DNSServerConfTemplate string
542 DNSServerReloadCommand string
543 DNSServerUpdateCommand string
544 ComputeNodeDomain string
545 ComputeNodeNameservers StringSet
546 AssignNodeHostname string
551 BsubArgumentsList []string
552 BsubCUDAArguments []string
556 type CloudVMsConfig struct {
559 BootProbeCommand string
560 DeployRunnerBinary string
562 MaxCloudOpsPerSecond int
563 MaxProbesPerSecond int
564 MaxConcurrentInstanceCreateOps int
566 SupervisorFraction float64
567 PollInterval Duration
568 ProbeInterval Duration
570 SyncInterval Duration
571 TimeoutBooting Duration
573 TimeoutProbe Duration
574 TimeoutShutdown Duration
575 TimeoutSignal Duration
576 TimeoutStaleRunLock Duration
578 ResourceTags map[string]string
582 DriverParameters json.RawMessage
585 type InstanceTypeMap map[string]InstanceType
587 var errDuplicateInstanceTypeName = errors.New("duplicate instance type name")
589 // UnmarshalJSON does special handling of InstanceTypes:
591 // - populate computed fields (Name and Scratch)
593 // - error out if InstancesTypes are populated as an array, which was
594 // deprecated in Arvados 1.2.0
595 func (it *InstanceTypeMap) UnmarshalJSON(data []byte) error {
596 fixup := func(t InstanceType) (InstanceType, error) {
597 if t.ProviderType == "" {
598 t.ProviderType = t.Name
600 // If t.Scratch is set in the configuration file, it will be ignored and overwritten.
601 // It will also generate a "deprecated or unknown config entry" warning.
602 t.Scratch = t.IncludedScratch + t.AddedScratch
606 if len(data) > 0 && data[0] == '[' {
607 return fmt.Errorf("InstanceTypes must be specified as a map, not an array, see https://doc.arvados.org/admin/config.html")
609 var hash map[string]InstanceType
610 err := json.Unmarshal(data, &hash)
614 // Fill in Name field (and ProviderType field, if not
615 // specified) using hash key.
616 *it = InstanceTypeMap(hash)
617 for name, t := range *it {
628 type StringSet map[string]struct{}
630 // UnmarshalJSON handles old config files that provide an array of
631 // instance types instead of a hash.
632 func (ss *StringSet) UnmarshalJSON(data []byte) error {
633 if len(data) > 0 && data[0] == '[' {
635 err := json.Unmarshal(data, &arr)
643 *ss = make(map[string]struct{}, len(arr))
644 for _, t := range arr {
645 (*ss)[t] = struct{}{}
649 var hash map[string]struct{}
650 err := json.Unmarshal(data, &hash)
654 *ss = make(map[string]struct{}, len(hash))
655 for t := range hash {
656 (*ss)[t] = struct{}{}
662 type ServiceName string
665 ServiceNameController ServiceName = "arvados-controller"
666 ServiceNameDispatchCloud ServiceName = "arvados-dispatch-cloud"
667 ServiceNameDispatchLSF ServiceName = "arvados-dispatch-lsf"
668 ServiceNameDispatchSLURM ServiceName = "crunch-dispatch-slurm"
669 ServiceNameGitHTTP ServiceName = "arvados-git-httpd"
670 ServiceNameHealth ServiceName = "arvados-health"
671 ServiceNameKeepbalance ServiceName = "keep-balance"
672 ServiceNameKeepproxy ServiceName = "keepproxy"
673 ServiceNameKeepstore ServiceName = "keepstore"
674 ServiceNameKeepweb ServiceName = "keep-web"
675 ServiceNameRailsAPI ServiceName = "arvados-api-server"
676 ServiceNameWebsocket ServiceName = "arvados-ws"
677 ServiceNameWorkbench1 ServiceName = "arvados-workbench1"
678 ServiceNameWorkbench2 ServiceName = "arvados-workbench2"
681 // Map returns all services as a map, suitable for iterating over all
682 // services or looking up a service by name.
683 func (svcs Services) Map() map[ServiceName]Service {
684 return map[ServiceName]Service{
685 ServiceNameController: svcs.Controller,
686 ServiceNameDispatchCloud: svcs.DispatchCloud,
687 ServiceNameDispatchLSF: svcs.DispatchLSF,
688 ServiceNameDispatchSLURM: svcs.DispatchSLURM,
689 ServiceNameGitHTTP: svcs.GitHTTP,
690 ServiceNameHealth: svcs.Health,
691 ServiceNameKeepbalance: svcs.Keepbalance,
692 ServiceNameKeepproxy: svcs.Keepproxy,
693 ServiceNameKeepstore: svcs.Keepstore,
694 ServiceNameKeepweb: svcs.WebDAV,
695 ServiceNameRailsAPI: svcs.RailsAPI,
696 ServiceNameWebsocket: svcs.Websocket,
697 ServiceNameWorkbench1: svcs.Workbench1,
698 ServiceNameWorkbench2: svcs.Workbench2,