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 {
283 SecretAccessKey string
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
421 GitInternalDir string
426 LogSecondsBetweenEvents Duration
427 LogThrottlePeriod Duration
430 LimitLogBytesPerJob int
431 LogPartialLineThrottlePeriod Duration
432 LogUpdatePeriod Duration
433 LogUpdateSize ByteSize
441 SbatchArgumentsList []string
442 SbatchEnvironmentVariables map[string]string
444 DNSServerConfDir string
445 DNSServerConfTemplate string
446 DNSServerReloadCommand string
447 DNSServerUpdateCommand string
448 ComputeNodeDomain string
449 ComputeNodeNameservers StringSet
450 AssignNodeHostname string
455 type CloudVMsConfig struct {
458 BootProbeCommand string
459 DeployRunnerBinary string
461 MaxCloudOpsPerSecond int
462 MaxProbesPerSecond int
463 MaxConcurrentInstanceCreateOps int
464 PollInterval Duration
465 ProbeInterval Duration
467 SyncInterval Duration
468 TimeoutBooting Duration
470 TimeoutProbe Duration
471 TimeoutShutdown Duration
472 TimeoutSignal Duration
473 TimeoutStaleRunLock Duration
475 ResourceTags map[string]string
479 DriverParameters json.RawMessage
482 type InstanceTypeMap map[string]InstanceType
484 var errDuplicateInstanceTypeName = errors.New("duplicate instance type name")
486 // UnmarshalJSON handles old config files that provide an array of
487 // instance types instead of a hash.
488 func (it *InstanceTypeMap) UnmarshalJSON(data []byte) error {
489 fixup := func(t InstanceType) (InstanceType, error) {
490 if t.ProviderType == "" {
491 t.ProviderType = t.Name
494 t.Scratch = t.IncludedScratch + t.AddedScratch
495 } else if t.AddedScratch == 0 {
496 t.AddedScratch = t.Scratch - t.IncludedScratch
497 } else if t.IncludedScratch == 0 {
498 t.IncludedScratch = t.Scratch - t.AddedScratch
501 if t.Scratch != (t.IncludedScratch + t.AddedScratch) {
502 return t, fmt.Errorf("InstanceType %q: Scratch != (IncludedScratch + AddedScratch)", t.Name)
507 if len(data) > 0 && data[0] == '[' {
508 var arr []InstanceType
509 err := json.Unmarshal(data, &arr)
517 *it = make(map[string]InstanceType, len(arr))
518 for _, t := range arr {
519 if _, ok := (*it)[t.Name]; ok {
520 return errDuplicateInstanceTypeName
530 var hash map[string]InstanceType
531 err := json.Unmarshal(data, &hash)
535 // Fill in Name field (and ProviderType field, if not
536 // specified) using hash key.
537 *it = InstanceTypeMap(hash)
538 for name, t := range *it {
549 type StringSet map[string]struct{}
551 // UnmarshalJSON handles old config files that provide an array of
552 // instance types instead of a hash.
553 func (ss *StringSet) UnmarshalJSON(data []byte) error {
554 if len(data) > 0 && data[0] == '[' {
556 err := json.Unmarshal(data, &arr)
564 *ss = make(map[string]struct{}, len(arr))
565 for _, t := range arr {
566 (*ss)[t] = struct{}{}
570 var hash map[string]struct{}
571 err := json.Unmarshal(data, &hash)
575 *ss = make(map[string]struct{}, len(hash))
576 for t := range hash {
577 (*ss)[t] = struct{}{}
583 type ServiceName string
586 ServiceNameRailsAPI ServiceName = "arvados-api-server"
587 ServiceNameController ServiceName = "arvados-controller"
588 ServiceNameDispatchCloud ServiceName = "arvados-dispatch-cloud"
589 ServiceNameHealth ServiceName = "arvados-health"
590 ServiceNameWorkbench1 ServiceName = "arvados-workbench1"
591 ServiceNameWorkbench2 ServiceName = "arvados-workbench2"
592 ServiceNameWebsocket ServiceName = "arvados-ws"
593 ServiceNameKeepbalance ServiceName = "keep-balance"
594 ServiceNameKeepweb ServiceName = "keep-web"
595 ServiceNameKeepproxy ServiceName = "keepproxy"
596 ServiceNameKeepstore ServiceName = "keepstore"
599 // Map returns all services as a map, suitable for iterating over all
600 // services or looking up a service by name.
601 func (svcs Services) Map() map[ServiceName]Service {
602 return map[ServiceName]Service{
603 ServiceNameRailsAPI: svcs.RailsAPI,
604 ServiceNameController: svcs.Controller,
605 ServiceNameDispatchCloud: svcs.DispatchCloud,
606 ServiceNameHealth: svcs.Health,
607 ServiceNameWorkbench1: svcs.Workbench1,
608 ServiceNameWorkbench2: svcs.Workbench2,
609 ServiceNameWebsocket: svcs.Websocket,
610 ServiceNameKeepbalance: svcs.Keepbalance,
611 ServiceNameKeepweb: svcs.WebDAV,
612 ServiceNameKeepproxy: svcs.Keepproxy,
613 ServiceNameKeepstore: svcs.Keepstore,