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
61 ClusterID string `json:"-"`
62 ManagementToken string
63 SystemRootToken string
65 InstanceTypes InstanceTypeMap
66 Containers ContainersConfig
67 RemoteClusters map[string]RemoteCluster
71 AsyncPermissionsUpdateInterval Duration
72 DisabledAPIs StringSet
73 MaxIndexDatabaseRead int
74 MaxItemsPerResponse int
75 MaxRequestAmplification int
77 RailsSessionSecretToken string
78 RequestTimeout Duration
80 WebsocketClientEventQueue int
81 WebsocketServerEventQueue int
86 UnloggedAttributes StringSet
91 BlobSigningTTL Duration
92 CollectionVersioning bool
93 DefaultTrashLifetime Duration
94 DefaultReplication int
95 ManagedProperties map[string]struct {
100 PreserveVersionIfIdle Duration
101 TrashSweepInterval Duration
108 ProviderAppSecret string
112 MailchimpAPIKey string
113 MailchimpListID string
114 SendUserSetupNotificationEmail bool
115 IssueReporterEmailFrom string
116 IssueReporterEmailTo string
117 SupportEmailAddress string
123 MaxRequestLogParamsSize int
131 AnonymousUserToken string
132 AdminNotifierEmailFrom string
133 AutoAdminFirstUser bool
134 AutoAdminUserWithEmail string
135 AutoSetupNewUsers bool
136 AutoSetupNewUsersWithRepository bool
137 AutoSetupNewUsersWithVmUUID string
138 AutoSetupUsernameBlacklist StringSet
139 EmailSubjectPrefix string
140 NewInactiveUserNotificationRecipients StringSet
141 NewUserNotificationRecipients StringSet
142 NewUsersAreActive bool
143 UserNotifierEmailFrom string
144 UserProfileNotificationAddress string
147 ActivationContactLink string
148 APIClientConnectTimeout Duration
149 APIClientReceiveTimeout Duration
150 APIResponseCompression bool
151 ApplicationMimetypesWithViewIcon StringSet
152 ArvadosDocsite string
153 ArvadosPublicDataDocURL string
154 DefaultOpenIdPrefix string
155 EnableGettingStartedPopup bool
156 EnablePublicProjectsPage bool
157 FileViewersConfigURL string
158 LogViewerMaxBytes ByteSize
159 MultiSiteSearch string
160 ProfilingEnabled bool
162 RepositoryCache string
163 RunningJobLogRecordsToFetch int
165 ShowRecentCollectionsOnDashboard bool
166 ShowUserAgreementInline bool
167 ShowUserNotifications bool
170 UserProfileFormFields map[string]struct {
172 FormFieldTitle string
173 FormFieldDescription string
176 Options map[string]struct{}
178 UserProfileFormMessage string
182 EnableBetaController14287 bool
185 type Services struct {
188 DispatchCloud Service
198 WebDAVDownload Service
206 type Service struct {
207 InternalURLs map[URL]ServiceInstance
211 // URL is a url.URL that is also usable as a JSON key/value.
214 // UnmarshalText implements encoding.TextUnmarshaler so URL can be
215 // used as a JSON key/value.
216 func (su *URL) UnmarshalText(text []byte) error {
217 u, err := url.Parse(string(text))
224 func (su URL) MarshalText() ([]byte, error) {
225 return []byte(fmt.Sprintf("%s", (*url.URL)(&su).String())), nil
228 type ServiceInstance struct{}
230 type PostgreSQL struct {
231 Connection PostgreSQLConnection
235 type PostgreSQLConnection map[string]string
237 type RemoteCluster struct {
245 type InstanceType struct {
251 IncludedScratch ByteSize
252 AddedScratch ByteSize
257 type ContainersConfig struct {
258 CloudVMs CloudVMsConfig
259 CrunchRunCommand string
260 CrunchRunArgumentsList []string
261 DefaultKeepCacheRAM ByteSize
262 DispatchPrivateKey string
263 LogReuseDecisions bool
265 MaxDispatchAttempts int
267 MinRetryPeriod Duration
268 ReserveExtraRAM ByteSize
269 StaleLockTimeout Duration
270 SupportedDockerImageFormats StringSet
271 UsePreemptibleInstances bool
275 GitInternalDir string
276 DefaultDockerImage string
277 CrunchJobWrapper string
279 CrunchRefreshTrigger string
280 ReuseJobIfOutputsDiffer bool
285 LogSecondsBetweenEvents int
286 LogThrottlePeriod Duration
289 LimitLogBytesPerJob int
290 LogPartialLineThrottlePeriod Duration
291 LogUpdatePeriod Duration
292 LogUpdateSize ByteSize
296 SbatchArgumentsList []string
297 KeepServices map[string]Service
299 DNSServerConfDir string
300 DNSServerConfTemplate string
301 DNSServerReloadCommand string
302 DNSServerUpdateCommand string
303 ComputeNodeDomain string
304 ComputeNodeNameservers StringSet
305 AssignNodeHostname string
310 type CloudVMsConfig struct {
313 BootProbeCommand string
315 MaxCloudOpsPerSecond int
316 MaxProbesPerSecond int
317 PollInterval Duration
318 ProbeInterval Duration
320 SyncInterval Duration
321 TimeoutBooting Duration
323 TimeoutProbe Duration
324 TimeoutShutdown Duration
325 TimeoutSignal Duration
327 ResourceTags map[string]string
331 DriverParameters json.RawMessage
334 type InstanceTypeMap map[string]InstanceType
336 var errDuplicateInstanceTypeName = errors.New("duplicate instance type name")
338 // UnmarshalJSON handles old config files that provide an array of
339 // instance types instead of a hash.
340 func (it *InstanceTypeMap) UnmarshalJSON(data []byte) error {
341 if len(data) > 0 && data[0] == '[' {
342 var arr []InstanceType
343 err := json.Unmarshal(data, &arr)
351 *it = make(map[string]InstanceType, len(arr))
352 for _, t := range arr {
353 if _, ok := (*it)[t.Name]; ok {
354 return errDuplicateInstanceTypeName
356 if t.ProviderType == "" {
357 t.ProviderType = t.Name
360 t.Scratch = t.IncludedScratch + t.AddedScratch
361 } else if t.AddedScratch == 0 {
362 t.AddedScratch = t.Scratch - t.IncludedScratch
363 } else if t.IncludedScratch == 0 {
364 t.IncludedScratch = t.Scratch - t.AddedScratch
367 if t.Scratch != (t.IncludedScratch + t.AddedScratch) {
368 return fmt.Errorf("%v: Scratch != (IncludedScratch + AddedScratch)", t.Name)
374 var hash map[string]InstanceType
375 err := json.Unmarshal(data, &hash)
379 // Fill in Name field (and ProviderType field, if not
380 // specified) using hash key.
381 *it = InstanceTypeMap(hash)
382 for name, t := range *it {
384 if t.ProviderType == "" {
385 t.ProviderType = name
392 type StringSet map[string]struct{}
394 // UnmarshalJSON handles old config files that provide an array of
395 // instance types instead of a hash.
396 func (ss *StringSet) UnmarshalJSON(data []byte) error {
397 if len(data) > 0 && data[0] == '[' {
399 err := json.Unmarshal(data, &arr)
407 *ss = make(map[string]struct{}, len(arr))
408 for _, t := range arr {
409 (*ss)[t] = struct{}{}
413 var hash map[string]struct{}
414 err := json.Unmarshal(data, &hash)
418 *ss = make(map[string]struct{}, len(hash))
419 for t, _ := range hash {
420 (*ss)[t] = struct{}{}
426 type ServiceName string
429 ServiceNameRailsAPI ServiceName = "arvados-api-server"
430 ServiceNameController ServiceName = "arvados-controller"
431 ServiceNameDispatchCloud ServiceName = "arvados-dispatch-cloud"
432 ServiceNameHealth ServiceName = "arvados-health"
433 ServiceNameNodemanager ServiceName = "arvados-node-manager"
434 ServiceNameWorkbench1 ServiceName = "arvados-workbench1"
435 ServiceNameWorkbench2 ServiceName = "arvados-workbench2"
436 ServiceNameWebsocket ServiceName = "arvados-ws"
437 ServiceNameKeepbalance ServiceName = "keep-balance"
438 ServiceNameKeepweb ServiceName = "keep-web"
439 ServiceNameKeepproxy ServiceName = "keepproxy"
440 ServiceNameKeepstore ServiceName = "keepstore"
443 // Map returns all services as a map, suitable for iterating over all
444 // services or looking up a service by name.
445 func (svcs Services) Map() map[ServiceName]Service {
446 return map[ServiceName]Service{
447 ServiceNameRailsAPI: svcs.RailsAPI,
448 ServiceNameController: svcs.Controller,
449 ServiceNameDispatchCloud: svcs.DispatchCloud,
450 ServiceNameHealth: svcs.Health,
451 ServiceNameNodemanager: svcs.Nodemanager,
452 ServiceNameWorkbench1: svcs.Workbench1,
453 ServiceNameWorkbench2: svcs.Workbench2,
454 ServiceNameWebsocket: svcs.Websocket,
455 ServiceNameKeepbalance: svcs.Keepbalance,
456 ServiceNameKeepweb: svcs.WebDAV,
457 ServiceNameKeepproxy: svcs.Keepproxy,
458 ServiceNameKeepstore: svcs.Keepstore,