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
211 InactivePageHTML string
214 EnableBetaController14287 bool
218 AccessViaHosts map[URL]VolumeAccess
221 StorageClasses map[string]bool
223 DriverParameters json.RawMessage
226 type S3VolumeDriverParameters struct {
232 LocationConstraint bool
234 ConnectTimeout Duration
240 type AzureVolumeDriverParameters struct {
241 StorageAccountName string
242 StorageAccountKey string
243 StorageBaseURL string
245 RequestTimeout Duration
246 ListBlobsRetryDelay Duration
247 ListBlobsMaxAttempts int
250 type DirectoryVolumeDriverParameters struct {
255 type VolumeAccess struct {
259 type Services struct {
262 DispatchCloud Service
272 WebDAVDownload Service
280 type Service struct {
281 InternalURLs map[URL]ServiceInstance
285 // URL is a url.URL that is also usable as a JSON key/value.
288 // UnmarshalText implements encoding.TextUnmarshaler so URL can be
289 // used as a JSON key/value.
290 func (su *URL) UnmarshalText(text []byte) error {
291 u, err := url.Parse(string(text))
298 func (su URL) MarshalText() ([]byte, error) {
299 return []byte(fmt.Sprintf("%s", (*url.URL)(&su).String())), nil
302 func (su URL) String() string {
303 return (*url.URL)(&su).String()
306 type ServiceInstance struct {
307 Rendezvous string `json:",omitempty"`
310 type PostgreSQL struct {
311 Connection PostgreSQLConnection
315 type PostgreSQLConnection map[string]string
317 type RemoteCluster struct {
325 type InstanceType struct {
331 IncludedScratch ByteSize
332 AddedScratch ByteSize
337 type ContainersConfig struct {
338 CloudVMs CloudVMsConfig
339 CrunchRunCommand string
340 CrunchRunArgumentsList []string
341 DefaultKeepCacheRAM ByteSize
342 DispatchPrivateKey string
343 LogReuseDecisions bool
345 MaxDispatchAttempts int
347 MinRetryPeriod Duration
348 ReserveExtraRAM ByteSize
349 StaleLockTimeout Duration
350 SupportedDockerImageFormats StringSet
351 UsePreemptibleInstances bool
355 GitInternalDir string
360 LogSecondsBetweenEvents int
361 LogThrottlePeriod Duration
364 LimitLogBytesPerJob int
365 LogPartialLineThrottlePeriod Duration
366 LogUpdatePeriod Duration
367 LogUpdateSize ByteSize
371 SbatchArgumentsList []string
372 SbatchEnvironmentVariables map[string]string
374 DNSServerConfDir string
375 DNSServerConfTemplate string
376 DNSServerReloadCommand string
377 DNSServerUpdateCommand string
378 ComputeNodeDomain string
379 ComputeNodeNameservers StringSet
380 AssignNodeHostname string
385 type CloudVMsConfig struct {
388 BootProbeCommand string
390 MaxCloudOpsPerSecond int
391 MaxProbesPerSecond int
392 PollInterval Duration
393 ProbeInterval Duration
395 SyncInterval Duration
396 TimeoutBooting Duration
398 TimeoutProbe Duration
399 TimeoutShutdown Duration
400 TimeoutSignal Duration
402 ResourceTags map[string]string
406 DriverParameters json.RawMessage
409 type InstanceTypeMap map[string]InstanceType
411 var errDuplicateInstanceTypeName = errors.New("duplicate instance type name")
413 // UnmarshalJSON handles old config files that provide an array of
414 // instance types instead of a hash.
415 func (it *InstanceTypeMap) UnmarshalJSON(data []byte) error {
416 if len(data) > 0 && data[0] == '[' {
417 var arr []InstanceType
418 err := json.Unmarshal(data, &arr)
426 *it = make(map[string]InstanceType, len(arr))
427 for _, t := range arr {
428 if _, ok := (*it)[t.Name]; ok {
429 return errDuplicateInstanceTypeName
431 if t.ProviderType == "" {
432 t.ProviderType = t.Name
435 t.Scratch = t.IncludedScratch + t.AddedScratch
436 } else if t.AddedScratch == 0 {
437 t.AddedScratch = t.Scratch - t.IncludedScratch
438 } else if t.IncludedScratch == 0 {
439 t.IncludedScratch = t.Scratch - t.AddedScratch
442 if t.Scratch != (t.IncludedScratch + t.AddedScratch) {
443 return fmt.Errorf("%v: Scratch != (IncludedScratch + AddedScratch)", t.Name)
449 var hash map[string]InstanceType
450 err := json.Unmarshal(data, &hash)
454 // Fill in Name field (and ProviderType field, if not
455 // specified) using hash key.
456 *it = InstanceTypeMap(hash)
457 for name, t := range *it {
459 if t.ProviderType == "" {
460 t.ProviderType = name
467 type StringSet map[string]struct{}
469 // UnmarshalJSON handles old config files that provide an array of
470 // instance types instead of a hash.
471 func (ss *StringSet) UnmarshalJSON(data []byte) error {
472 if len(data) > 0 && data[0] == '[' {
474 err := json.Unmarshal(data, &arr)
482 *ss = make(map[string]struct{}, len(arr))
483 for _, t := range arr {
484 (*ss)[t] = struct{}{}
488 var hash map[string]struct{}
489 err := json.Unmarshal(data, &hash)
493 *ss = make(map[string]struct{}, len(hash))
494 for t, _ := range hash {
495 (*ss)[t] = struct{}{}
501 type ServiceName string
504 ServiceNameRailsAPI ServiceName = "arvados-api-server"
505 ServiceNameController ServiceName = "arvados-controller"
506 ServiceNameDispatchCloud ServiceName = "arvados-dispatch-cloud"
507 ServiceNameHealth ServiceName = "arvados-health"
508 ServiceNameNodemanager ServiceName = "arvados-node-manager"
509 ServiceNameWorkbench1 ServiceName = "arvados-workbench1"
510 ServiceNameWorkbench2 ServiceName = "arvados-workbench2"
511 ServiceNameWebsocket ServiceName = "arvados-ws"
512 ServiceNameKeepbalance ServiceName = "keep-balance"
513 ServiceNameKeepweb ServiceName = "keep-web"
514 ServiceNameKeepproxy ServiceName = "keepproxy"
515 ServiceNameKeepstore ServiceName = "keepstore"
518 // Map returns all services as a map, suitable for iterating over all
519 // services or looking up a service by name.
520 func (svcs Services) Map() map[ServiceName]Service {
521 return map[ServiceName]Service{
522 ServiceNameRailsAPI: svcs.RailsAPI,
523 ServiceNameController: svcs.Controller,
524 ServiceNameDispatchCloud: svcs.DispatchCloud,
525 ServiceNameHealth: svcs.Health,
526 ServiceNameNodemanager: svcs.Nodemanager,
527 ServiceNameWorkbench1: svcs.Workbench1,
528 ServiceNameWorkbench2: svcs.Workbench2,
529 ServiceNameWebsocket: svcs.Websocket,
530 ServiceNameKeepbalance: svcs.Keepbalance,
531 ServiceNameKeepweb: svcs.WebDAV,
532 ServiceNameKeepproxy: svcs.Keepproxy,
533 ServiceNameKeepstore: svcs.Keepstore,