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
72 ClusterID string `json:"-"`
73 ManagementToken string
74 SystemRootToken string
76 InstanceTypes InstanceTypeMap
77 Containers ContainersConfig
78 RemoteClusters map[string]RemoteCluster
82 AsyncPermissionsUpdateInterval Duration
83 DisabledAPIs StringSet
84 MaxIndexDatabaseRead int
85 MaxItemsPerResponse int
86 MaxConcurrentRequests int
87 MaxKeepBlobBuffers int
88 MaxRequestAmplification int
90 MaxTokenLifetime Duration
91 RequestTimeout Duration
93 WebsocketClientEventQueue int
94 WebsocketServerEventQueue int
95 KeepServiceRequestTimeout Duration
100 UnloggedAttributes StringSet
104 BlobSigningKey string
105 BlobSigningTTL Duration
107 BlobTrashLifetime Duration
108 BlobTrashCheckInterval Duration
109 BlobTrashConcurrency int
110 BlobDeleteConcurrency int
111 BlobReplicateConcurrency int
112 CollectionVersioning bool
113 DefaultTrashLifetime Duration
114 DefaultReplication int
115 ManagedProperties map[string]struct {
120 PreserveVersionIfIdle Duration
121 TrashSweepInterval Duration
123 ForwardSlashNameSubstitution string
126 BlobMissingReport string
127 BalancePeriod Duration
128 BalanceCollectionBatch int
129 BalanceCollectionBuffers int
130 BalanceTimeout Duration
132 WebDAVCache WebDAVCacheConfig
147 SearchAttribute string
148 SearchBindUser string
149 SearchBindPassword string
152 EmailAttribute string
153 UsernameAttribute string
159 AlternateEmailAddresses bool
160 AuthenticationRequestParameters map[string]string
162 OpenIDConnect struct {
168 EmailVerifiedClaim string
170 AcceptAccessToken bool
171 AcceptAccessTokenScope string
172 AuthenticationRequestParameters map[string]string
177 DefaultEmailDomain string
181 Users map[string]TestUser
184 RemoteTokenRefresh Duration
185 TokenLifetime Duration
186 TrustedClients map[string]struct{}
187 IssueTrustedTokens bool
190 MailchimpAPIKey string
191 MailchimpListID string
192 SendUserSetupNotificationEmail bool
193 IssueReporterEmailFrom string
194 IssueReporterEmailTo string
195 SupportEmailAddress string
201 MaxRequestLogParamsSize int
209 AnonymousUserToken string
210 AdminNotifierEmailFrom string
211 AutoAdminFirstUser bool
212 AutoAdminUserWithEmail string
213 AutoSetupNewUsers bool
214 AutoSetupNewUsersWithRepository bool
215 AutoSetupNewUsersWithVmUUID string
216 AutoSetupUsernameBlacklist StringSet
217 EmailSubjectPrefix string
218 NewInactiveUserNotificationRecipients StringSet
219 NewUserNotificationRecipients StringSet
220 NewUsersAreActive bool
221 UserNotifierEmailFrom string
222 UserProfileNotificationAddress string
223 PreferDomainForUsername string
224 UserSetupMailText string
226 Volumes map[string]Volume
228 ActivationContactLink string
229 APIClientConnectTimeout Duration
230 APIClientReceiveTimeout Duration
231 APIResponseCompression bool
232 ApplicationMimetypesWithViewIcon StringSet
233 ArvadosDocsite string
234 ArvadosPublicDataDocURL string
235 DefaultOpenIdPrefix string
236 EnableGettingStartedPopup bool
237 EnablePublicProjectsPage bool
238 FileViewersConfigURL string
239 LogViewerMaxBytes ByteSize
240 MultiSiteSearch string
241 ProfilingEnabled bool
243 RepositoryCache string
244 RunningJobLogRecordsToFetch int
246 ShowRecentCollectionsOnDashboard bool
247 ShowUserAgreementInline bool
248 ShowUserNotifications bool
251 UserProfileFormFields map[string]struct {
253 FormFieldTitle string
254 FormFieldDescription string
257 Options map[string]struct{}
259 UserProfileFormMessage string
261 WelcomePageHTML string
262 InactivePageHTML string
263 SSHHelpPageHTML string
264 SSHHelpHostSuffix string
270 AccessViaHosts map[URL]VolumeAccess
273 StorageClasses map[string]bool
275 DriverParameters json.RawMessage
278 type S3VolumeDriverParameters struct {
281 SecretAccessKey string
285 LocationConstraint bool
287 UseAWSS3v2Driver bool
289 ConnectTimeout Duration
295 type AzureVolumeDriverParameters struct {
296 StorageAccountName string
297 StorageAccountKey string
298 StorageBaseURL string
300 RequestTimeout Duration
301 ListBlobsRetryDelay Duration
302 ListBlobsMaxAttempts int
305 type DirectoryVolumeDriverParameters struct {
310 type VolumeAccess struct {
314 type Services struct {
317 DispatchCloud Service
326 WebDAVDownload Service
334 type Service struct {
335 InternalURLs map[URL]ServiceInstance
339 type TestUser struct {
344 // URL is a url.URL that is also usable as a JSON key/value.
347 // UnmarshalText implements encoding.TextUnmarshaler so URL can be
348 // used as a JSON key/value.
349 func (su *URL) UnmarshalText(text []byte) error {
350 u, err := url.Parse(string(text))
353 if su.Path == "" && su.Host != "" {
354 // http://example really means http://example/
361 func (su URL) MarshalText() ([]byte, error) {
362 return []byte(fmt.Sprintf("%s", (*url.URL)(&su).String())), nil
365 func (su URL) String() string {
366 return (*url.URL)(&su).String()
369 type ServiceInstance struct {
370 Rendezvous string `json:",omitempty"`
373 type PostgreSQL struct {
374 Connection PostgreSQLConnection
378 type PostgreSQLConnection map[string]string
380 type RemoteCluster struct {
388 type InstanceType struct {
394 IncludedScratch ByteSize
395 AddedScratch ByteSize
400 type ContainersConfig struct {
401 CloudVMs CloudVMsConfig
402 CrunchRunCommand string
403 CrunchRunArgumentsList []string
404 DefaultKeepCacheRAM ByteSize
405 DispatchPrivateKey string
406 LogReuseDecisions bool
408 MaxDispatchAttempts int
410 MinRetryPeriod Duration
411 ReserveExtraRAM ByteSize
412 StaleLockTimeout Duration
413 SupportedDockerImageFormats StringSet
414 UsePreemptibleInstances bool
419 GitInternalDir string
424 LogSecondsBetweenEvents Duration
425 LogThrottlePeriod Duration
428 LimitLogBytesPerJob int
429 LogPartialLineThrottlePeriod Duration
430 LogUpdatePeriod Duration
431 LogUpdateSize ByteSize
439 SbatchArgumentsList []string
440 SbatchEnvironmentVariables map[string]string
442 DNSServerConfDir string
443 DNSServerConfTemplate string
444 DNSServerReloadCommand string
445 DNSServerUpdateCommand string
446 ComputeNodeDomain string
447 ComputeNodeNameservers StringSet
448 AssignNodeHostname string
453 type CloudVMsConfig struct {
456 BootProbeCommand string
457 DeployRunnerBinary string
459 MaxCloudOpsPerSecond int
460 MaxProbesPerSecond int
461 MaxConcurrentInstanceCreateOps int
462 PollInterval Duration
463 ProbeInterval Duration
465 SyncInterval Duration
466 TimeoutBooting Duration
468 TimeoutProbe Duration
469 TimeoutShutdown Duration
470 TimeoutSignal Duration
471 TimeoutStaleRunLock Duration
473 ResourceTags map[string]string
477 DriverParameters json.RawMessage
480 type InstanceTypeMap map[string]InstanceType
482 var errDuplicateInstanceTypeName = errors.New("duplicate instance type name")
484 // UnmarshalJSON handles old config files that provide an array of
485 // instance types instead of a hash.
486 func (it *InstanceTypeMap) UnmarshalJSON(data []byte) error {
487 fixup := func(t InstanceType) (InstanceType, error) {
488 if t.ProviderType == "" {
489 t.ProviderType = t.Name
492 t.Scratch = t.IncludedScratch + t.AddedScratch
493 } else if t.AddedScratch == 0 {
494 t.AddedScratch = t.Scratch - t.IncludedScratch
495 } else if t.IncludedScratch == 0 {
496 t.IncludedScratch = t.Scratch - t.AddedScratch
499 if t.Scratch != (t.IncludedScratch + t.AddedScratch) {
500 return t, fmt.Errorf("InstanceType %q: Scratch != (IncludedScratch + AddedScratch)", t.Name)
505 if len(data) > 0 && data[0] == '[' {
506 var arr []InstanceType
507 err := json.Unmarshal(data, &arr)
515 *it = make(map[string]InstanceType, len(arr))
516 for _, t := range arr {
517 if _, ok := (*it)[t.Name]; ok {
518 return errDuplicateInstanceTypeName
528 var hash map[string]InstanceType
529 err := json.Unmarshal(data, &hash)
533 // Fill in Name field (and ProviderType field, if not
534 // specified) using hash key.
535 *it = InstanceTypeMap(hash)
536 for name, t := range *it {
547 type StringSet map[string]struct{}
549 // UnmarshalJSON handles old config files that provide an array of
550 // instance types instead of a hash.
551 func (ss *StringSet) UnmarshalJSON(data []byte) error {
552 if len(data) > 0 && data[0] == '[' {
554 err := json.Unmarshal(data, &arr)
562 *ss = make(map[string]struct{}, len(arr))
563 for _, t := range arr {
564 (*ss)[t] = struct{}{}
568 var hash map[string]struct{}
569 err := json.Unmarshal(data, &hash)
573 *ss = make(map[string]struct{}, len(hash))
574 for t := range hash {
575 (*ss)[t] = struct{}{}
581 type ServiceName string
584 ServiceNameRailsAPI ServiceName = "arvados-api-server"
585 ServiceNameController ServiceName = "arvados-controller"
586 ServiceNameDispatchCloud ServiceName = "arvados-dispatch-cloud"
587 ServiceNameHealth ServiceName = "arvados-health"
588 ServiceNameWorkbench1 ServiceName = "arvados-workbench1"
589 ServiceNameWorkbench2 ServiceName = "arvados-workbench2"
590 ServiceNameWebsocket ServiceName = "arvados-ws"
591 ServiceNameKeepbalance ServiceName = "keep-balance"
592 ServiceNameKeepweb ServiceName = "keep-web"
593 ServiceNameKeepproxy ServiceName = "keepproxy"
594 ServiceNameKeepstore ServiceName = "keepstore"
597 // Map returns all services as a map, suitable for iterating over all
598 // services or looking up a service by name.
599 func (svcs Services) Map() map[ServiceName]Service {
600 return map[ServiceName]Service{
601 ServiceNameRailsAPI: svcs.RailsAPI,
602 ServiceNameController: svcs.Controller,
603 ServiceNameDispatchCloud: svcs.DispatchCloud,
604 ServiceNameHealth: svcs.Health,
605 ServiceNameWorkbench1: svcs.Workbench1,
606 ServiceNameWorkbench2: svcs.Workbench2,
607 ServiceNameWebsocket: svcs.Websocket,
608 ServiceNameKeepbalance: svcs.Keepbalance,
609 ServiceNameKeepweb: svcs.WebDAV,
610 ServiceNameKeepproxy: svcs.Keepproxy,
611 ServiceNameKeepstore: svcs.Keepstore,