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 AuthenticationRequestParameters map[string]string
175 DefaultEmailDomain string
180 ProviderAppSecret string
184 Users map[string]TestUser
187 RemoteTokenRefresh Duration
188 TokenLifetime Duration
189 TrustedClients map[string]struct{}
192 MailchimpAPIKey string
193 MailchimpListID string
194 SendUserSetupNotificationEmail bool
195 IssueReporterEmailFrom string
196 IssueReporterEmailTo string
197 SupportEmailAddress string
203 MaxRequestLogParamsSize int
211 AnonymousUserToken string
212 AdminNotifierEmailFrom string
213 AutoAdminFirstUser bool
214 AutoAdminUserWithEmail string
215 AutoSetupNewUsers bool
216 AutoSetupNewUsersWithRepository bool
217 AutoSetupNewUsersWithVmUUID string
218 AutoSetupUsernameBlacklist StringSet
219 EmailSubjectPrefix string
220 NewInactiveUserNotificationRecipients StringSet
221 NewUserNotificationRecipients StringSet
222 NewUsersAreActive bool
223 UserNotifierEmailFrom string
224 UserProfileNotificationAddress string
225 PreferDomainForUsername string
226 UserSetupMailText string
228 Volumes map[string]Volume
230 ActivationContactLink string
231 APIClientConnectTimeout Duration
232 APIClientReceiveTimeout Duration
233 APIResponseCompression bool
234 ApplicationMimetypesWithViewIcon StringSet
235 ArvadosDocsite string
236 ArvadosPublicDataDocURL string
237 DefaultOpenIdPrefix string
238 EnableGettingStartedPopup bool
239 EnablePublicProjectsPage bool
240 FileViewersConfigURL string
241 LogViewerMaxBytes ByteSize
242 MultiSiteSearch string
243 ProfilingEnabled bool
245 RepositoryCache string
246 RunningJobLogRecordsToFetch int
248 ShowRecentCollectionsOnDashboard bool
249 ShowUserAgreementInline bool
250 ShowUserNotifications bool
253 UserProfileFormFields map[string]struct {
255 FormFieldTitle string
256 FormFieldDescription string
259 Options map[string]struct{}
261 UserProfileFormMessage string
263 WelcomePageHTML string
264 InactivePageHTML string
265 SSHHelpPageHTML string
266 SSHHelpHostSuffix string
272 AccessViaHosts map[URL]VolumeAccess
275 StorageClasses map[string]bool
277 DriverParameters json.RawMessage
280 type S3VolumeDriverParameters struct {
287 LocationConstraint bool
289 UseAWSS3v2Driver bool
291 ConnectTimeout Duration
297 type AzureVolumeDriverParameters struct {
298 StorageAccountName string
299 StorageAccountKey string
300 StorageBaseURL string
302 RequestTimeout Duration
303 ListBlobsRetryDelay Duration
304 ListBlobsMaxAttempts int
307 type DirectoryVolumeDriverParameters struct {
312 type VolumeAccess struct {
316 type Services struct {
319 DispatchCloud Service
328 WebDAVDownload Service
336 type Service struct {
337 InternalURLs map[URL]ServiceInstance
341 type TestUser struct {
346 // URL is a url.URL that is also usable as a JSON key/value.
349 // UnmarshalText implements encoding.TextUnmarshaler so URL can be
350 // used as a JSON key/value.
351 func (su *URL) UnmarshalText(text []byte) error {
352 u, err := url.Parse(string(text))
355 if su.Path == "" && su.Host != "" {
356 // http://example really means http://example/
363 func (su URL) MarshalText() ([]byte, error) {
364 return []byte(fmt.Sprintf("%s", (*url.URL)(&su).String())), nil
367 func (su URL) String() string {
368 return (*url.URL)(&su).String()
371 type ServiceInstance struct {
372 Rendezvous string `json:",omitempty"`
375 type PostgreSQL struct {
376 Connection PostgreSQLConnection
380 type PostgreSQLConnection map[string]string
382 type RemoteCluster struct {
390 type InstanceType struct {
396 IncludedScratch ByteSize
397 AddedScratch ByteSize
402 type ContainersConfig struct {
403 CloudVMs CloudVMsConfig
404 CrunchRunCommand string
405 CrunchRunArgumentsList []string
406 DefaultKeepCacheRAM ByteSize
407 DispatchPrivateKey string
408 LogReuseDecisions bool
410 MaxDispatchAttempts int
412 MinRetryPeriod Duration
413 ReserveExtraRAM ByteSize
414 StaleLockTimeout Duration
415 SupportedDockerImageFormats StringSet
416 UsePreemptibleInstances bool
420 GitInternalDir string
425 LogSecondsBetweenEvents Duration
426 LogThrottlePeriod Duration
429 LimitLogBytesPerJob int
430 LogPartialLineThrottlePeriod Duration
431 LogUpdatePeriod Duration
432 LogUpdateSize ByteSize
440 SbatchArgumentsList []string
441 SbatchEnvironmentVariables map[string]string
443 DNSServerConfDir string
444 DNSServerConfTemplate string
445 DNSServerReloadCommand string
446 DNSServerUpdateCommand string
447 ComputeNodeDomain string
448 ComputeNodeNameservers StringSet
449 AssignNodeHostname string
454 type CloudVMsConfig struct {
457 BootProbeCommand string
458 DeployRunnerBinary string
460 MaxCloudOpsPerSecond int
461 MaxProbesPerSecond int
462 MaxConcurrentInstanceCreateOps int
463 PollInterval Duration
464 ProbeInterval Duration
466 SyncInterval Duration
467 TimeoutBooting Duration
469 TimeoutProbe Duration
470 TimeoutShutdown Duration
471 TimeoutSignal Duration
472 TimeoutStaleRunLock Duration
474 ResourceTags map[string]string
478 DriverParameters json.RawMessage
481 type InstanceTypeMap map[string]InstanceType
483 var errDuplicateInstanceTypeName = errors.New("duplicate instance type name")
485 // UnmarshalJSON handles old config files that provide an array of
486 // instance types instead of a hash.
487 func (it *InstanceTypeMap) UnmarshalJSON(data []byte) error {
488 fixup := func(t InstanceType) (InstanceType, error) {
489 if t.ProviderType == "" {
490 t.ProviderType = t.Name
493 t.Scratch = t.IncludedScratch + t.AddedScratch
494 } else if t.AddedScratch == 0 {
495 t.AddedScratch = t.Scratch - t.IncludedScratch
496 } else if t.IncludedScratch == 0 {
497 t.IncludedScratch = t.Scratch - t.AddedScratch
500 if t.Scratch != (t.IncludedScratch + t.AddedScratch) {
501 return t, fmt.Errorf("InstanceType %q: Scratch != (IncludedScratch + AddedScratch)", t.Name)
506 if len(data) > 0 && data[0] == '[' {
507 var arr []InstanceType
508 err := json.Unmarshal(data, &arr)
516 *it = make(map[string]InstanceType, len(arr))
517 for _, t := range arr {
518 if _, ok := (*it)[t.Name]; ok {
519 return errDuplicateInstanceTypeName
529 var hash map[string]InstanceType
530 err := json.Unmarshal(data, &hash)
534 // Fill in Name field (and ProviderType field, if not
535 // specified) using hash key.
536 *it = InstanceTypeMap(hash)
537 for name, t := range *it {
548 type StringSet map[string]struct{}
550 // UnmarshalJSON handles old config files that provide an array of
551 // instance types instead of a hash.
552 func (ss *StringSet) UnmarshalJSON(data []byte) error {
553 if len(data) > 0 && data[0] == '[' {
555 err := json.Unmarshal(data, &arr)
563 *ss = make(map[string]struct{}, len(arr))
564 for _, t := range arr {
565 (*ss)[t] = struct{}{}
569 var hash map[string]struct{}
570 err := json.Unmarshal(data, &hash)
574 *ss = make(map[string]struct{}, len(hash))
575 for t := range hash {
576 (*ss)[t] = struct{}{}
582 type ServiceName string
585 ServiceNameRailsAPI ServiceName = "arvados-api-server"
586 ServiceNameController ServiceName = "arvados-controller"
587 ServiceNameDispatchCloud ServiceName = "arvados-dispatch-cloud"
588 ServiceNameHealth ServiceName = "arvados-health"
589 ServiceNameWorkbench1 ServiceName = "arvados-workbench1"
590 ServiceNameWorkbench2 ServiceName = "arvados-workbench2"
591 ServiceNameWebsocket ServiceName = "arvados-ws"
592 ServiceNameKeepbalance ServiceName = "keep-balance"
593 ServiceNameKeepweb ServiceName = "keep-web"
594 ServiceNameKeepproxy ServiceName = "keepproxy"
595 ServiceNameKeepstore ServiceName = "keepstore"
598 // Map returns all services as a map, suitable for iterating over all
599 // services or looking up a service by name.
600 func (svcs Services) Map() map[ServiceName]Service {
601 return map[ServiceName]Service{
602 ServiceNameRailsAPI: svcs.RailsAPI,
603 ServiceNameController: svcs.Controller,
604 ServiceNameDispatchCloud: svcs.DispatchCloud,
605 ServiceNameHealth: svcs.Health,
606 ServiceNameWorkbench1: svcs.Workbench1,
607 ServiceNameWorkbench2: svcs.Workbench2,
608 ServiceNameWebsocket: svcs.Websocket,
609 ServiceNameKeepbalance: svcs.Keepbalance,
610 ServiceNameKeepweb: svcs.WebDAV,
611 ServiceNameKeepproxy: svcs.Keepproxy,
612 ServiceNameKeepstore: svcs.Keepstore,