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
339 WebDAVDownload Service
347 type Service struct {
348 InternalURLs map[URL]ServiceInstance
352 type TestUser struct {
357 // URL is a url.URL that is also usable as a JSON key/value.
360 // UnmarshalText implements encoding.TextUnmarshaler so URL can be
361 // used as a JSON key/value.
362 func (su *URL) UnmarshalText(text []byte) error {
363 u, err := url.Parse(string(text))
366 if su.Path == "" && su.Host != "" {
367 // http://example really means http://example/
374 func (su URL) MarshalText() ([]byte, error) {
375 return []byte(fmt.Sprintf("%s", (*url.URL)(&su).String())), nil
378 func (su URL) String() string {
379 return (*url.URL)(&su).String()
382 type ServiceInstance struct {
383 Rendezvous string `json:",omitempty"`
386 type PostgreSQL struct {
387 Connection PostgreSQLConnection
391 type PostgreSQLConnection map[string]string
393 type RemoteCluster struct {
401 type InstanceType struct {
407 IncludedScratch ByteSize
408 AddedScratch ByteSize
413 type ContainersConfig struct {
414 CloudVMs CloudVMsConfig
415 CrunchRunCommand string
416 CrunchRunArgumentsList []string
417 DefaultKeepCacheRAM ByteSize
418 DispatchPrivateKey string
419 LogReuseDecisions bool
421 MaxDispatchAttempts int
423 MinRetryPeriod Duration
424 ReserveExtraRAM ByteSize
425 StaleLockTimeout Duration
426 SupportedDockerImageFormats StringSet
427 UsePreemptibleInstances bool
432 GitInternalDir string
437 LogSecondsBetweenEvents Duration
438 LogThrottlePeriod Duration
441 LimitLogBytesPerJob int
442 LogPartialLineThrottlePeriod Duration
443 LogUpdatePeriod Duration
444 LogUpdateSize ByteSize
452 SbatchArgumentsList []string
453 SbatchEnvironmentVariables map[string]string
455 DNSServerConfDir string
456 DNSServerConfTemplate string
457 DNSServerReloadCommand string
458 DNSServerUpdateCommand string
459 ComputeNodeDomain string
460 ComputeNodeNameservers StringSet
461 AssignNodeHostname string
466 type CloudVMsConfig struct {
469 BootProbeCommand string
470 DeployRunnerBinary string
472 MaxCloudOpsPerSecond int
473 MaxProbesPerSecond int
474 MaxConcurrentInstanceCreateOps int
475 PollInterval Duration
476 ProbeInterval Duration
478 SyncInterval Duration
479 TimeoutBooting Duration
481 TimeoutProbe Duration
482 TimeoutShutdown Duration
483 TimeoutSignal Duration
484 TimeoutStaleRunLock Duration
486 ResourceTags map[string]string
490 DriverParameters json.RawMessage
493 type InstanceTypeMap map[string]InstanceType
495 var errDuplicateInstanceTypeName = errors.New("duplicate instance type name")
497 // UnmarshalJSON handles old config files that provide an array of
498 // instance types instead of a hash.
499 func (it *InstanceTypeMap) UnmarshalJSON(data []byte) error {
500 fixup := func(t InstanceType) (InstanceType, error) {
501 if t.ProviderType == "" {
502 t.ProviderType = t.Name
505 t.Scratch = t.IncludedScratch + t.AddedScratch
506 } else if t.AddedScratch == 0 {
507 t.AddedScratch = t.Scratch - t.IncludedScratch
508 } else if t.IncludedScratch == 0 {
509 t.IncludedScratch = t.Scratch - t.AddedScratch
512 if t.Scratch != (t.IncludedScratch + t.AddedScratch) {
513 return t, fmt.Errorf("InstanceType %q: Scratch != (IncludedScratch + AddedScratch)", t.Name)
518 if len(data) > 0 && data[0] == '[' {
519 var arr []InstanceType
520 err := json.Unmarshal(data, &arr)
528 *it = make(map[string]InstanceType, len(arr))
529 for _, t := range arr {
530 if _, ok := (*it)[t.Name]; ok {
531 return errDuplicateInstanceTypeName
541 var hash map[string]InstanceType
542 err := json.Unmarshal(data, &hash)
546 // Fill in Name field (and ProviderType field, if not
547 // specified) using hash key.
548 *it = InstanceTypeMap(hash)
549 for name, t := range *it {
560 type StringSet map[string]struct{}
562 // UnmarshalJSON handles old config files that provide an array of
563 // instance types instead of a hash.
564 func (ss *StringSet) UnmarshalJSON(data []byte) error {
565 if len(data) > 0 && data[0] == '[' {
567 err := json.Unmarshal(data, &arr)
575 *ss = make(map[string]struct{}, len(arr))
576 for _, t := range arr {
577 (*ss)[t] = struct{}{}
581 var hash map[string]struct{}
582 err := json.Unmarshal(data, &hash)
586 *ss = make(map[string]struct{}, len(hash))
587 for t := range hash {
588 (*ss)[t] = struct{}{}
594 type ServiceName string
597 ServiceNameRailsAPI ServiceName = "arvados-api-server"
598 ServiceNameController ServiceName = "arvados-controller"
599 ServiceNameDispatchCloud ServiceName = "arvados-dispatch-cloud"
600 ServiceNameHealth ServiceName = "arvados-health"
601 ServiceNameWorkbench1 ServiceName = "arvados-workbench1"
602 ServiceNameWorkbench2 ServiceName = "arvados-workbench2"
603 ServiceNameWebsocket ServiceName = "arvados-ws"
604 ServiceNameKeepbalance ServiceName = "keep-balance"
605 ServiceNameKeepweb ServiceName = "keep-web"
606 ServiceNameKeepproxy ServiceName = "keepproxy"
607 ServiceNameKeepstore ServiceName = "keepstore"
610 // Map returns all services as a map, suitable for iterating over all
611 // services or looking up a service by name.
612 func (svcs Services) Map() map[ServiceName]Service {
613 return map[ServiceName]Service{
614 ServiceNameRailsAPI: svcs.RailsAPI,
615 ServiceNameController: svcs.Controller,
616 ServiceNameDispatchCloud: svcs.DispatchCloud,
617 ServiceNameHealth: svcs.Health,
618 ServiceNameWorkbench1: svcs.Workbench1,
619 ServiceNameWorkbench2: svcs.Workbench2,
620 ServiceNameWebsocket: svcs.Websocket,
621 ServiceNameKeepbalance: svcs.Keepbalance,
622 ServiceNameKeepweb: svcs.WebDAV,
623 ServiceNameKeepproxy: svcs.Keepproxy,
624 ServiceNameKeepstore: svcs.Keepstore,