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
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 if cc, ok := sc.Clusters[clusterID]; !ok {
53 return nil, fmt.Errorf("cluster %q is not configured", clusterID)
55 cc.ClusterID = clusterID
60 type WebDAVCacheConfig struct {
64 MaxCollectionEntries int
65 MaxCollectionBytes int64
66 MaxPermissionEntries int
70 ClusterID string `json:"-"`
71 ManagementToken string
72 SystemRootToken string
74 InstanceTypes InstanceTypeMap
75 Containers ContainersConfig
76 RemoteClusters map[string]RemoteCluster
80 AsyncPermissionsUpdateInterval Duration
81 DisabledAPIs StringSet
82 MaxIndexDatabaseRead int
83 MaxItemsPerResponse int
84 MaxConcurrentRequests int
85 MaxKeepBlobBuffers int
86 MaxRequestAmplification int
88 RailsSessionSecretToken string
89 RequestTimeout Duration
91 WebsocketClientEventQueue int
92 WebsocketServerEventQueue int
93 KeepServiceRequestTimeout Duration
98 UnloggedAttributes StringSet
102 BlobSigningKey string
103 BlobSigningTTL Duration
105 BlobTrashLifetime Duration
106 BlobTrashCheckInterval Duration
107 BlobTrashConcurrency int
108 BlobDeleteConcurrency int
109 BlobReplicateConcurrency int
110 CollectionVersioning bool
111 DefaultTrashLifetime Duration
112 DefaultReplication int
113 ManagedProperties map[string]struct {
118 PreserveVersionIfIdle Duration
119 TrashSweepInterval Duration
121 ForwardSlashNameSubstitution string
123 BlobMissingReport string
124 BalancePeriod Duration
125 BalanceCollectionBatch int
126 BalanceCollectionBuffers int
128 WebDAVCache WebDAVCacheConfig
136 GoogleClientID string
137 GoogleClientSecret string
138 GoogleAlternateEmailAddresses bool
140 ProviderAppSecret string
142 RemoteTokenRefresh Duration
145 MailchimpAPIKey string
146 MailchimpListID string
147 SendUserSetupNotificationEmail bool
148 IssueReporterEmailFrom string
149 IssueReporterEmailTo string
150 SupportEmailAddress string
156 MaxRequestLogParamsSize int
164 AnonymousUserToken string
165 AdminNotifierEmailFrom string
166 AutoAdminFirstUser bool
167 AutoAdminUserWithEmail string
168 AutoSetupNewUsers bool
169 AutoSetupNewUsersWithRepository bool
170 AutoSetupNewUsersWithVmUUID string
171 AutoSetupUsernameBlacklist StringSet
172 EmailSubjectPrefix string
173 NewInactiveUserNotificationRecipients StringSet
174 NewUserNotificationRecipients StringSet
175 NewUsersAreActive bool
176 UserNotifierEmailFrom string
177 UserProfileNotificationAddress string
178 PreferDomainForUsername string
180 Volumes map[string]Volume
182 ActivationContactLink string
183 APIClientConnectTimeout Duration
184 APIClientReceiveTimeout Duration
185 APIResponseCompression bool
186 ApplicationMimetypesWithViewIcon StringSet
187 ArvadosDocsite string
188 ArvadosPublicDataDocURL string
189 DefaultOpenIdPrefix string
190 EnableGettingStartedPopup bool
191 EnablePublicProjectsPage bool
192 FileViewersConfigURL string
193 LogViewerMaxBytes ByteSize
194 MultiSiteSearch string
195 ProfilingEnabled bool
197 RepositoryCache string
198 RunningJobLogRecordsToFetch int
200 ShowRecentCollectionsOnDashboard bool
201 ShowUserAgreementInline bool
202 ShowUserNotifications bool
205 UserProfileFormFields map[string]struct {
207 FormFieldTitle string
208 FormFieldDescription string
211 Options map[string]struct{}
213 UserProfileFormMessage string
215 WelcomePageHTML string
216 InactivePageHTML string
219 ForceLegacyAPI14 bool
223 AccessViaHosts map[URL]VolumeAccess
226 StorageClasses map[string]bool
228 DriverParameters json.RawMessage
231 type S3VolumeDriverParameters struct {
237 LocationConstraint bool
239 ConnectTimeout Duration
245 type AzureVolumeDriverParameters struct {
246 StorageAccountName string
247 StorageAccountKey string
248 StorageBaseURL string
250 RequestTimeout Duration
251 ListBlobsRetryDelay Duration
252 ListBlobsMaxAttempts int
255 type DirectoryVolumeDriverParameters struct {
260 type VolumeAccess struct {
264 type Services struct {
267 DispatchCloud Service
277 WebDAVDownload Service
285 type Service struct {
286 InternalURLs map[URL]ServiceInstance
290 // URL is a url.URL that is also usable as a JSON key/value.
293 // UnmarshalText implements encoding.TextUnmarshaler so URL can be
294 // used as a JSON key/value.
295 func (su *URL) UnmarshalText(text []byte) error {
296 u, err := url.Parse(string(text))
303 func (su URL) MarshalText() ([]byte, error) {
304 return []byte(fmt.Sprintf("%s", (*url.URL)(&su).String())), nil
307 func (su URL) String() string {
308 return (*url.URL)(&su).String()
311 type ServiceInstance struct {
312 Rendezvous string `json:",omitempty"`
315 type PostgreSQL struct {
316 Connection PostgreSQLConnection
320 type PostgreSQLConnection map[string]string
322 type RemoteCluster struct {
330 type InstanceType struct {
336 IncludedScratch ByteSize
337 AddedScratch ByteSize
342 type ContainersConfig struct {
343 CloudVMs CloudVMsConfig
344 CrunchRunCommand string
345 CrunchRunArgumentsList []string
346 DefaultKeepCacheRAM ByteSize
347 DispatchPrivateKey string
348 LogReuseDecisions bool
350 MaxDispatchAttempts int
352 MinRetryPeriod Duration
353 ReserveExtraRAM ByteSize
354 StaleLockTimeout Duration
355 SupportedDockerImageFormats StringSet
356 UsePreemptibleInstances bool
360 GitInternalDir string
365 LogSecondsBetweenEvents Duration
366 LogThrottlePeriod Duration
369 LimitLogBytesPerJob int
370 LogPartialLineThrottlePeriod Duration
371 LogUpdatePeriod Duration
372 LogUpdateSize ByteSize
376 SbatchArgumentsList []string
377 SbatchEnvironmentVariables map[string]string
379 DNSServerConfDir string
380 DNSServerConfTemplate string
381 DNSServerReloadCommand string
382 DNSServerUpdateCommand string
383 ComputeNodeDomain string
384 ComputeNodeNameservers StringSet
385 AssignNodeHostname string
390 type CloudVMsConfig struct {
393 BootProbeCommand string
394 DeployRunnerBinary string
396 MaxCloudOpsPerSecond int
397 MaxProbesPerSecond int
398 PollInterval Duration
399 ProbeInterval Duration
401 SyncInterval Duration
402 TimeoutBooting Duration
404 TimeoutProbe Duration
405 TimeoutShutdown Duration
406 TimeoutSignal Duration
408 ResourceTags map[string]string
412 DriverParameters json.RawMessage
415 type InstanceTypeMap map[string]InstanceType
417 var errDuplicateInstanceTypeName = errors.New("duplicate instance type name")
419 // UnmarshalJSON handles old config files that provide an array of
420 // instance types instead of a hash.
421 func (it *InstanceTypeMap) UnmarshalJSON(data []byte) error {
422 if len(data) > 0 && data[0] == '[' {
423 var arr []InstanceType
424 err := json.Unmarshal(data, &arr)
432 *it = make(map[string]InstanceType, len(arr))
433 for _, t := range arr {
434 if _, ok := (*it)[t.Name]; ok {
435 return errDuplicateInstanceTypeName
437 if t.ProviderType == "" {
438 t.ProviderType = t.Name
441 t.Scratch = t.IncludedScratch + t.AddedScratch
442 } else if t.AddedScratch == 0 {
443 t.AddedScratch = t.Scratch - t.IncludedScratch
444 } else if t.IncludedScratch == 0 {
445 t.IncludedScratch = t.Scratch - t.AddedScratch
448 if t.Scratch != (t.IncludedScratch + t.AddedScratch) {
449 return fmt.Errorf("%v: Scratch != (IncludedScratch + AddedScratch)", t.Name)
455 var hash map[string]InstanceType
456 err := json.Unmarshal(data, &hash)
460 // Fill in Name field (and ProviderType field, if not
461 // specified) using hash key.
462 *it = InstanceTypeMap(hash)
463 for name, t := range *it {
465 if t.ProviderType == "" {
466 t.ProviderType = name
473 type StringSet map[string]struct{}
475 // UnmarshalJSON handles old config files that provide an array of
476 // instance types instead of a hash.
477 func (ss *StringSet) UnmarshalJSON(data []byte) error {
478 if len(data) > 0 && data[0] == '[' {
480 err := json.Unmarshal(data, &arr)
488 *ss = make(map[string]struct{}, len(arr))
489 for _, t := range arr {
490 (*ss)[t] = struct{}{}
494 var hash map[string]struct{}
495 err := json.Unmarshal(data, &hash)
499 *ss = make(map[string]struct{}, len(hash))
500 for t, _ := range hash {
501 (*ss)[t] = struct{}{}
507 type ServiceName string
510 ServiceNameRailsAPI ServiceName = "arvados-api-server"
511 ServiceNameController ServiceName = "arvados-controller"
512 ServiceNameDispatchCloud ServiceName = "arvados-dispatch-cloud"
513 ServiceNameHealth ServiceName = "arvados-health"
514 ServiceNameNodemanager ServiceName = "arvados-node-manager"
515 ServiceNameWorkbench1 ServiceName = "arvados-workbench1"
516 ServiceNameWorkbench2 ServiceName = "arvados-workbench2"
517 ServiceNameWebsocket ServiceName = "arvados-ws"
518 ServiceNameKeepbalance ServiceName = "keep-balance"
519 ServiceNameKeepweb ServiceName = "keep-web"
520 ServiceNameKeepproxy ServiceName = "keepproxy"
521 ServiceNameKeepstore ServiceName = "keepstore"
524 // Map returns all services as a map, suitable for iterating over all
525 // services or looking up a service by name.
526 func (svcs Services) Map() map[ServiceName]Service {
527 return map[ServiceName]Service{
528 ServiceNameRailsAPI: svcs.RailsAPI,
529 ServiceNameController: svcs.Controller,
530 ServiceNameDispatchCloud: svcs.DispatchCloud,
531 ServiceNameHealth: svcs.Health,
532 ServiceNameNodemanager: svcs.Nodemanager,
533 ServiceNameWorkbench1: svcs.Workbench1,
534 ServiceNameWorkbench2: svcs.Workbench2,
535 ServiceNameWebsocket: svcs.Websocket,
536 ServiceNameKeepbalance: svcs.Keepbalance,
537 ServiceNameKeepweb: svcs.WebDAV,
538 ServiceNameKeepproxy: svcs.Keepproxy,
539 ServiceNameKeepstore: svcs.Keepstore,