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
142 WebDAVCache WebDAVCacheConfig
144 KeepproxyPermission UploadDownloadRolePermissions
145 WebDAVPermission UploadDownloadRolePermissions
161 SearchAttribute string
162 SearchBindUser string
163 SearchBindPassword string
166 EmailAttribute string
167 UsernameAttribute string
173 AlternateEmailAddresses bool
174 AuthenticationRequestParameters map[string]string
176 OpenIDConnect struct {
182 EmailVerifiedClaim string
184 AcceptAccessToken bool
185 AcceptAccessTokenScope string
186 AuthenticationRequestParameters map[string]string
191 DefaultEmailDomain string
195 Users map[string]TestUser
198 RemoteTokenRefresh Duration
199 TokenLifetime Duration
200 TrustedClients map[string]struct{}
201 IssueTrustedTokens bool
204 MailchimpAPIKey string
205 MailchimpListID string
206 SendUserSetupNotificationEmail bool
207 IssueReporterEmailFrom string
208 IssueReporterEmailTo string
209 SupportEmailAddress string
215 MaxRequestLogParamsSize int
223 AnonymousUserToken string
224 AdminNotifierEmailFrom string
225 AutoAdminFirstUser bool
226 AutoAdminUserWithEmail string
227 AutoSetupNewUsers bool
228 AutoSetupNewUsersWithRepository bool
229 AutoSetupNewUsersWithVmUUID string
230 AutoSetupUsernameBlacklist StringSet
231 EmailSubjectPrefix string
232 NewInactiveUserNotificationRecipients StringSet
233 NewUserNotificationRecipients StringSet
234 NewUsersAreActive bool
235 UserNotifierEmailFrom string
236 UserProfileNotificationAddress string
237 PreferDomainForUsername string
238 UserSetupMailText string
240 Volumes map[string]Volume
242 ActivationContactLink string
243 APIClientConnectTimeout Duration
244 APIClientReceiveTimeout Duration
245 APIResponseCompression bool
246 ApplicationMimetypesWithViewIcon StringSet
247 ArvadosDocsite string
248 ArvadosPublicDataDocURL string
249 DefaultOpenIdPrefix string
250 EnableGettingStartedPopup bool
251 EnablePublicProjectsPage bool
252 FileViewersConfigURL string
253 LogViewerMaxBytes ByteSize
254 MultiSiteSearch string
255 ProfilingEnabled bool
257 RepositoryCache string
258 RunningJobLogRecordsToFetch int
260 ShowRecentCollectionsOnDashboard bool
261 ShowUserAgreementInline bool
262 ShowUserNotifications bool
265 UserProfileFormFields map[string]struct {
267 FormFieldTitle string
268 FormFieldDescription string
271 Options map[string]struct{}
273 UserProfileFormMessage string
275 WelcomePageHTML string
276 InactivePageHTML string
277 SSHHelpPageHTML string
278 SSHHelpHostSuffix string
284 AccessViaHosts map[URL]VolumeAccess
287 StorageClasses map[string]bool
289 DriverParameters json.RawMessage
292 type S3VolumeDriverParameters struct {
295 SecretAccessKey string
299 LocationConstraint bool
301 UseAWSS3v2Driver bool
303 ConnectTimeout Duration
309 type AzureVolumeDriverParameters struct {
310 StorageAccountName string
311 StorageAccountKey string
312 StorageBaseURL string
314 RequestTimeout Duration
315 ListBlobsRetryDelay Duration
316 ListBlobsMaxAttempts int
319 type DirectoryVolumeDriverParameters struct {
324 type VolumeAccess struct {
328 type Services struct {
331 DispatchCloud Service
340 WebDAVDownload Service
348 type Service struct {
349 InternalURLs map[URL]ServiceInstance
353 type TestUser struct {
358 // URL is a url.URL that is also usable as a JSON key/value.
361 // UnmarshalText implements encoding.TextUnmarshaler so URL can be
362 // used as a JSON key/value.
363 func (su *URL) UnmarshalText(text []byte) error {
364 u, err := url.Parse(string(text))
367 if su.Path == "" && su.Host != "" {
368 // http://example really means http://example/
375 func (su URL) MarshalText() ([]byte, error) {
376 return []byte(fmt.Sprintf("%s", (*url.URL)(&su).String())), nil
379 func (su URL) String() string {
380 return (*url.URL)(&su).String()
383 type ServiceInstance struct {
384 Rendezvous string `json:",omitempty"`
387 type PostgreSQL struct {
388 Connection PostgreSQLConnection
392 type PostgreSQLConnection map[string]string
394 type RemoteCluster struct {
402 type InstanceType struct {
408 IncludedScratch ByteSize
409 AddedScratch ByteSize
414 type ContainersConfig struct {
415 CloudVMs CloudVMsConfig
416 CrunchRunCommand string
417 CrunchRunArgumentsList []string
418 DefaultKeepCacheRAM ByteSize
419 DispatchPrivateKey string
420 LogReuseDecisions bool
422 MaxDispatchAttempts int
424 MinRetryPeriod Duration
425 ReserveExtraRAM ByteSize
426 StaleLockTimeout Duration
427 SupportedDockerImageFormats StringSet
428 UsePreemptibleInstances bool
433 GitInternalDir string
438 LogSecondsBetweenEvents Duration
439 LogThrottlePeriod Duration
442 LimitLogBytesPerJob int
443 LogPartialLineThrottlePeriod Duration
444 LogUpdatePeriod Duration
445 LogUpdateSize ByteSize
453 SbatchArgumentsList []string
454 SbatchEnvironmentVariables map[string]string
456 DNSServerConfDir string
457 DNSServerConfTemplate string
458 DNSServerReloadCommand string
459 DNSServerUpdateCommand string
460 ComputeNodeDomain string
461 ComputeNodeNameservers StringSet
462 AssignNodeHostname string
467 BsubArgumentsList []string
471 type CloudVMsConfig struct {
474 BootProbeCommand string
475 DeployRunnerBinary string
477 MaxCloudOpsPerSecond int
478 MaxProbesPerSecond int
479 MaxConcurrentInstanceCreateOps int
480 PollInterval Duration
481 ProbeInterval Duration
483 SyncInterval Duration
484 TimeoutBooting Duration
486 TimeoutProbe Duration
487 TimeoutShutdown Duration
488 TimeoutSignal Duration
489 TimeoutStaleRunLock Duration
491 ResourceTags map[string]string
495 DriverParameters json.RawMessage
498 type InstanceTypeMap map[string]InstanceType
500 var errDuplicateInstanceTypeName = errors.New("duplicate instance type name")
502 // UnmarshalJSON handles old config files that provide an array of
503 // instance types instead of a hash.
504 func (it *InstanceTypeMap) UnmarshalJSON(data []byte) error {
505 fixup := func(t InstanceType) (InstanceType, error) {
506 if t.ProviderType == "" {
507 t.ProviderType = t.Name
510 t.Scratch = t.IncludedScratch + t.AddedScratch
511 } else if t.AddedScratch == 0 {
512 t.AddedScratch = t.Scratch - t.IncludedScratch
513 } else if t.IncludedScratch == 0 {
514 t.IncludedScratch = t.Scratch - t.AddedScratch
517 if t.Scratch != (t.IncludedScratch + t.AddedScratch) {
518 return t, fmt.Errorf("InstanceType %q: Scratch != (IncludedScratch + AddedScratch)", t.Name)
523 if len(data) > 0 && data[0] == '[' {
524 var arr []InstanceType
525 err := json.Unmarshal(data, &arr)
533 *it = make(map[string]InstanceType, len(arr))
534 for _, t := range arr {
535 if _, ok := (*it)[t.Name]; ok {
536 return errDuplicateInstanceTypeName
546 var hash map[string]InstanceType
547 err := json.Unmarshal(data, &hash)
551 // Fill in Name field (and ProviderType field, if not
552 // specified) using hash key.
553 *it = InstanceTypeMap(hash)
554 for name, t := range *it {
565 type StringSet map[string]struct{}
567 // UnmarshalJSON handles old config files that provide an array of
568 // instance types instead of a hash.
569 func (ss *StringSet) UnmarshalJSON(data []byte) error {
570 if len(data) > 0 && data[0] == '[' {
572 err := json.Unmarshal(data, &arr)
580 *ss = make(map[string]struct{}, len(arr))
581 for _, t := range arr {
582 (*ss)[t] = struct{}{}
586 var hash map[string]struct{}
587 err := json.Unmarshal(data, &hash)
591 *ss = make(map[string]struct{}, len(hash))
592 for t := range hash {
593 (*ss)[t] = struct{}{}
599 type ServiceName string
602 ServiceNameRailsAPI ServiceName = "arvados-api-server"
603 ServiceNameController ServiceName = "arvados-controller"
604 ServiceNameDispatchCloud ServiceName = "arvados-dispatch-cloud"
605 ServiceNameDispatchLSF ServiceName = "arvados-dispatch-lsf"
606 ServiceNameHealth ServiceName = "arvados-health"
607 ServiceNameWorkbench1 ServiceName = "arvados-workbench1"
608 ServiceNameWorkbench2 ServiceName = "arvados-workbench2"
609 ServiceNameWebsocket ServiceName = "arvados-ws"
610 ServiceNameKeepbalance ServiceName = "keep-balance"
611 ServiceNameKeepweb ServiceName = "keep-web"
612 ServiceNameKeepproxy ServiceName = "keepproxy"
613 ServiceNameKeepstore ServiceName = "keepstore"
616 // Map returns all services as a map, suitable for iterating over all
617 // services or looking up a service by name.
618 func (svcs Services) Map() map[ServiceName]Service {
619 return map[ServiceName]Service{
620 ServiceNameRailsAPI: svcs.RailsAPI,
621 ServiceNameController: svcs.Controller,
622 ServiceNameDispatchCloud: svcs.DispatchCloud,
623 ServiceNameDispatchLSF: svcs.DispatchLSF,
624 ServiceNameHealth: svcs.Health,
625 ServiceNameWorkbench1: svcs.Workbench1,
626 ServiceNameWorkbench2: svcs.Workbench2,
627 ServiceNameWebsocket: svcs.Websocket,
628 ServiceNameKeepbalance: svcs.Keepbalance,
629 ServiceNameKeepweb: svcs.WebDAV,
630 ServiceNameKeepproxy: svcs.Keepproxy,
631 ServiceNameKeepstore: svcs.Keepstore,