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
182 ProviderAppSecret string
186 Users map[string]TestUser
189 RemoteTokenRefresh Duration
190 TokenLifetime Duration
191 TrustedClients map[string]struct{}
194 MailchimpAPIKey string
195 MailchimpListID string
196 SendUserSetupNotificationEmail bool
197 IssueReporterEmailFrom string
198 IssueReporterEmailTo string
199 SupportEmailAddress string
205 MaxRequestLogParamsSize int
213 AnonymousUserToken string
214 AdminNotifierEmailFrom string
215 AutoAdminFirstUser bool
216 AutoAdminUserWithEmail string
217 AutoSetupNewUsers bool
218 AutoSetupNewUsersWithRepository bool
219 AutoSetupNewUsersWithVmUUID string
220 AutoSetupUsernameBlacklist StringSet
221 EmailSubjectPrefix string
222 NewInactiveUserNotificationRecipients StringSet
223 NewUserNotificationRecipients StringSet
224 NewUsersAreActive bool
225 UserNotifierEmailFrom string
226 UserProfileNotificationAddress string
227 PreferDomainForUsername string
228 UserSetupMailText string
230 Volumes map[string]Volume
232 ActivationContactLink string
233 APIClientConnectTimeout Duration
234 APIClientReceiveTimeout Duration
235 APIResponseCompression bool
236 ApplicationMimetypesWithViewIcon StringSet
237 ArvadosDocsite string
238 ArvadosPublicDataDocURL string
239 DefaultOpenIdPrefix string
240 EnableGettingStartedPopup bool
241 EnablePublicProjectsPage bool
242 FileViewersConfigURL string
243 LogViewerMaxBytes ByteSize
244 MultiSiteSearch string
245 ProfilingEnabled bool
247 RepositoryCache string
248 RunningJobLogRecordsToFetch int
250 ShowRecentCollectionsOnDashboard bool
251 ShowUserAgreementInline bool
252 ShowUserNotifications bool
255 UserProfileFormFields map[string]struct {
257 FormFieldTitle string
258 FormFieldDescription string
261 Options map[string]struct{}
263 UserProfileFormMessage string
265 WelcomePageHTML string
266 InactivePageHTML string
267 SSHHelpPageHTML string
268 SSHHelpHostSuffix string
274 AccessViaHosts map[URL]VolumeAccess
277 StorageClasses map[string]bool
279 DriverParameters json.RawMessage
282 type S3VolumeDriverParameters struct {
285 SecretAccessKey string
289 LocationConstraint bool
291 UseAWSS3v2Driver bool
293 ConnectTimeout Duration
299 type AzureVolumeDriverParameters struct {
300 StorageAccountName string
301 StorageAccountKey string
302 StorageBaseURL string
304 RequestTimeout Duration
305 ListBlobsRetryDelay Duration
306 ListBlobsMaxAttempts int
309 type DirectoryVolumeDriverParameters struct {
314 type VolumeAccess struct {
318 type Services struct {
321 DispatchCloud Service
330 WebDAVDownload Service
338 type Service struct {
339 InternalURLs map[URL]ServiceInstance
343 type TestUser struct {
348 // URL is a url.URL that is also usable as a JSON key/value.
351 // UnmarshalText implements encoding.TextUnmarshaler so URL can be
352 // used as a JSON key/value.
353 func (su *URL) UnmarshalText(text []byte) error {
354 u, err := url.Parse(string(text))
357 if su.Path == "" && su.Host != "" {
358 // http://example really means http://example/
365 func (su URL) MarshalText() ([]byte, error) {
366 return []byte(fmt.Sprintf("%s", (*url.URL)(&su).String())), nil
369 func (su URL) String() string {
370 return (*url.URL)(&su).String()
373 type ServiceInstance struct {
374 Rendezvous string `json:",omitempty"`
377 type PostgreSQL struct {
378 Connection PostgreSQLConnection
382 type PostgreSQLConnection map[string]string
384 type RemoteCluster struct {
392 type InstanceType struct {
398 IncludedScratch ByteSize
399 AddedScratch ByteSize
404 type ContainersConfig struct {
405 CloudVMs CloudVMsConfig
406 CrunchRunCommand string
407 CrunchRunArgumentsList []string
408 DefaultKeepCacheRAM ByteSize
409 DispatchPrivateKey string
410 LogReuseDecisions bool
412 MaxDispatchAttempts int
414 MinRetryPeriod Duration
415 ReserveExtraRAM ByteSize
416 StaleLockTimeout Duration
417 SupportedDockerImageFormats StringSet
418 UsePreemptibleInstances bool
422 GitInternalDir string
427 LogSecondsBetweenEvents Duration
428 LogThrottlePeriod Duration
431 LimitLogBytesPerJob int
432 LogPartialLineThrottlePeriod Duration
433 LogUpdatePeriod Duration
434 LogUpdateSize ByteSize
442 SbatchArgumentsList []string
443 SbatchEnvironmentVariables map[string]string
445 DNSServerConfDir string
446 DNSServerConfTemplate string
447 DNSServerReloadCommand string
448 DNSServerUpdateCommand string
449 ComputeNodeDomain string
450 ComputeNodeNameservers StringSet
451 AssignNodeHostname string
456 type CloudVMsConfig struct {
459 BootProbeCommand string
460 DeployRunnerBinary string
462 MaxCloudOpsPerSecond int
463 MaxProbesPerSecond int
464 MaxConcurrentInstanceCreateOps int
465 PollInterval Duration
466 ProbeInterval Duration
468 SyncInterval Duration
469 TimeoutBooting Duration
471 TimeoutProbe Duration
472 TimeoutShutdown Duration
473 TimeoutSignal Duration
474 TimeoutStaleRunLock Duration
476 ResourceTags map[string]string
480 DriverParameters json.RawMessage
483 type InstanceTypeMap map[string]InstanceType
485 var errDuplicateInstanceTypeName = errors.New("duplicate instance type name")
487 // UnmarshalJSON handles old config files that provide an array of
488 // instance types instead of a hash.
489 func (it *InstanceTypeMap) UnmarshalJSON(data []byte) error {
490 fixup := func(t InstanceType) (InstanceType, error) {
491 if t.ProviderType == "" {
492 t.ProviderType = t.Name
495 t.Scratch = t.IncludedScratch + t.AddedScratch
496 } else if t.AddedScratch == 0 {
497 t.AddedScratch = t.Scratch - t.IncludedScratch
498 } else if t.IncludedScratch == 0 {
499 t.IncludedScratch = t.Scratch - t.AddedScratch
502 if t.Scratch != (t.IncludedScratch + t.AddedScratch) {
503 return t, fmt.Errorf("InstanceType %q: Scratch != (IncludedScratch + AddedScratch)", t.Name)
508 if len(data) > 0 && data[0] == '[' {
509 var arr []InstanceType
510 err := json.Unmarshal(data, &arr)
518 *it = make(map[string]InstanceType, len(arr))
519 for _, t := range arr {
520 if _, ok := (*it)[t.Name]; ok {
521 return errDuplicateInstanceTypeName
531 var hash map[string]InstanceType
532 err := json.Unmarshal(data, &hash)
536 // Fill in Name field (and ProviderType field, if not
537 // specified) using hash key.
538 *it = InstanceTypeMap(hash)
539 for name, t := range *it {
550 type StringSet map[string]struct{}
552 // UnmarshalJSON handles old config files that provide an array of
553 // instance types instead of a hash.
554 func (ss *StringSet) UnmarshalJSON(data []byte) error {
555 if len(data) > 0 && data[0] == '[' {
557 err := json.Unmarshal(data, &arr)
565 *ss = make(map[string]struct{}, len(arr))
566 for _, t := range arr {
567 (*ss)[t] = struct{}{}
571 var hash map[string]struct{}
572 err := json.Unmarshal(data, &hash)
576 *ss = make(map[string]struct{}, len(hash))
577 for t := range hash {
578 (*ss)[t] = struct{}{}
584 type ServiceName string
587 ServiceNameRailsAPI ServiceName = "arvados-api-server"
588 ServiceNameController ServiceName = "arvados-controller"
589 ServiceNameDispatchCloud ServiceName = "arvados-dispatch-cloud"
590 ServiceNameHealth ServiceName = "arvados-health"
591 ServiceNameWorkbench1 ServiceName = "arvados-workbench1"
592 ServiceNameWorkbench2 ServiceName = "arvados-workbench2"
593 ServiceNameWebsocket ServiceName = "arvados-ws"
594 ServiceNameKeepbalance ServiceName = "keep-balance"
595 ServiceNameKeepweb ServiceName = "keep-web"
596 ServiceNameKeepproxy ServiceName = "keepproxy"
597 ServiceNameKeepstore ServiceName = "keepstore"
600 // Map returns all services as a map, suitable for iterating over all
601 // services or looking up a service by name.
602 func (svcs Services) Map() map[ServiceName]Service {
603 return map[ServiceName]Service{
604 ServiceNameRailsAPI: svcs.RailsAPI,
605 ServiceNameController: svcs.Controller,
606 ServiceNameDispatchCloud: svcs.DispatchCloud,
607 ServiceNameHealth: svcs.Health,
608 ServiceNameWorkbench1: svcs.Workbench1,
609 ServiceNameWorkbench2: svcs.Workbench2,
610 ServiceNameWebsocket: svcs.Websocket,
611 ServiceNameKeepbalance: svcs.Keepbalance,
612 ServiceNameKeepweb: svcs.WebDAV,
613 ServiceNameKeepproxy: svcs.Keepproxy,
614 ServiceNameKeepstore: svcs.Keepstore,