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 MaxRequestAmplification int
86 RailsSessionSecretToken string
87 RequestTimeout Duration
89 WebsocketClientEventQueue int
90 WebsocketServerEventQueue int
91 KeepServiceRequestTimeout Duration
96 UnloggedAttributes StringSet
100 BlobSigningKey string
101 BlobSigningTTL Duration
102 CollectionVersioning bool
103 DefaultTrashLifetime Duration
104 DefaultReplication int
105 ManagedProperties map[string]struct {
110 PreserveVersionIfIdle Duration
111 TrashSweepInterval Duration
114 WebDAVCache WebDAVCacheConfig
122 ProviderAppSecret string
126 MailchimpAPIKey string
127 MailchimpListID string
128 SendUserSetupNotificationEmail bool
129 IssueReporterEmailFrom string
130 IssueReporterEmailTo string
131 SupportEmailAddress string
137 MaxRequestLogParamsSize int
145 AnonymousUserToken string
146 AdminNotifierEmailFrom string
147 AutoAdminFirstUser bool
148 AutoAdminUserWithEmail string
149 AutoSetupNewUsers bool
150 AutoSetupNewUsersWithRepository bool
151 AutoSetupNewUsersWithVmUUID string
152 AutoSetupUsernameBlacklist StringSet
153 EmailSubjectPrefix string
154 NewInactiveUserNotificationRecipients StringSet
155 NewUserNotificationRecipients StringSet
156 NewUsersAreActive bool
157 UserNotifierEmailFrom string
158 UserProfileNotificationAddress string
161 ActivationContactLink string
162 APIClientConnectTimeout Duration
163 APIClientReceiveTimeout Duration
164 APIResponseCompression bool
165 ApplicationMimetypesWithViewIcon StringSet
166 ArvadosDocsite string
167 ArvadosPublicDataDocURL string
168 DefaultOpenIdPrefix string
169 EnableGettingStartedPopup bool
170 EnablePublicProjectsPage bool
171 FileViewersConfigURL string
172 LogViewerMaxBytes ByteSize
173 MultiSiteSearch string
174 ProfilingEnabled bool
176 RepositoryCache string
177 RunningJobLogRecordsToFetch int
179 ShowRecentCollectionsOnDashboard bool
180 ShowUserAgreementInline bool
181 ShowUserNotifications bool
184 UserProfileFormFields map[string]struct {
186 FormFieldTitle string
187 FormFieldDescription string
190 Options map[string]struct{}
192 UserProfileFormMessage string
196 EnableBetaController14287 bool
199 type Services struct {
202 DispatchCloud Service
212 WebDAVDownload Service
220 type Service struct {
221 InternalURLs map[URL]ServiceInstance
225 // URL is a url.URL that is also usable as a JSON key/value.
228 // UnmarshalText implements encoding.TextUnmarshaler so URL can be
229 // used as a JSON key/value.
230 func (su *URL) UnmarshalText(text []byte) error {
231 u, err := url.Parse(string(text))
238 func (su URL) MarshalText() ([]byte, error) {
239 return []byte(fmt.Sprintf("%s", (*url.URL)(&su).String())), nil
242 type ServiceInstance struct{}
244 type PostgreSQL struct {
245 Connection PostgreSQLConnection
249 type PostgreSQLConnection map[string]string
251 type RemoteCluster struct {
259 type InstanceType struct {
265 IncludedScratch ByteSize
266 AddedScratch ByteSize
271 type ContainersConfig struct {
272 CloudVMs CloudVMsConfig
273 CrunchRunCommand string
274 CrunchRunArgumentsList []string
275 DefaultKeepCacheRAM ByteSize
276 DispatchPrivateKey string
277 LogReuseDecisions bool
279 MaxDispatchAttempts int
281 MinRetryPeriod Duration
282 ReserveExtraRAM ByteSize
283 StaleLockTimeout Duration
284 SupportedDockerImageFormats StringSet
285 UsePreemptibleInstances bool
289 GitInternalDir string
294 LogSecondsBetweenEvents int
295 LogThrottlePeriod Duration
298 LimitLogBytesPerJob int
299 LogPartialLineThrottlePeriod Duration
300 LogUpdatePeriod Duration
301 LogUpdateSize ByteSize
305 SbatchArgumentsList []string
306 SbatchEnvironmentVariables map[string]string
308 DNSServerConfDir string
309 DNSServerConfTemplate string
310 DNSServerReloadCommand string
311 DNSServerUpdateCommand string
312 ComputeNodeDomain string
313 ComputeNodeNameservers StringSet
314 AssignNodeHostname string
319 type CloudVMsConfig struct {
322 BootProbeCommand string
324 MaxCloudOpsPerSecond int
325 MaxProbesPerSecond int
326 PollInterval Duration
327 ProbeInterval Duration
329 SyncInterval Duration
330 TimeoutBooting Duration
332 TimeoutProbe Duration
333 TimeoutShutdown Duration
334 TimeoutSignal Duration
336 ResourceTags map[string]string
340 DriverParameters json.RawMessage
343 type InstanceTypeMap map[string]InstanceType
345 var errDuplicateInstanceTypeName = errors.New("duplicate instance type name")
347 // UnmarshalJSON handles old config files that provide an array of
348 // instance types instead of a hash.
349 func (it *InstanceTypeMap) UnmarshalJSON(data []byte) error {
350 if len(data) > 0 && data[0] == '[' {
351 var arr []InstanceType
352 err := json.Unmarshal(data, &arr)
360 *it = make(map[string]InstanceType, len(arr))
361 for _, t := range arr {
362 if _, ok := (*it)[t.Name]; ok {
363 return errDuplicateInstanceTypeName
365 if t.ProviderType == "" {
366 t.ProviderType = t.Name
369 t.Scratch = t.IncludedScratch + t.AddedScratch
370 } else if t.AddedScratch == 0 {
371 t.AddedScratch = t.Scratch - t.IncludedScratch
372 } else if t.IncludedScratch == 0 {
373 t.IncludedScratch = t.Scratch - t.AddedScratch
376 if t.Scratch != (t.IncludedScratch + t.AddedScratch) {
377 return fmt.Errorf("%v: Scratch != (IncludedScratch + AddedScratch)", t.Name)
383 var hash map[string]InstanceType
384 err := json.Unmarshal(data, &hash)
388 // Fill in Name field (and ProviderType field, if not
389 // specified) using hash key.
390 *it = InstanceTypeMap(hash)
391 for name, t := range *it {
393 if t.ProviderType == "" {
394 t.ProviderType = name
401 type StringSet map[string]struct{}
403 // UnmarshalJSON handles old config files that provide an array of
404 // instance types instead of a hash.
405 func (ss *StringSet) UnmarshalJSON(data []byte) error {
406 if len(data) > 0 && data[0] == '[' {
408 err := json.Unmarshal(data, &arr)
416 *ss = make(map[string]struct{}, len(arr))
417 for _, t := range arr {
418 (*ss)[t] = struct{}{}
422 var hash map[string]struct{}
423 err := json.Unmarshal(data, &hash)
427 *ss = make(map[string]struct{}, len(hash))
428 for t, _ := range hash {
429 (*ss)[t] = struct{}{}
435 type ServiceName string
438 ServiceNameRailsAPI ServiceName = "arvados-api-server"
439 ServiceNameController ServiceName = "arvados-controller"
440 ServiceNameDispatchCloud ServiceName = "arvados-dispatch-cloud"
441 ServiceNameHealth ServiceName = "arvados-health"
442 ServiceNameNodemanager ServiceName = "arvados-node-manager"
443 ServiceNameWorkbench1 ServiceName = "arvados-workbench1"
444 ServiceNameWorkbench2 ServiceName = "arvados-workbench2"
445 ServiceNameWebsocket ServiceName = "arvados-ws"
446 ServiceNameKeepbalance ServiceName = "keep-balance"
447 ServiceNameKeepweb ServiceName = "keep-web"
448 ServiceNameKeepproxy ServiceName = "keepproxy"
449 ServiceNameKeepstore ServiceName = "keepstore"
452 // Map returns all services as a map, suitable for iterating over all
453 // services or looking up a service by name.
454 func (svcs Services) Map() map[ServiceName]Service {
455 return map[ServiceName]Service{
456 ServiceNameRailsAPI: svcs.RailsAPI,
457 ServiceNameController: svcs.Controller,
458 ServiceNameDispatchCloud: svcs.DispatchCloud,
459 ServiceNameHealth: svcs.Health,
460 ServiceNameNodemanager: svcs.Nodemanager,
461 ServiceNameWorkbench1: svcs.Workbench1,
462 ServiceNameWorkbench2: svcs.Workbench2,
463 ServiceNameWebsocket: svcs.Websocket,
464 ServiceNameKeepbalance: svcs.Keepbalance,
465 ServiceNameKeepweb: svcs.WebDAV,
466 ServiceNameKeepproxy: svcs.Keepproxy,
467 ServiceNameKeepstore: svcs.Keepstore,