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
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
161 OpenIDConnect struct {
167 EmailVerifiedClaim string
173 DefaultEmailDomain string
178 ProviderAppSecret string
181 RemoteTokenRefresh Duration
184 MailchimpAPIKey string
185 MailchimpListID string
186 SendUserSetupNotificationEmail bool
187 IssueReporterEmailFrom string
188 IssueReporterEmailTo string
189 SupportEmailAddress string
195 MaxRequestLogParamsSize int
203 AnonymousUserToken string
204 AdminNotifierEmailFrom string
205 AutoAdminFirstUser bool
206 AutoAdminUserWithEmail string
207 AutoSetupNewUsers bool
208 AutoSetupNewUsersWithRepository bool
209 AutoSetupNewUsersWithVmUUID string
210 AutoSetupUsernameBlacklist StringSet
211 EmailSubjectPrefix string
212 NewInactiveUserNotificationRecipients StringSet
213 NewUserNotificationRecipients StringSet
214 NewUsersAreActive bool
215 UserNotifierEmailFrom string
216 UserProfileNotificationAddress string
217 PreferDomainForUsername string
219 Volumes map[string]Volume
221 ActivationContactLink string
222 APIClientConnectTimeout Duration
223 APIClientReceiveTimeout Duration
224 APIResponseCompression bool
225 ApplicationMimetypesWithViewIcon StringSet
226 ArvadosDocsite string
227 ArvadosPublicDataDocURL string
228 DefaultOpenIdPrefix string
229 EnableGettingStartedPopup bool
230 EnablePublicProjectsPage bool
231 FileViewersConfigURL string
232 LogViewerMaxBytes ByteSize
233 MultiSiteSearch string
234 ProfilingEnabled bool
236 RepositoryCache string
237 RunningJobLogRecordsToFetch int
239 ShowRecentCollectionsOnDashboard bool
240 ShowUserAgreementInline bool
241 ShowUserNotifications bool
244 UserProfileFormFields map[string]struct {
246 FormFieldTitle string
247 FormFieldDescription string
250 Options map[string]struct{}
252 UserProfileFormMessage string
254 WelcomePageHTML string
255 InactivePageHTML string
256 SSHHelpPageHTML string
257 SSHHelpHostSuffix string
260 ForceLegacyAPI14 bool
264 AccessViaHosts map[URL]VolumeAccess
267 StorageClasses map[string]bool
269 DriverParameters json.RawMessage
272 type S3VolumeDriverParameters struct {
279 LocationConstraint bool
281 UseAWSS3v2Driver bool
283 ConnectTimeout Duration
289 type AzureVolumeDriverParameters struct {
290 StorageAccountName string
291 StorageAccountKey string
292 StorageBaseURL string
294 RequestTimeout Duration
295 ListBlobsRetryDelay Duration
296 ListBlobsMaxAttempts int
299 type DirectoryVolumeDriverParameters struct {
304 type VolumeAccess struct {
308 type Services struct {
311 DispatchCloud Service
320 WebDAVDownload Service
328 type Service struct {
329 InternalURLs map[URL]ServiceInstance
333 // URL is a url.URL that is also usable as a JSON key/value.
336 // UnmarshalText implements encoding.TextUnmarshaler so URL can be
337 // used as a JSON key/value.
338 func (su *URL) UnmarshalText(text []byte) error {
339 u, err := url.Parse(string(text))
342 if su.Path == "" && su.Host != "" {
343 // http://example really means http://example/
350 func (su URL) MarshalText() ([]byte, error) {
351 return []byte(fmt.Sprintf("%s", (*url.URL)(&su).String())), nil
354 func (su URL) String() string {
355 return (*url.URL)(&su).String()
358 type ServiceInstance struct {
359 Rendezvous string `json:",omitempty"`
362 type PostgreSQL struct {
363 Connection PostgreSQLConnection
367 type PostgreSQLConnection map[string]string
369 type RemoteCluster struct {
377 type InstanceType struct {
383 IncludedScratch ByteSize
384 AddedScratch ByteSize
389 type ContainersConfig struct {
390 CloudVMs CloudVMsConfig
391 CrunchRunCommand string
392 CrunchRunArgumentsList []string
393 DefaultKeepCacheRAM ByteSize
394 DispatchPrivateKey string
395 LogReuseDecisions bool
397 MaxDispatchAttempts int
399 MinRetryPeriod Duration
400 ReserveExtraRAM ByteSize
401 StaleLockTimeout Duration
402 SupportedDockerImageFormats StringSet
403 UsePreemptibleInstances bool
407 GitInternalDir string
412 LogSecondsBetweenEvents Duration
413 LogThrottlePeriod Duration
416 LimitLogBytesPerJob int
417 LogPartialLineThrottlePeriod Duration
418 LogUpdatePeriod Duration
419 LogUpdateSize ByteSize
423 SbatchArgumentsList []string
424 SbatchEnvironmentVariables map[string]string
426 DNSServerConfDir string
427 DNSServerConfTemplate string
428 DNSServerReloadCommand string
429 DNSServerUpdateCommand string
430 ComputeNodeDomain string
431 ComputeNodeNameservers StringSet
432 AssignNodeHostname string
437 type CloudVMsConfig struct {
440 BootProbeCommand string
441 DeployRunnerBinary string
443 MaxCloudOpsPerSecond int
444 MaxProbesPerSecond int
445 PollInterval Duration
446 ProbeInterval Duration
448 SyncInterval Duration
449 TimeoutBooting Duration
451 TimeoutProbe Duration
452 TimeoutShutdown Duration
453 TimeoutSignal Duration
455 ResourceTags map[string]string
459 DriverParameters json.RawMessage
462 type InstanceTypeMap map[string]InstanceType
464 var errDuplicateInstanceTypeName = errors.New("duplicate instance type name")
466 // UnmarshalJSON handles old config files that provide an array of
467 // instance types instead of a hash.
468 func (it *InstanceTypeMap) UnmarshalJSON(data []byte) error {
469 fixup := func(t InstanceType) (InstanceType, error) {
470 if t.ProviderType == "" {
471 t.ProviderType = t.Name
474 t.Scratch = t.IncludedScratch + t.AddedScratch
475 } else if t.AddedScratch == 0 {
476 t.AddedScratch = t.Scratch - t.IncludedScratch
477 } else if t.IncludedScratch == 0 {
478 t.IncludedScratch = t.Scratch - t.AddedScratch
481 if t.Scratch != (t.IncludedScratch + t.AddedScratch) {
482 return t, fmt.Errorf("InstanceType %q: Scratch != (IncludedScratch + AddedScratch)", t.Name)
487 if len(data) > 0 && data[0] == '[' {
488 var arr []InstanceType
489 err := json.Unmarshal(data, &arr)
497 *it = make(map[string]InstanceType, len(arr))
498 for _, t := range arr {
499 if _, ok := (*it)[t.Name]; ok {
500 return errDuplicateInstanceTypeName
510 var hash map[string]InstanceType
511 err := json.Unmarshal(data, &hash)
515 // Fill in Name field (and ProviderType field, if not
516 // specified) using hash key.
517 *it = InstanceTypeMap(hash)
518 for name, t := range *it {
529 type StringSet map[string]struct{}
531 // UnmarshalJSON handles old config files that provide an array of
532 // instance types instead of a hash.
533 func (ss *StringSet) UnmarshalJSON(data []byte) error {
534 if len(data) > 0 && data[0] == '[' {
536 err := json.Unmarshal(data, &arr)
544 *ss = make(map[string]struct{}, len(arr))
545 for _, t := range arr {
546 (*ss)[t] = struct{}{}
550 var hash map[string]struct{}
551 err := json.Unmarshal(data, &hash)
555 *ss = make(map[string]struct{}, len(hash))
556 for t := range hash {
557 (*ss)[t] = struct{}{}
563 type ServiceName string
566 ServiceNameRailsAPI ServiceName = "arvados-api-server"
567 ServiceNameController ServiceName = "arvados-controller"
568 ServiceNameDispatchCloud ServiceName = "arvados-dispatch-cloud"
569 ServiceNameHealth ServiceName = "arvados-health"
570 ServiceNameWorkbench1 ServiceName = "arvados-workbench1"
571 ServiceNameWorkbench2 ServiceName = "arvados-workbench2"
572 ServiceNameWebsocket ServiceName = "arvados-ws"
573 ServiceNameKeepbalance ServiceName = "keep-balance"
574 ServiceNameKeepweb ServiceName = "keep-web"
575 ServiceNameKeepproxy ServiceName = "keepproxy"
576 ServiceNameKeepstore ServiceName = "keepstore"
579 // Map returns all services as a map, suitable for iterating over all
580 // services or looking up a service by name.
581 func (svcs Services) Map() map[ServiceName]Service {
582 return map[ServiceName]Service{
583 ServiceNameRailsAPI: svcs.RailsAPI,
584 ServiceNameController: svcs.Controller,
585 ServiceNameDispatchCloud: svcs.DispatchCloud,
586 ServiceNameHealth: svcs.Health,
587 ServiceNameWorkbench1: svcs.Workbench1,
588 ServiceNameWorkbench2: svcs.Workbench2,
589 ServiceNameWebsocket: svcs.Websocket,
590 ServiceNameKeepbalance: svcs.Keepbalance,
591 ServiceNameKeepweb: svcs.WebDAV,
592 ServiceNameKeepproxy: svcs.Keepproxy,
593 ServiceNameKeepstore: svcs.Keepstore,