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
217 SSHHelpPageHTML string
220 ForceLegacyAPI14 bool
224 AccessViaHosts map[URL]VolumeAccess
227 StorageClasses map[string]bool
229 DriverParameters json.RawMessage
232 type S3VolumeDriverParameters struct {
238 LocationConstraint bool
240 ConnectTimeout Duration
246 type AzureVolumeDriverParameters struct {
247 StorageAccountName string
248 StorageAccountKey string
249 StorageBaseURL string
251 RequestTimeout Duration
252 ListBlobsRetryDelay Duration
253 ListBlobsMaxAttempts int
256 type DirectoryVolumeDriverParameters struct {
261 type VolumeAccess struct {
265 type Services struct {
268 DispatchCloud Service
278 WebDAVDownload Service
286 type Service struct {
287 InternalURLs map[URL]ServiceInstance
291 // URL is a url.URL that is also usable as a JSON key/value.
294 // UnmarshalText implements encoding.TextUnmarshaler so URL can be
295 // used as a JSON key/value.
296 func (su *URL) UnmarshalText(text []byte) error {
297 u, err := url.Parse(string(text))
304 func (su URL) MarshalText() ([]byte, error) {
305 return []byte(fmt.Sprintf("%s", (*url.URL)(&su).String())), nil
308 func (su URL) String() string {
309 return (*url.URL)(&su).String()
312 type ServiceInstance struct {
313 Rendezvous string `json:",omitempty"`
316 type PostgreSQL struct {
317 Connection PostgreSQLConnection
321 type PostgreSQLConnection map[string]string
323 type RemoteCluster struct {
331 type InstanceType struct {
337 IncludedScratch ByteSize
338 AddedScratch ByteSize
343 type ContainersConfig struct {
344 CloudVMs CloudVMsConfig
345 CrunchRunCommand string
346 CrunchRunArgumentsList []string
347 DefaultKeepCacheRAM ByteSize
348 DispatchPrivateKey string
349 LogReuseDecisions bool
351 MaxDispatchAttempts int
353 MinRetryPeriod Duration
354 ReserveExtraRAM ByteSize
355 StaleLockTimeout Duration
356 SupportedDockerImageFormats StringSet
357 UsePreemptibleInstances bool
361 GitInternalDir string
366 LogSecondsBetweenEvents Duration
367 LogThrottlePeriod Duration
370 LimitLogBytesPerJob int
371 LogPartialLineThrottlePeriod Duration
372 LogUpdatePeriod Duration
373 LogUpdateSize ByteSize
377 SbatchArgumentsList []string
378 SbatchEnvironmentVariables map[string]string
380 DNSServerConfDir string
381 DNSServerConfTemplate string
382 DNSServerReloadCommand string
383 DNSServerUpdateCommand string
384 ComputeNodeDomain string
385 ComputeNodeNameservers StringSet
386 AssignNodeHostname string
391 type CloudVMsConfig struct {
394 BootProbeCommand string
395 DeployRunnerBinary string
397 MaxCloudOpsPerSecond int
398 MaxProbesPerSecond int
399 PollInterval Duration
400 ProbeInterval Duration
402 SyncInterval Duration
403 TimeoutBooting Duration
405 TimeoutProbe Duration
406 TimeoutShutdown Duration
407 TimeoutSignal Duration
409 ResourceTags map[string]string
413 DriverParameters json.RawMessage
416 type InstanceTypeMap map[string]InstanceType
418 var errDuplicateInstanceTypeName = errors.New("duplicate instance type name")
420 // UnmarshalJSON handles old config files that provide an array of
421 // instance types instead of a hash.
422 func (it *InstanceTypeMap) UnmarshalJSON(data []byte) error {
423 if len(data) > 0 && data[0] == '[' {
424 var arr []InstanceType
425 err := json.Unmarshal(data, &arr)
433 *it = make(map[string]InstanceType, len(arr))
434 for _, t := range arr {
435 if _, ok := (*it)[t.Name]; ok {
436 return errDuplicateInstanceTypeName
438 if t.ProviderType == "" {
439 t.ProviderType = t.Name
442 t.Scratch = t.IncludedScratch + t.AddedScratch
443 } else if t.AddedScratch == 0 {
444 t.AddedScratch = t.Scratch - t.IncludedScratch
445 } else if t.IncludedScratch == 0 {
446 t.IncludedScratch = t.Scratch - t.AddedScratch
449 if t.Scratch != (t.IncludedScratch + t.AddedScratch) {
450 return fmt.Errorf("%v: Scratch != (IncludedScratch + AddedScratch)", t.Name)
456 var hash map[string]InstanceType
457 err := json.Unmarshal(data, &hash)
461 // Fill in Name field (and ProviderType field, if not
462 // specified) using hash key.
463 *it = InstanceTypeMap(hash)
464 for name, t := range *it {
466 if t.ProviderType == "" {
467 t.ProviderType = name
474 type StringSet map[string]struct{}
476 // UnmarshalJSON handles old config files that provide an array of
477 // instance types instead of a hash.
478 func (ss *StringSet) UnmarshalJSON(data []byte) error {
479 if len(data) > 0 && data[0] == '[' {
481 err := json.Unmarshal(data, &arr)
489 *ss = make(map[string]struct{}, len(arr))
490 for _, t := range arr {
491 (*ss)[t] = struct{}{}
495 var hash map[string]struct{}
496 err := json.Unmarshal(data, &hash)
500 *ss = make(map[string]struct{}, len(hash))
501 for t, _ := range hash {
502 (*ss)[t] = struct{}{}
508 type ServiceName string
511 ServiceNameRailsAPI ServiceName = "arvados-api-server"
512 ServiceNameController ServiceName = "arvados-controller"
513 ServiceNameDispatchCloud ServiceName = "arvados-dispatch-cloud"
514 ServiceNameHealth ServiceName = "arvados-health"
515 ServiceNameNodemanager ServiceName = "arvados-node-manager"
516 ServiceNameWorkbench1 ServiceName = "arvados-workbench1"
517 ServiceNameWorkbench2 ServiceName = "arvados-workbench2"
518 ServiceNameWebsocket ServiceName = "arvados-ws"
519 ServiceNameKeepbalance ServiceName = "keep-balance"
520 ServiceNameKeepweb ServiceName = "keep-web"
521 ServiceNameKeepproxy ServiceName = "keepproxy"
522 ServiceNameKeepstore ServiceName = "keepstore"
525 // Map returns all services as a map, suitable for iterating over all
526 // services or looking up a service by name.
527 func (svcs Services) Map() map[ServiceName]Service {
528 return map[ServiceName]Service{
529 ServiceNameRailsAPI: svcs.RailsAPI,
530 ServiceNameController: svcs.Controller,
531 ServiceNameDispatchCloud: svcs.DispatchCloud,
532 ServiceNameHealth: svcs.Health,
533 ServiceNameNodemanager: svcs.Nodemanager,
534 ServiceNameWorkbench1: svcs.Workbench1,
535 ServiceNameWorkbench2: svcs.Workbench2,
536 ServiceNameWebsocket: svcs.Websocket,
537 ServiceNameKeepbalance: svcs.Keepbalance,
538 ServiceNameKeepweb: svcs.WebDAV,
539 ServiceNameKeepproxy: svcs.Keepproxy,
540 ServiceNameKeepstore: svcs.Keepstore,