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"
26 Clusters map[string]Cluster
30 // GetConfig returns the current system config, loading it from
31 // configFile if needed.
32 func GetConfig(configFile string) (*Config, error) {
34 err := config.LoadFile(&cfg, configFile)
38 // GetCluster returns the cluster ID and config for the given
39 // cluster, or the default/only configured cluster if clusterID is "".
40 func (sc *Config) GetCluster(clusterID string) (*Cluster, error) {
42 if len(sc.Clusters) == 0 {
43 return nil, fmt.Errorf("no clusters configured")
44 } else if len(sc.Clusters) > 1 {
45 return nil, fmt.Errorf("multiple clusters configured, cannot choose")
47 for id, cc := range sc.Clusters {
53 if cc, ok := sc.Clusters[clusterID]; !ok {
54 return nil, fmt.Errorf("cluster %q is not configured", clusterID)
56 cc.ClusterID = clusterID
61 type WebDAVCacheConfig struct {
65 MaxCollectionEntries int
66 MaxCollectionBytes int64
67 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 RailsSessionSecretToken string
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
125 BlobMissingReport string
126 BalancePeriod Duration
127 BalanceCollectionBatch int
128 BalanceCollectionBuffers int
129 BalanceTimeout Duration
131 WebDAVCache WebDAVCacheConfig
146 SearchAttribute string
147 SearchBindUser string
148 SearchBindPassword string
151 EmailAttribute string
152 UsernameAttribute string
158 AlternateEmailAddresses bool
160 OpenIDConnect struct {
166 EmailVerifiedClaim string
172 DefaultEmailDomain string
177 ProviderAppSecret string
180 RemoteTokenRefresh Duration
183 MailchimpAPIKey string
184 MailchimpListID string
185 SendUserSetupNotificationEmail bool
186 IssueReporterEmailFrom string
187 IssueReporterEmailTo string
188 SupportEmailAddress string
194 MaxRequestLogParamsSize int
202 AnonymousUserToken string
203 AdminNotifierEmailFrom string
204 AutoAdminFirstUser bool
205 AutoAdminUserWithEmail string
206 AutoSetupNewUsers bool
207 AutoSetupNewUsersWithRepository bool
208 AutoSetupNewUsersWithVmUUID string
209 AutoSetupUsernameBlacklist StringSet
210 EmailSubjectPrefix string
211 NewInactiveUserNotificationRecipients StringSet
212 NewUserNotificationRecipients StringSet
213 NewUsersAreActive bool
214 UserNotifierEmailFrom string
215 UserProfileNotificationAddress string
216 PreferDomainForUsername string
218 Volumes map[string]Volume
220 ActivationContactLink string
221 APIClientConnectTimeout Duration
222 APIClientReceiveTimeout Duration
223 APIResponseCompression bool
224 ApplicationMimetypesWithViewIcon StringSet
225 ArvadosDocsite string
226 ArvadosPublicDataDocURL string
227 DefaultOpenIdPrefix string
228 EnableGettingStartedPopup bool
229 EnablePublicProjectsPage bool
230 FileViewersConfigURL string
231 LogViewerMaxBytes ByteSize
232 MultiSiteSearch string
233 ProfilingEnabled bool
235 RepositoryCache string
236 RunningJobLogRecordsToFetch int
238 ShowRecentCollectionsOnDashboard bool
239 ShowUserAgreementInline bool
240 ShowUserNotifications bool
243 UserProfileFormFields map[string]struct {
245 FormFieldTitle string
246 FormFieldDescription string
249 Options map[string]struct{}
251 UserProfileFormMessage string
253 WelcomePageHTML string
254 InactivePageHTML string
255 SSHHelpPageHTML string
256 SSHHelpHostSuffix string
259 ForceLegacyAPI14 bool
263 AccessViaHosts map[URL]VolumeAccess
266 StorageClasses map[string]bool
268 DriverParameters json.RawMessage
271 type S3VolumeDriverParameters struct {
278 LocationConstraint bool
280 UseAWSS3v2Driver bool
282 ConnectTimeout Duration
288 type AzureVolumeDriverParameters struct {
289 StorageAccountName string
290 StorageAccountKey string
291 StorageBaseURL string
293 RequestTimeout Duration
294 ListBlobsRetryDelay Duration
295 ListBlobsMaxAttempts int
298 type DirectoryVolumeDriverParameters struct {
303 type VolumeAccess struct {
307 type Services struct {
310 DispatchCloud Service
319 WebDAVDownload Service
327 type Service struct {
328 InternalURLs map[URL]ServiceInstance
332 // URL is a url.URL that is also usable as a JSON key/value.
335 // UnmarshalText implements encoding.TextUnmarshaler so URL can be
336 // used as a JSON key/value.
337 func (su *URL) UnmarshalText(text []byte) error {
338 u, err := url.Parse(string(text))
341 if su.Path == "" && su.Host != "" {
342 // http://example really means http://example/
349 func (su URL) MarshalText() ([]byte, error) {
350 return []byte(fmt.Sprintf("%s", (*url.URL)(&su).String())), nil
353 func (su URL) String() string {
354 return (*url.URL)(&su).String()
357 type ServiceInstance struct {
358 Rendezvous string `json:",omitempty"`
361 type PostgreSQL struct {
362 Connection PostgreSQLConnection
366 type PostgreSQLConnection map[string]string
368 type RemoteCluster struct {
376 type InstanceType struct {
382 IncludedScratch ByteSize
383 AddedScratch ByteSize
388 type ContainersConfig struct {
389 CloudVMs CloudVMsConfig
390 CrunchRunCommand string
391 CrunchRunArgumentsList []string
392 DefaultKeepCacheRAM ByteSize
393 DispatchPrivateKey string
394 LogReuseDecisions bool
396 MaxDispatchAttempts int
398 MinRetryPeriod Duration
399 ReserveExtraRAM ByteSize
400 StaleLockTimeout Duration
401 SupportedDockerImageFormats StringSet
402 UsePreemptibleInstances bool
406 GitInternalDir string
411 LogSecondsBetweenEvents Duration
412 LogThrottlePeriod Duration
415 LimitLogBytesPerJob int
416 LogPartialLineThrottlePeriod Duration
417 LogUpdatePeriod Duration
418 LogUpdateSize ByteSize
422 SbatchArgumentsList []string
423 SbatchEnvironmentVariables map[string]string
425 DNSServerConfDir string
426 DNSServerConfTemplate string
427 DNSServerReloadCommand string
428 DNSServerUpdateCommand string
429 ComputeNodeDomain string
430 ComputeNodeNameservers StringSet
431 AssignNodeHostname string
436 type CloudVMsConfig struct {
439 BootProbeCommand string
440 DeployRunnerBinary string
442 MaxCloudOpsPerSecond int
443 MaxProbesPerSecond int
444 PollInterval Duration
445 ProbeInterval Duration
447 SyncInterval Duration
448 TimeoutBooting Duration
450 TimeoutProbe Duration
451 TimeoutShutdown Duration
452 TimeoutSignal Duration
454 ResourceTags map[string]string
458 DriverParameters json.RawMessage
461 type InstanceTypeMap map[string]InstanceType
463 var errDuplicateInstanceTypeName = errors.New("duplicate instance type name")
465 // UnmarshalJSON handles old config files that provide an array of
466 // instance types instead of a hash.
467 func (it *InstanceTypeMap) UnmarshalJSON(data []byte) error {
468 fixup := func(t InstanceType) (InstanceType, error) {
469 if t.ProviderType == "" {
470 t.ProviderType = t.Name
473 t.Scratch = t.IncludedScratch + t.AddedScratch
474 } else if t.AddedScratch == 0 {
475 t.AddedScratch = t.Scratch - t.IncludedScratch
476 } else if t.IncludedScratch == 0 {
477 t.IncludedScratch = t.Scratch - t.AddedScratch
480 if t.Scratch != (t.IncludedScratch + t.AddedScratch) {
481 return t, fmt.Errorf("InstanceType %q: Scratch != (IncludedScratch + AddedScratch)", t.Name)
486 if len(data) > 0 && data[0] == '[' {
487 var arr []InstanceType
488 err := json.Unmarshal(data, &arr)
496 *it = make(map[string]InstanceType, len(arr))
497 for _, t := range arr {
498 if _, ok := (*it)[t.Name]; ok {
499 return errDuplicateInstanceTypeName
509 var hash map[string]InstanceType
510 err := json.Unmarshal(data, &hash)
514 // Fill in Name field (and ProviderType field, if not
515 // specified) using hash key.
516 *it = InstanceTypeMap(hash)
517 for name, t := range *it {
528 type StringSet map[string]struct{}
530 // UnmarshalJSON handles old config files that provide an array of
531 // instance types instead of a hash.
532 func (ss *StringSet) UnmarshalJSON(data []byte) error {
533 if len(data) > 0 && data[0] == '[' {
535 err := json.Unmarshal(data, &arr)
543 *ss = make(map[string]struct{}, len(arr))
544 for _, t := range arr {
545 (*ss)[t] = struct{}{}
549 var hash map[string]struct{}
550 err := json.Unmarshal(data, &hash)
554 *ss = make(map[string]struct{}, len(hash))
555 for t := range hash {
556 (*ss)[t] = struct{}{}
562 type ServiceName string
565 ServiceNameRailsAPI ServiceName = "arvados-api-server"
566 ServiceNameController ServiceName = "arvados-controller"
567 ServiceNameDispatchCloud ServiceName = "arvados-dispatch-cloud"
568 ServiceNameHealth ServiceName = "arvados-health"
569 ServiceNameWorkbench1 ServiceName = "arvados-workbench1"
570 ServiceNameWorkbench2 ServiceName = "arvados-workbench2"
571 ServiceNameWebsocket ServiceName = "arvados-ws"
572 ServiceNameKeepbalance ServiceName = "keep-balance"
573 ServiceNameKeepweb ServiceName = "keep-web"
574 ServiceNameKeepproxy ServiceName = "keepproxy"
575 ServiceNameKeepstore ServiceName = "keepstore"
578 // Map returns all services as a map, suitable for iterating over all
579 // services or looking up a service by name.
580 func (svcs Services) Map() map[ServiceName]Service {
581 return map[ServiceName]Service{
582 ServiceNameRailsAPI: svcs.RailsAPI,
583 ServiceNameController: svcs.Controller,
584 ServiceNameDispatchCloud: svcs.DispatchCloud,
585 ServiceNameHealth: svcs.Health,
586 ServiceNameWorkbench1: svcs.Workbench1,
587 ServiceNameWorkbench2: svcs.Workbench2,
588 ServiceNameWebsocket: svcs.Websocket,
589 ServiceNameKeepbalance: svcs.Keepbalance,
590 ServiceNameKeepweb: svcs.WebDAV,
591 ServiceNameKeepproxy: svcs.Keepproxy,
592 ServiceNameKeepstore: svcs.Keepstore,