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
210 WelcomePageHTML string
213 EnableBetaController14287 bool
217 AccessViaHosts map[URL]VolumeAccess
220 StorageClasses map[string]bool
222 DriverParameters json.RawMessage
225 type S3VolumeDriverParameters struct {
231 LocationConstraint bool
233 ConnectTimeout Duration
239 type AzureVolumeDriverParameters struct {
240 StorageAccountName string
241 StorageAccountKey string
242 StorageBaseURL string
244 RequestTimeout Duration
245 ListBlobsRetryDelay Duration
246 ListBlobsMaxAttempts int
249 type DirectoryVolumeDriverParameters struct {
254 type VolumeAccess struct {
258 type Services struct {
261 DispatchCloud Service
271 WebDAVDownload Service
279 type Service struct {
280 InternalURLs map[URL]ServiceInstance
284 // URL is a url.URL that is also usable as a JSON key/value.
287 // UnmarshalText implements encoding.TextUnmarshaler so URL can be
288 // used as a JSON key/value.
289 func (su *URL) UnmarshalText(text []byte) error {
290 u, err := url.Parse(string(text))
297 func (su URL) MarshalText() ([]byte, error) {
298 return []byte(fmt.Sprintf("%s", (*url.URL)(&su).String())), nil
301 func (su URL) String() string {
302 return (*url.URL)(&su).String()
305 type ServiceInstance struct {
306 Rendezvous string `json:",omitempty"`
309 type PostgreSQL struct {
310 Connection PostgreSQLConnection
314 type PostgreSQLConnection map[string]string
316 type RemoteCluster struct {
324 type InstanceType struct {
330 IncludedScratch ByteSize
331 AddedScratch ByteSize
336 type ContainersConfig struct {
337 CloudVMs CloudVMsConfig
338 CrunchRunCommand string
339 CrunchRunArgumentsList []string
340 DefaultKeepCacheRAM ByteSize
341 DispatchPrivateKey string
342 LogReuseDecisions bool
344 MaxDispatchAttempts int
346 MinRetryPeriod Duration
347 ReserveExtraRAM ByteSize
348 StaleLockTimeout Duration
349 SupportedDockerImageFormats StringSet
350 UsePreemptibleInstances bool
354 GitInternalDir string
359 LogSecondsBetweenEvents int
360 LogThrottlePeriod Duration
363 LimitLogBytesPerJob int
364 LogPartialLineThrottlePeriod Duration
365 LogUpdatePeriod Duration
366 LogUpdateSize ByteSize
370 SbatchArgumentsList []string
371 SbatchEnvironmentVariables map[string]string
373 DNSServerConfDir string
374 DNSServerConfTemplate string
375 DNSServerReloadCommand string
376 DNSServerUpdateCommand string
377 ComputeNodeDomain string
378 ComputeNodeNameservers StringSet
379 AssignNodeHostname string
384 type CloudVMsConfig struct {
387 BootProbeCommand string
389 MaxCloudOpsPerSecond int
390 MaxProbesPerSecond int
391 PollInterval Duration
392 ProbeInterval Duration
394 SyncInterval Duration
395 TimeoutBooting Duration
397 TimeoutProbe Duration
398 TimeoutShutdown Duration
399 TimeoutSignal Duration
401 ResourceTags map[string]string
405 DriverParameters json.RawMessage
408 type InstanceTypeMap map[string]InstanceType
410 var errDuplicateInstanceTypeName = errors.New("duplicate instance type name")
412 // UnmarshalJSON handles old config files that provide an array of
413 // instance types instead of a hash.
414 func (it *InstanceTypeMap) UnmarshalJSON(data []byte) error {
415 if len(data) > 0 && data[0] == '[' {
416 var arr []InstanceType
417 err := json.Unmarshal(data, &arr)
425 *it = make(map[string]InstanceType, len(arr))
426 for _, t := range arr {
427 if _, ok := (*it)[t.Name]; ok {
428 return errDuplicateInstanceTypeName
430 if t.ProviderType == "" {
431 t.ProviderType = t.Name
434 t.Scratch = t.IncludedScratch + t.AddedScratch
435 } else if t.AddedScratch == 0 {
436 t.AddedScratch = t.Scratch - t.IncludedScratch
437 } else if t.IncludedScratch == 0 {
438 t.IncludedScratch = t.Scratch - t.AddedScratch
441 if t.Scratch != (t.IncludedScratch + t.AddedScratch) {
442 return fmt.Errorf("%v: Scratch != (IncludedScratch + AddedScratch)", t.Name)
448 var hash map[string]InstanceType
449 err := json.Unmarshal(data, &hash)
453 // Fill in Name field (and ProviderType field, if not
454 // specified) using hash key.
455 *it = InstanceTypeMap(hash)
456 for name, t := range *it {
458 if t.ProviderType == "" {
459 t.ProviderType = name
466 type StringSet map[string]struct{}
468 // UnmarshalJSON handles old config files that provide an array of
469 // instance types instead of a hash.
470 func (ss *StringSet) UnmarshalJSON(data []byte) error {
471 if len(data) > 0 && data[0] == '[' {
473 err := json.Unmarshal(data, &arr)
481 *ss = make(map[string]struct{}, len(arr))
482 for _, t := range arr {
483 (*ss)[t] = struct{}{}
487 var hash map[string]struct{}
488 err := json.Unmarshal(data, &hash)
492 *ss = make(map[string]struct{}, len(hash))
493 for t, _ := range hash {
494 (*ss)[t] = struct{}{}
500 type ServiceName string
503 ServiceNameRailsAPI ServiceName = "arvados-api-server"
504 ServiceNameController ServiceName = "arvados-controller"
505 ServiceNameDispatchCloud ServiceName = "arvados-dispatch-cloud"
506 ServiceNameHealth ServiceName = "arvados-health"
507 ServiceNameNodemanager ServiceName = "arvados-node-manager"
508 ServiceNameWorkbench1 ServiceName = "arvados-workbench1"
509 ServiceNameWorkbench2 ServiceName = "arvados-workbench2"
510 ServiceNameWebsocket ServiceName = "arvados-ws"
511 ServiceNameKeepbalance ServiceName = "keep-balance"
512 ServiceNameKeepweb ServiceName = "keep-web"
513 ServiceNameKeepproxy ServiceName = "keepproxy"
514 ServiceNameKeepstore ServiceName = "keepstore"
517 // Map returns all services as a map, suitable for iterating over all
518 // services or looking up a service by name.
519 func (svcs Services) Map() map[ServiceName]Service {
520 return map[ServiceName]Service{
521 ServiceNameRailsAPI: svcs.RailsAPI,
522 ServiceNameController: svcs.Controller,
523 ServiceNameDispatchCloud: svcs.DispatchCloud,
524 ServiceNameHealth: svcs.Health,
525 ServiceNameNodemanager: svcs.Nodemanager,
526 ServiceNameWorkbench1: svcs.Workbench1,
527 ServiceNameWorkbench2: svcs.Workbench2,
528 ServiceNameWebsocket: svcs.Websocket,
529 ServiceNameKeepbalance: svcs.Keepbalance,
530 ServiceNameKeepweb: svcs.WebDAV,
531 ServiceNameKeepproxy: svcs.Keepproxy,
532 ServiceNameKeepstore: svcs.Keepstore,