1 // Copyright (C) The Arvados Authors. All rights reserved.
3 // SPDX-License-Identifier: Apache-2.0
14 "git.arvados.org/arvados.git/sdk/go/config"
17 var DefaultConfigFile = func() string {
18 if path := os.Getenv("ARVADOS_CONFIG"); path != "" {
21 return "/etc/arvados/config.yml"
25 Clusters map[string]Cluster
29 // GetConfig returns the current system config, loading it from
30 // configFile if needed.
31 func GetConfig(configFile string) (*Config, error) {
33 err := config.LoadFile(&cfg, configFile)
37 // GetCluster returns the cluster ID and config for the given
38 // cluster, or the default/only configured cluster if clusterID is "".
39 func (sc *Config) GetCluster(clusterID string) (*Cluster, error) {
41 if len(sc.Clusters) == 0 {
42 return nil, fmt.Errorf("no clusters configured")
43 } else if len(sc.Clusters) > 1 {
44 return nil, fmt.Errorf("multiple clusters configured, cannot choose")
46 for id, cc := range sc.Clusters {
52 cc, ok := sc.Clusters[clusterID]
54 return nil, fmt.Errorf("cluster %q is not configured", clusterID)
56 cc.ClusterID = clusterID
60 type WebDAVCacheConfig struct {
64 MaxCollectionEntries int
65 MaxCollectionBytes int64
66 MaxPermissionEntries int
71 type UploadDownloadPermission struct {
76 type UploadDownloadRolePermissions struct {
77 User UploadDownloadPermission
78 Admin UploadDownloadPermission
82 ClusterID string `json:"-"`
83 ManagementToken string
84 SystemRootToken string
86 InstanceTypes InstanceTypeMap
87 Containers ContainersConfig
88 RemoteClusters map[string]RemoteCluster
92 AsyncPermissionsUpdateInterval Duration
93 DisabledAPIs StringSet
94 MaxIndexDatabaseRead int
95 MaxItemsPerResponse int
96 MaxConcurrentRequests int
97 MaxKeepBlobBuffers int
98 MaxRequestAmplification int
100 MaxTokenLifetime Duration
101 RequestTimeout Duration
103 WebsocketClientEventQueue int
104 WebsocketServerEventQueue int
105 KeepServiceRequestTimeout Duration
110 UnloggedAttributes StringSet
114 BlobSigningKey string
115 BlobSigningTTL Duration
117 BlobTrashLifetime Duration
118 BlobTrashCheckInterval Duration
119 BlobTrashConcurrency int
120 BlobDeleteConcurrency int
121 BlobReplicateConcurrency int
122 CollectionVersioning bool
123 DefaultTrashLifetime Duration
124 DefaultReplication int
125 ManagedProperties map[string]struct {
130 PreserveVersionIfIdle Duration
131 TrashSweepInterval Duration
133 ForwardSlashNameSubstitution string
136 BlobMissingReport string
137 BalancePeriod Duration
138 BalanceCollectionBatch int
139 BalanceCollectionBuffers int
140 BalanceTimeout Duration
141 BalanceUpdateLimit int
143 WebDAVCache WebDAVCacheConfig
145 KeepproxyPermission UploadDownloadRolePermissions
146 WebDAVPermission UploadDownloadRolePermissions
162 SearchAttribute string
163 SearchBindUser string
164 SearchBindPassword string
167 EmailAttribute string
168 UsernameAttribute string
174 AlternateEmailAddresses bool
175 AuthenticationRequestParameters map[string]string
177 OpenIDConnect struct {
183 EmailVerifiedClaim string
185 AcceptAccessToken bool
186 AcceptAccessTokenScope string
187 AuthenticationRequestParameters map[string]string
192 DefaultEmailDomain string
196 Users map[string]TestUser
199 RemoteTokenRefresh Duration
200 TokenLifetime Duration
201 TrustedClients map[string]struct{}
202 IssueTrustedTokens bool
205 MailchimpAPIKey string
206 MailchimpListID string
207 SendUserSetupNotificationEmail bool
208 IssueReporterEmailFrom string
209 IssueReporterEmailTo string
210 SupportEmailAddress string
216 MaxRequestLogParamsSize int
224 AnonymousUserToken string
225 AdminNotifierEmailFrom string
226 AutoAdminFirstUser bool
227 AutoAdminUserWithEmail string
228 AutoSetupNewUsers bool
229 AutoSetupNewUsersWithRepository bool
230 AutoSetupNewUsersWithVmUUID string
231 AutoSetupUsernameBlacklist StringSet
232 EmailSubjectPrefix string
233 NewInactiveUserNotificationRecipients StringSet
234 NewUserNotificationRecipients StringSet
235 NewUsersAreActive bool
236 UserNotifierEmailFrom string
237 UserProfileNotificationAddress string
238 PreferDomainForUsername string
239 UserSetupMailText string
241 StorageClasses map[string]StorageClassConfig
242 Volumes map[string]Volume
244 ActivationContactLink string
245 APIClientConnectTimeout Duration
246 APIClientReceiveTimeout Duration
247 APIResponseCompression bool
248 ApplicationMimetypesWithViewIcon StringSet
249 ArvadosDocsite string
250 ArvadosPublicDataDocURL string
251 DefaultOpenIdPrefix string
252 EnableGettingStartedPopup bool
253 EnablePublicProjectsPage bool
254 FileViewersConfigURL string
255 LogViewerMaxBytes ByteSize
256 MultiSiteSearch string
257 ProfilingEnabled bool
259 RepositoryCache string
260 RunningJobLogRecordsToFetch int
262 ShowRecentCollectionsOnDashboard bool
263 ShowUserAgreementInline bool
264 ShowUserNotifications bool
267 UserProfileFormFields map[string]struct {
269 FormFieldTitle string
270 FormFieldDescription string
273 Options map[string]struct{}
275 UserProfileFormMessage string
277 WelcomePageHTML string
278 InactivePageHTML string
279 SSHHelpPageHTML string
280 SSHHelpHostSuffix string
285 type StorageClassConfig struct {
291 AccessViaHosts map[URL]VolumeAccess
294 StorageClasses map[string]bool
296 DriverParameters json.RawMessage
299 type S3VolumeDriverParameters struct {
302 SecretAccessKey string
306 LocationConstraint bool
308 UseAWSS3v2Driver bool
310 ConnectTimeout Duration
316 type AzureVolumeDriverParameters struct {
317 StorageAccountName string
318 StorageAccountKey string
319 StorageBaseURL string
321 RequestTimeout Duration
322 ListBlobsRetryDelay Duration
323 ListBlobsMaxAttempts int
326 type DirectoryVolumeDriverParameters struct {
331 type VolumeAccess struct {
335 type Services struct {
338 DispatchCloud Service
347 WebDAVDownload Service
355 type Service struct {
356 InternalURLs map[URL]ServiceInstance
360 type TestUser struct {
365 // URL is a url.URL that is also usable as a JSON key/value.
368 // UnmarshalText implements encoding.TextUnmarshaler so URL can be
369 // used as a JSON key/value.
370 func (su *URL) UnmarshalText(text []byte) error {
371 u, err := url.Parse(string(text))
374 if su.Path == "" && su.Host != "" {
375 // http://example really means http://example/
382 func (su URL) MarshalText() ([]byte, error) {
383 return []byte(fmt.Sprintf("%s", (*url.URL)(&su).String())), nil
386 func (su URL) String() string {
387 return (*url.URL)(&su).String()
390 type ServiceInstance struct {
391 Rendezvous string `json:",omitempty"`
394 type PostgreSQL struct {
395 Connection PostgreSQLConnection
399 type PostgreSQLConnection map[string]string
401 type RemoteCluster struct {
409 type InstanceType struct {
415 IncludedScratch ByteSize
416 AddedScratch ByteSize
421 type ContainersConfig struct {
422 CloudVMs CloudVMsConfig
423 CrunchRunCommand string
424 CrunchRunArgumentsList []string
425 DefaultKeepCacheRAM ByteSize
426 DispatchPrivateKey string
427 LogReuseDecisions bool
429 MaxDispatchAttempts int
431 MinRetryPeriod Duration
432 ReserveExtraRAM ByteSize
433 StaleLockTimeout Duration
434 SupportedDockerImageFormats StringSet
435 UsePreemptibleInstances bool
440 GitInternalDir string
445 LogSecondsBetweenEvents Duration
446 LogThrottlePeriod Duration
449 LimitLogBytesPerJob int
450 LogPartialLineThrottlePeriod Duration
451 LogUpdatePeriod Duration
452 LogUpdateSize ByteSize
460 SbatchArgumentsList []string
461 SbatchEnvironmentVariables map[string]string
463 DNSServerConfDir string
464 DNSServerConfTemplate string
465 DNSServerReloadCommand string
466 DNSServerUpdateCommand string
467 ComputeNodeDomain string
468 ComputeNodeNameservers StringSet
469 AssignNodeHostname string
474 BsubArgumentsList []string
478 type CloudVMsConfig struct {
481 BootProbeCommand string
482 DeployRunnerBinary string
484 MaxCloudOpsPerSecond int
485 MaxProbesPerSecond int
486 MaxConcurrentInstanceCreateOps int
487 PollInterval Duration
488 ProbeInterval Duration
490 SyncInterval Duration
491 TimeoutBooting Duration
493 TimeoutProbe Duration
494 TimeoutShutdown Duration
495 TimeoutSignal Duration
496 TimeoutStaleRunLock Duration
498 ResourceTags map[string]string
502 DriverParameters json.RawMessage
505 type InstanceTypeMap map[string]InstanceType
507 var errDuplicateInstanceTypeName = errors.New("duplicate instance type name")
509 // UnmarshalJSON handles old config files that provide an array of
510 // instance types instead of a hash.
511 func (it *InstanceTypeMap) UnmarshalJSON(data []byte) error {
512 fixup := func(t InstanceType) (InstanceType, error) {
513 if t.ProviderType == "" {
514 t.ProviderType = t.Name
517 t.Scratch = t.IncludedScratch + t.AddedScratch
518 } else if t.AddedScratch == 0 {
519 t.AddedScratch = t.Scratch - t.IncludedScratch
520 } else if t.IncludedScratch == 0 {
521 t.IncludedScratch = t.Scratch - t.AddedScratch
524 if t.Scratch != (t.IncludedScratch + t.AddedScratch) {
525 return t, fmt.Errorf("InstanceType %q: Scratch != (IncludedScratch + AddedScratch)", t.Name)
530 if len(data) > 0 && data[0] == '[' {
531 var arr []InstanceType
532 err := json.Unmarshal(data, &arr)
540 *it = make(map[string]InstanceType, len(arr))
541 for _, t := range arr {
542 if _, ok := (*it)[t.Name]; ok {
543 return errDuplicateInstanceTypeName
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 ServiceNameRailsAPI ServiceName = "arvados-api-server"
610 ServiceNameController ServiceName = "arvados-controller"
611 ServiceNameDispatchCloud ServiceName = "arvados-dispatch-cloud"
612 ServiceNameDispatchLSF ServiceName = "arvados-dispatch-lsf"
613 ServiceNameHealth ServiceName = "arvados-health"
614 ServiceNameWorkbench1 ServiceName = "arvados-workbench1"
615 ServiceNameWorkbench2 ServiceName = "arvados-workbench2"
616 ServiceNameWebsocket ServiceName = "arvados-ws"
617 ServiceNameKeepbalance ServiceName = "keep-balance"
618 ServiceNameKeepweb ServiceName = "keep-web"
619 ServiceNameKeepproxy ServiceName = "keepproxy"
620 ServiceNameKeepstore ServiceName = "keepstore"
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 ServiceNameRailsAPI: svcs.RailsAPI,
628 ServiceNameController: svcs.Controller,
629 ServiceNameDispatchCloud: svcs.DispatchCloud,
630 ServiceNameDispatchLSF: svcs.DispatchLSF,
631 ServiceNameHealth: svcs.Health,
632 ServiceNameWorkbench1: svcs.Workbench1,
633 ServiceNameWorkbench2: svcs.Workbench2,
634 ServiceNameWebsocket: svcs.Websocket,
635 ServiceNameKeepbalance: svcs.Keepbalance,
636 ServiceNameKeepweb: svcs.WebDAV,
637 ServiceNameKeepproxy: svcs.Keepproxy,
638 ServiceNameKeepstore: svcs.Keepstore,