1 // Copyright (C) The Arvados Authors. All rights reserved.
3 // SPDX-License-Identifier: Apache-2.0
14 "git.arvados.org/arvados.git/sdk/go/config"
17 var DefaultConfigFile = func() string {
18 if path := os.Getenv("ARVADOS_CONFIG"); path != "" {
21 return "/etc/arvados/config.yml"
25 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
71 ClusterID string `json:"-"`
72 ManagementToken string
73 SystemRootToken string
75 InstanceTypes InstanceTypeMap
76 Containers ContainersConfig
77 RemoteClusters map[string]RemoteCluster
81 AsyncPermissionsUpdateInterval Duration
82 DisabledAPIs StringSet
83 MaxIndexDatabaseRead int
84 MaxItemsPerResponse int
85 MaxConcurrentRequests int
86 MaxKeepBlobBuffers int
87 MaxRequestAmplification int
89 RailsSessionSecretToken string
90 RequestTimeout Duration
92 WebsocketClientEventQueue int
93 WebsocketServerEventQueue int
94 KeepServiceRequestTimeout Duration
99 UnloggedAttributes StringSet
103 BlobSigningKey string
104 BlobSigningTTL Duration
106 BlobTrashLifetime Duration
107 BlobTrashCheckInterval Duration
108 BlobTrashConcurrency int
109 BlobDeleteConcurrency int
110 BlobReplicateConcurrency int
111 CollectionVersioning bool
112 DefaultTrashLifetime Duration
113 DefaultReplication int
114 ManagedProperties map[string]struct {
119 PreserveVersionIfIdle Duration
120 TrashSweepInterval Duration
122 ForwardSlashNameSubstitution string
125 BlobMissingReport string
126 BalancePeriod Duration
127 BalanceCollectionBatch int
128 BalanceCollectionBuffers int
129 BalanceTimeout Duration
131 WebDAVCache WebDAVCacheConfig
146 SearchAttribute string
147 SearchBindUser string
148 SearchBindPassword string
151 EmailAttribute string
152 UsernameAttribute string
158 AlternateEmailAddresses bool
160 OpenIDConnect struct {
166 EmailVerifiedClaim string
172 DefaultEmailDomain string
177 ProviderAppSecret string
181 Users map[string]TestUser
184 RemoteTokenRefresh Duration
185 TokenLifetime Duration
188 MailchimpAPIKey string
189 MailchimpListID string
190 SendUserSetupNotificationEmail bool
191 IssueReporterEmailFrom string
192 IssueReporterEmailTo string
193 SupportEmailAddress string
199 MaxRequestLogParamsSize int
207 AnonymousUserToken string
208 AdminNotifierEmailFrom string
209 AutoAdminFirstUser bool
210 AutoAdminUserWithEmail string
211 AutoSetupNewUsers bool
212 AutoSetupNewUsersWithRepository bool
213 AutoSetupNewUsersWithVmUUID string
214 AutoSetupUsernameBlacklist StringSet
215 EmailSubjectPrefix string
216 NewInactiveUserNotificationRecipients StringSet
217 NewUserNotificationRecipients StringSet
218 NewUsersAreActive bool
219 UserNotifierEmailFrom string
220 UserProfileNotificationAddress string
221 PreferDomainForUsername string
223 Volumes map[string]Volume
225 ActivationContactLink string
226 APIClientConnectTimeout Duration
227 APIClientReceiveTimeout Duration
228 APIResponseCompression bool
229 ApplicationMimetypesWithViewIcon StringSet
230 ArvadosDocsite string
231 ArvadosPublicDataDocURL string
232 DefaultOpenIdPrefix string
233 EnableGettingStartedPopup bool
234 EnablePublicProjectsPage bool
235 FileViewersConfigURL string
236 LogViewerMaxBytes ByteSize
237 MultiSiteSearch string
238 ProfilingEnabled bool
240 RepositoryCache string
241 RunningJobLogRecordsToFetch int
243 ShowRecentCollectionsOnDashboard bool
244 ShowUserAgreementInline bool
245 ShowUserNotifications bool
248 UserProfileFormFields map[string]struct {
250 FormFieldTitle string
251 FormFieldDescription string
254 Options map[string]struct{}
256 UserProfileFormMessage string
258 WelcomePageHTML string
259 InactivePageHTML string
260 SSHHelpPageHTML string
261 SSHHelpHostSuffix string
264 ForceLegacyAPI14 bool
268 AccessViaHosts map[URL]VolumeAccess
271 StorageClasses map[string]bool
273 DriverParameters json.RawMessage
276 type S3VolumeDriverParameters struct {
283 LocationConstraint bool
285 UseAWSS3v2Driver bool
287 ConnectTimeout Duration
293 type AzureVolumeDriverParameters struct {
294 StorageAccountName string
295 StorageAccountKey string
296 StorageBaseURL string
298 RequestTimeout Duration
299 ListBlobsRetryDelay Duration
300 ListBlobsMaxAttempts int
303 type DirectoryVolumeDriverParameters struct {
308 type VolumeAccess struct {
312 type Services struct {
315 DispatchCloud Service
324 WebDAVDownload Service
332 type Service struct {
333 InternalURLs map[URL]ServiceInstance
337 type TestUser struct {
342 // URL is a url.URL that is also usable as a JSON key/value.
345 // UnmarshalText implements encoding.TextUnmarshaler so URL can be
346 // used as a JSON key/value.
347 func (su *URL) UnmarshalText(text []byte) error {
348 u, err := url.Parse(string(text))
351 if su.Path == "" && su.Host != "" {
352 // http://example really means http://example/
359 func (su URL) MarshalText() ([]byte, error) {
360 return []byte(fmt.Sprintf("%s", (*url.URL)(&su).String())), nil
363 func (su URL) String() string {
364 return (*url.URL)(&su).String()
367 type ServiceInstance struct {
368 Rendezvous string `json:",omitempty"`
371 type PostgreSQL struct {
372 Connection PostgreSQLConnection
376 type PostgreSQLConnection map[string]string
378 type RemoteCluster struct {
386 type InstanceType struct {
392 IncludedScratch ByteSize
393 AddedScratch ByteSize
398 type ContainersConfig struct {
399 CloudVMs CloudVMsConfig
400 CrunchRunCommand string
401 CrunchRunArgumentsList []string
402 DefaultKeepCacheRAM ByteSize
403 DispatchPrivateKey string
404 LogReuseDecisions bool
406 MaxDispatchAttempts int
408 MinRetryPeriod Duration
409 ReserveExtraRAM ByteSize
410 StaleLockTimeout Duration
411 SupportedDockerImageFormats StringSet
412 UsePreemptibleInstances bool
416 GitInternalDir string
421 LogSecondsBetweenEvents Duration
422 LogThrottlePeriod Duration
425 LimitLogBytesPerJob int
426 LogPartialLineThrottlePeriod Duration
427 LogUpdatePeriod Duration
428 LogUpdateSize ByteSize
432 SbatchArgumentsList []string
433 SbatchEnvironmentVariables map[string]string
435 DNSServerConfDir string
436 DNSServerConfTemplate string
437 DNSServerReloadCommand string
438 DNSServerUpdateCommand string
439 ComputeNodeDomain string
440 ComputeNodeNameservers StringSet
441 AssignNodeHostname string
446 type CloudVMsConfig struct {
449 BootProbeCommand string
450 DeployRunnerBinary string
452 MaxCloudOpsPerSecond int
453 MaxProbesPerSecond int
454 MaxConcurrentInstanceCreateOps int
455 PollInterval Duration
456 ProbeInterval Duration
458 SyncInterval Duration
459 TimeoutBooting Duration
461 TimeoutProbe Duration
462 TimeoutShutdown Duration
463 TimeoutSignal Duration
465 ResourceTags map[string]string
469 DriverParameters json.RawMessage
472 type InstanceTypeMap map[string]InstanceType
474 var errDuplicateInstanceTypeName = errors.New("duplicate instance type name")
476 // UnmarshalJSON handles old config files that provide an array of
477 // instance types instead of a hash.
478 func (it *InstanceTypeMap) UnmarshalJSON(data []byte) error {
479 fixup := func(t InstanceType) (InstanceType, error) {
480 if t.ProviderType == "" {
481 t.ProviderType = t.Name
484 t.Scratch = t.IncludedScratch + t.AddedScratch
485 } else if t.AddedScratch == 0 {
486 t.AddedScratch = t.Scratch - t.IncludedScratch
487 } else if t.IncludedScratch == 0 {
488 t.IncludedScratch = t.Scratch - t.AddedScratch
491 if t.Scratch != (t.IncludedScratch + t.AddedScratch) {
492 return t, fmt.Errorf("InstanceType %q: Scratch != (IncludedScratch + AddedScratch)", t.Name)
497 if len(data) > 0 && data[0] == '[' {
498 var arr []InstanceType
499 err := json.Unmarshal(data, &arr)
507 *it = make(map[string]InstanceType, len(arr))
508 for _, t := range arr {
509 if _, ok := (*it)[t.Name]; ok {
510 return errDuplicateInstanceTypeName
520 var hash map[string]InstanceType
521 err := json.Unmarshal(data, &hash)
525 // Fill in Name field (and ProviderType field, if not
526 // specified) using hash key.
527 *it = InstanceTypeMap(hash)
528 for name, t := range *it {
539 type StringSet map[string]struct{}
541 // UnmarshalJSON handles old config files that provide an array of
542 // instance types instead of a hash.
543 func (ss *StringSet) UnmarshalJSON(data []byte) error {
544 if len(data) > 0 && data[0] == '[' {
546 err := json.Unmarshal(data, &arr)
554 *ss = make(map[string]struct{}, len(arr))
555 for _, t := range arr {
556 (*ss)[t] = struct{}{}
560 var hash map[string]struct{}
561 err := json.Unmarshal(data, &hash)
565 *ss = make(map[string]struct{}, len(hash))
566 for t := range hash {
567 (*ss)[t] = struct{}{}
573 type ServiceName string
576 ServiceNameRailsAPI ServiceName = "arvados-api-server"
577 ServiceNameController ServiceName = "arvados-controller"
578 ServiceNameDispatchCloud ServiceName = "arvados-dispatch-cloud"
579 ServiceNameHealth ServiceName = "arvados-health"
580 ServiceNameWorkbench1 ServiceName = "arvados-workbench1"
581 ServiceNameWorkbench2 ServiceName = "arvados-workbench2"
582 ServiceNameWebsocket ServiceName = "arvados-ws"
583 ServiceNameKeepbalance ServiceName = "keep-balance"
584 ServiceNameKeepweb ServiceName = "keep-web"
585 ServiceNameKeepproxy ServiceName = "keepproxy"
586 ServiceNameKeepstore ServiceName = "keepstore"
589 // Map returns all services as a map, suitable for iterating over all
590 // services or looking up a service by name.
591 func (svcs Services) Map() map[ServiceName]Service {
592 return map[ServiceName]Service{
593 ServiceNameRailsAPI: svcs.RailsAPI,
594 ServiceNameController: svcs.Controller,
595 ServiceNameDispatchCloud: svcs.DispatchCloud,
596 ServiceNameHealth: svcs.Health,
597 ServiceNameWorkbench1: svcs.Workbench1,
598 ServiceNameWorkbench2: svcs.Workbench2,
599 ServiceNameWebsocket: svcs.Websocket,
600 ServiceNameKeepbalance: svcs.Keepbalance,
601 ServiceNameKeepweb: svcs.WebDAV,
602 ServiceNameKeepproxy: svcs.Keepproxy,
603 ServiceNameKeepstore: svcs.Keepstore,