1 // Copyright (C) The Arvados Authors. All rights reserved.
3 // SPDX-License-Identifier: Apache-2.0
14 "git.curoverse.com/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
122 BlobMissingReport string
123 BalancePeriod Duration
124 BalanceCollectionBatch int
125 BalanceCollectionBuffers int
127 WebDAVCache WebDAVCacheConfig
135 ProviderAppSecret string
138 RemoteTokenRefresh Duration
141 MailchimpAPIKey string
142 MailchimpListID string
143 SendUserSetupNotificationEmail bool
144 IssueReporterEmailFrom string
145 IssueReporterEmailTo string
146 SupportEmailAddress string
152 MaxRequestLogParamsSize int
160 AnonymousUserToken string
161 AdminNotifierEmailFrom string
162 AutoAdminFirstUser bool
163 AutoAdminUserWithEmail string
164 AutoSetupNewUsers bool
165 AutoSetupNewUsersWithRepository bool
166 AutoSetupNewUsersWithVmUUID string
167 AutoSetupUsernameBlacklist StringSet
168 EmailSubjectPrefix string
169 NewInactiveUserNotificationRecipients StringSet
170 NewUserNotificationRecipients StringSet
171 NewUsersAreActive bool
172 UserNotifierEmailFrom string
173 UserProfileNotificationAddress string
175 Volumes map[string]Volume
177 ActivationContactLink string
178 APIClientConnectTimeout Duration
179 APIClientReceiveTimeout Duration
180 APIResponseCompression bool
181 ApplicationMimetypesWithViewIcon StringSet
182 ArvadosDocsite string
183 ArvadosPublicDataDocURL string
184 DefaultOpenIdPrefix string
185 EnableGettingStartedPopup bool
186 EnablePublicProjectsPage bool
187 FileViewersConfigURL string
188 LogViewerMaxBytes ByteSize
189 MultiSiteSearch string
190 ProfilingEnabled bool
192 RepositoryCache string
193 RunningJobLogRecordsToFetch int
195 ShowRecentCollectionsOnDashboard bool
196 ShowUserAgreementInline bool
197 ShowUserNotifications bool
200 UserProfileFormFields map[string]struct {
202 FormFieldTitle string
203 FormFieldDescription string
206 Options map[string]struct{}
208 UserProfileFormMessage string
212 EnableBetaController14287 bool
216 AccessViaHosts map[URL]VolumeAccess
219 StorageClasses map[string]bool
221 DriverParameters json.RawMessage
224 type S3VolumeDriverParameters struct {
230 LocationConstraint bool
232 ConnectTimeout Duration
238 type AzureVolumeDriverParameters struct {
239 StorageAccountName string
240 StorageAccountKey string
241 StorageBaseURL string
243 RequestTimeout Duration
244 ListBlobsRetryDelay Duration
245 ListBlobsMaxAttempts int
248 type DirectoryVolumeDriverParameters struct {
253 type VolumeAccess struct {
257 type Services struct {
260 DispatchCloud Service
270 WebDAVDownload Service
278 type Service struct {
279 InternalURLs map[URL]ServiceInstance
283 // URL is a url.URL that is also usable as a JSON key/value.
286 // UnmarshalText implements encoding.TextUnmarshaler so URL can be
287 // used as a JSON key/value.
288 func (su *URL) UnmarshalText(text []byte) error {
289 u, err := url.Parse(string(text))
296 func (su URL) MarshalText() ([]byte, error) {
297 return []byte(fmt.Sprintf("%s", (*url.URL)(&su).String())), nil
300 func (su URL) String() string {
301 return (*url.URL)(&su).String()
304 type ServiceInstance struct {
305 Rendezvous string `json:",omitempty"`
308 type PostgreSQL struct {
309 Connection PostgreSQLConnection
313 type PostgreSQLConnection map[string]string
315 type RemoteCluster struct {
323 type InstanceType struct {
329 IncludedScratch ByteSize
330 AddedScratch ByteSize
335 type ContainersConfig struct {
336 CloudVMs CloudVMsConfig
337 CrunchRunCommand string
338 CrunchRunArgumentsList []string
339 DefaultKeepCacheRAM ByteSize
340 DispatchPrivateKey string
341 LogReuseDecisions bool
343 MaxDispatchAttempts int
345 MinRetryPeriod Duration
346 ReserveExtraRAM ByteSize
347 StaleLockTimeout Duration
348 SupportedDockerImageFormats StringSet
349 UsePreemptibleInstances bool
353 GitInternalDir string
358 LogSecondsBetweenEvents int
359 LogThrottlePeriod Duration
362 LimitLogBytesPerJob int
363 LogPartialLineThrottlePeriod Duration
364 LogUpdatePeriod Duration
365 LogUpdateSize ByteSize
369 SbatchArgumentsList []string
370 SbatchEnvironmentVariables map[string]string
372 DNSServerConfDir string
373 DNSServerConfTemplate string
374 DNSServerReloadCommand string
375 DNSServerUpdateCommand string
376 ComputeNodeDomain string
377 ComputeNodeNameservers StringSet
378 AssignNodeHostname string
383 type CloudVMsConfig struct {
386 BootProbeCommand string
388 MaxCloudOpsPerSecond int
389 MaxProbesPerSecond int
390 PollInterval Duration
391 ProbeInterval Duration
393 SyncInterval Duration
394 TimeoutBooting Duration
396 TimeoutProbe Duration
397 TimeoutShutdown Duration
398 TimeoutSignal Duration
400 ResourceTags map[string]string
404 DriverParameters json.RawMessage
407 type InstanceTypeMap map[string]InstanceType
409 var errDuplicateInstanceTypeName = errors.New("duplicate instance type name")
411 // UnmarshalJSON handles old config files that provide an array of
412 // instance types instead of a hash.
413 func (it *InstanceTypeMap) UnmarshalJSON(data []byte) error {
414 if len(data) > 0 && data[0] == '[' {
415 var arr []InstanceType
416 err := json.Unmarshal(data, &arr)
424 *it = make(map[string]InstanceType, len(arr))
425 for _, t := range arr {
426 if _, ok := (*it)[t.Name]; ok {
427 return errDuplicateInstanceTypeName
429 if t.ProviderType == "" {
430 t.ProviderType = t.Name
433 t.Scratch = t.IncludedScratch + t.AddedScratch
434 } else if t.AddedScratch == 0 {
435 t.AddedScratch = t.Scratch - t.IncludedScratch
436 } else if t.IncludedScratch == 0 {
437 t.IncludedScratch = t.Scratch - t.AddedScratch
440 if t.Scratch != (t.IncludedScratch + t.AddedScratch) {
441 return fmt.Errorf("%v: Scratch != (IncludedScratch + AddedScratch)", t.Name)
447 var hash map[string]InstanceType
448 err := json.Unmarshal(data, &hash)
452 // Fill in Name field (and ProviderType field, if not
453 // specified) using hash key.
454 *it = InstanceTypeMap(hash)
455 for name, t := range *it {
457 if t.ProviderType == "" {
458 t.ProviderType = name
465 type StringSet map[string]struct{}
467 // UnmarshalJSON handles old config files that provide an array of
468 // instance types instead of a hash.
469 func (ss *StringSet) UnmarshalJSON(data []byte) error {
470 if len(data) > 0 && data[0] == '[' {
472 err := json.Unmarshal(data, &arr)
480 *ss = make(map[string]struct{}, len(arr))
481 for _, t := range arr {
482 (*ss)[t] = struct{}{}
486 var hash map[string]struct{}
487 err := json.Unmarshal(data, &hash)
491 *ss = make(map[string]struct{}, len(hash))
492 for t, _ := range hash {
493 (*ss)[t] = struct{}{}
499 type ServiceName string
502 ServiceNameRailsAPI ServiceName = "arvados-api-server"
503 ServiceNameController ServiceName = "arvados-controller"
504 ServiceNameDispatchCloud ServiceName = "arvados-dispatch-cloud"
505 ServiceNameHealth ServiceName = "arvados-health"
506 ServiceNameNodemanager ServiceName = "arvados-node-manager"
507 ServiceNameWorkbench1 ServiceName = "arvados-workbench1"
508 ServiceNameWorkbench2 ServiceName = "arvados-workbench2"
509 ServiceNameWebsocket ServiceName = "arvados-ws"
510 ServiceNameKeepbalance ServiceName = "keep-balance"
511 ServiceNameKeepweb ServiceName = "keep-web"
512 ServiceNameKeepproxy ServiceName = "keepproxy"
513 ServiceNameKeepstore ServiceName = "keepstore"
516 // Map returns all services as a map, suitable for iterating over all
517 // services or looking up a service by name.
518 func (svcs Services) Map() map[ServiceName]Service {
519 return map[ServiceName]Service{
520 ServiceNameRailsAPI: svcs.RailsAPI,
521 ServiceNameController: svcs.Controller,
522 ServiceNameDispatchCloud: svcs.DispatchCloud,
523 ServiceNameHealth: svcs.Health,
524 ServiceNameNodemanager: svcs.Nodemanager,
525 ServiceNameWorkbench1: svcs.Workbench1,
526 ServiceNameWorkbench2: svcs.Workbench2,
527 ServiceNameWebsocket: svcs.Websocket,
528 ServiceNameKeepbalance: svcs.Keepbalance,
529 ServiceNameKeepweb: svcs.WebDAV,
530 ServiceNameKeepproxy: svcs.Keepproxy,
531 ServiceNameKeepstore: svcs.Keepstore,