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 cc, ok := sc.Clusters[clusterID]
54 return nil, fmt.Errorf("cluster %q is not configured", clusterID)
56 cc.ClusterID = clusterID
60 type WebDAVCacheConfig struct {
64 MaxCollectionEntries int
65 MaxCollectionBytes int64
70 type UploadDownloadPermission struct {
75 type UploadDownloadRolePermissions struct {
76 User UploadDownloadPermission
77 Admin UploadDownloadPermission
81 ClusterID string `json:"-"`
82 ManagementToken string
83 SystemRootToken string
85 InstanceTypes InstanceTypeMap
86 Containers ContainersConfig
87 RemoteClusters map[string]RemoteCluster
91 AsyncPermissionsUpdateInterval Duration
92 DisabledAPIs StringSet
93 MaxIndexDatabaseRead int
94 MaxItemsPerResponse int
95 MaxConcurrentRequests int
96 MaxKeepBlobBuffers int
97 MaxRequestAmplification int
99 MaxTokenLifetime Duration
100 RequestTimeout Duration
102 WebsocketClientEventQueue int
103 WebsocketServerEventQueue int
104 KeepServiceRequestTimeout Duration
109 UnloggedAttributes StringSet
113 BlobSigningKey string
114 BlobSigningTTL Duration
116 BlobTrashLifetime Duration
117 BlobTrashCheckInterval Duration
118 BlobTrashConcurrency int
119 BlobDeleteConcurrency int
120 BlobReplicateConcurrency int
121 CollectionVersioning bool
122 DefaultTrashLifetime Duration
123 DefaultReplication int
124 ManagedProperties map[string]struct {
129 PreserveVersionIfIdle Duration
130 TrashSweepInterval Duration
132 ForwardSlashNameSubstitution string
135 BlobMissingReport string
136 BalancePeriod Duration
137 BalanceCollectionBatch int
138 BalanceCollectionBuffers int
139 BalanceTimeout Duration
140 BalanceUpdateLimit int
142 WebDAVCache WebDAVCacheConfig
144 KeepproxyPermission UploadDownloadRolePermissions
145 WebDAVPermission UploadDownloadRolePermissions
161 SearchAttribute string
162 SearchBindUser string
163 SearchBindPassword string
166 EmailAttribute string
167 UsernameAttribute string
173 AlternateEmailAddresses bool
174 AuthenticationRequestParameters map[string]string
176 OpenIDConnect struct {
182 EmailVerifiedClaim string
184 AcceptAccessToken bool
185 AcceptAccessTokenScope string
186 AuthenticationRequestParameters map[string]string
191 DefaultEmailDomain string
195 Users map[string]TestUser
198 RemoteTokenRefresh Duration
199 TokenLifetime Duration
200 TrustedClients map[string]struct{}
201 IssueTrustedTokens bool
204 MailchimpAPIKey string
205 MailchimpListID string
206 SendUserSetupNotificationEmail bool
207 IssueReporterEmailFrom string
208 IssueReporterEmailTo string
209 SupportEmailAddress string
215 MaxRequestLogParamsSize int
223 ActivatedUsersAreVisibleToOthers bool
224 AnonymousUserToken string
225 AdminNotifierEmailFrom string
226 AutoAdminFirstUser bool
227 AutoAdminUserWithEmail string
228 AutoSetupNewUsers bool
229 AutoSetupNewUsersWithRepository bool
230 AutoSetupNewUsersWithVmUUID string
231 AutoSetupUsernameBlacklist StringSet
232 EmailSubjectPrefix string
233 NewInactiveUserNotificationRecipients StringSet
234 NewUserNotificationRecipients StringSet
235 NewUsersAreActive bool
236 UserNotifierEmailFrom string
237 UserNotifierEmailBcc StringSet
238 UserProfileNotificationAddress string
239 PreferDomainForUsername string
240 UserSetupMailText string
242 StorageClasses map[string]StorageClassConfig
243 Volumes map[string]Volume
245 ActivationContactLink string
246 APIClientConnectTimeout Duration
247 APIClientReceiveTimeout Duration
248 APIResponseCompression bool
249 ApplicationMimetypesWithViewIcon StringSet
250 ArvadosDocsite string
251 ArvadosPublicDataDocURL string
252 DefaultOpenIdPrefix string
253 EnableGettingStartedPopup bool
254 EnablePublicProjectsPage bool
255 FileViewersConfigURL string
256 LogViewerMaxBytes ByteSize
257 MultiSiteSearch string
258 ProfilingEnabled bool
260 RepositoryCache string
261 RunningJobLogRecordsToFetch int
263 ShowRecentCollectionsOnDashboard bool
264 ShowUserAgreementInline bool
265 ShowUserNotifications bool
268 UserProfileFormFields map[string]struct {
270 FormFieldTitle string
271 FormFieldDescription string
274 Options map[string]struct{}
276 UserProfileFormMessage string
278 WelcomePageHTML string
279 InactivePageHTML string
280 SSHHelpPageHTML string
281 SSHHelpHostSuffix string
286 type StorageClassConfig struct {
292 AccessViaHosts map[URL]VolumeAccess
295 StorageClasses map[string]bool
297 DriverParameters json.RawMessage
300 type S3VolumeDriverParameters struct {
303 SecretAccessKey string
307 LocationConstraint bool
309 UseAWSS3v2Driver bool
311 ConnectTimeout Duration
318 type AzureVolumeDriverParameters struct {
319 StorageAccountName string
320 StorageAccountKey string
321 StorageBaseURL string
323 RequestTimeout Duration
324 ListBlobsRetryDelay Duration
325 ListBlobsMaxAttempts int
328 type DirectoryVolumeDriverParameters struct {
333 type VolumeAccess struct {
337 type Services struct {
340 DispatchCloud Service
349 WebDAVDownload Service
357 type Service struct {
358 InternalURLs map[URL]ServiceInstance
362 type TestUser struct {
367 // URL is a url.URL that is also usable as a JSON key/value.
370 // UnmarshalText implements encoding.TextUnmarshaler so URL can be
371 // used as a JSON key/value.
372 func (su *URL) UnmarshalText(text []byte) error {
373 u, err := url.Parse(string(text))
376 if su.Path == "" && su.Host != "" {
377 // http://example really means http://example/
384 func (su URL) MarshalText() ([]byte, error) {
385 return []byte(fmt.Sprintf("%s", (*url.URL)(&su).String())), nil
388 func (su URL) String() string {
389 return (*url.URL)(&su).String()
392 type ServiceInstance struct {
393 Rendezvous string `json:",omitempty"`
396 type PostgreSQL struct {
397 Connection PostgreSQLConnection
401 type PostgreSQLConnection map[string]string
403 type RemoteCluster struct {
411 type InstanceType struct {
417 IncludedScratch ByteSize
418 AddedScratch ByteSize
423 type ContainersConfig struct {
424 CloudVMs CloudVMsConfig
425 CrunchRunCommand string
426 CrunchRunArgumentsList []string
427 DefaultKeepCacheRAM ByteSize
428 DispatchPrivateKey string
429 LogReuseDecisions bool
431 MaxDispatchAttempts int
433 MinRetryPeriod Duration
434 ReserveExtraRAM ByteSize
435 StaleLockTimeout Duration
436 SupportedDockerImageFormats StringSet
437 UsePreemptibleInstances bool
439 LocalKeepBlobBuffersPerVCPU int
440 LocalKeepLogsToContainerLog string
444 GitInternalDir string
449 LogSecondsBetweenEvents Duration
450 LogThrottlePeriod Duration
453 LimitLogBytesPerJob int
454 LogPartialLineThrottlePeriod Duration
455 LogUpdatePeriod Duration
456 LogUpdateSize ByteSize
464 SbatchArgumentsList []string
465 SbatchEnvironmentVariables map[string]string
467 DNSServerConfDir string
468 DNSServerConfTemplate string
469 DNSServerReloadCommand string
470 DNSServerUpdateCommand string
471 ComputeNodeDomain string
472 ComputeNodeNameservers StringSet
473 AssignNodeHostname string
478 BsubArgumentsList []string
482 type CloudVMsConfig struct {
485 BootProbeCommand string
486 DeployRunnerBinary string
488 MaxCloudOpsPerSecond int
489 MaxProbesPerSecond int
490 MaxConcurrentInstanceCreateOps int
491 PollInterval Duration
492 ProbeInterval Duration
494 SyncInterval Duration
495 TimeoutBooting Duration
497 TimeoutProbe Duration
498 TimeoutShutdown Duration
499 TimeoutSignal Duration
500 TimeoutStaleRunLock Duration
502 ResourceTags map[string]string
506 DriverParameters json.RawMessage
509 type InstanceTypeMap map[string]InstanceType
511 var errDuplicateInstanceTypeName = errors.New("duplicate instance type name")
513 // UnmarshalJSON handles old config files that provide an array of
514 // instance types instead of a hash.
515 func (it *InstanceTypeMap) UnmarshalJSON(data []byte) error {
516 fixup := func(t InstanceType) (InstanceType, error) {
517 if t.ProviderType == "" {
518 t.ProviderType = t.Name
521 t.Scratch = t.IncludedScratch + t.AddedScratch
522 } else if t.AddedScratch == 0 {
523 t.AddedScratch = t.Scratch - t.IncludedScratch
524 } else if t.IncludedScratch == 0 {
525 t.IncludedScratch = t.Scratch - t.AddedScratch
528 if t.Scratch != (t.IncludedScratch + t.AddedScratch) {
529 return t, fmt.Errorf("InstanceType %q: Scratch != (IncludedScratch + AddedScratch)", t.Name)
534 if len(data) > 0 && data[0] == '[' {
535 var arr []InstanceType
536 err := json.Unmarshal(data, &arr)
544 *it = make(map[string]InstanceType, len(arr))
545 for _, t := range arr {
546 if _, ok := (*it)[t.Name]; ok {
547 return errDuplicateInstanceTypeName
557 var hash map[string]InstanceType
558 err := json.Unmarshal(data, &hash)
562 // Fill in Name field (and ProviderType field, if not
563 // specified) using hash key.
564 *it = InstanceTypeMap(hash)
565 for name, t := range *it {
576 type StringSet map[string]struct{}
578 // UnmarshalJSON handles old config files that provide an array of
579 // instance types instead of a hash.
580 func (ss *StringSet) UnmarshalJSON(data []byte) error {
581 if len(data) > 0 && data[0] == '[' {
583 err := json.Unmarshal(data, &arr)
591 *ss = make(map[string]struct{}, len(arr))
592 for _, t := range arr {
593 (*ss)[t] = struct{}{}
597 var hash map[string]struct{}
598 err := json.Unmarshal(data, &hash)
602 *ss = make(map[string]struct{}, len(hash))
603 for t := range hash {
604 (*ss)[t] = struct{}{}
610 type ServiceName string
613 ServiceNameRailsAPI ServiceName = "arvados-api-server"
614 ServiceNameController ServiceName = "arvados-controller"
615 ServiceNameDispatchCloud ServiceName = "arvados-dispatch-cloud"
616 ServiceNameDispatchLSF ServiceName = "arvados-dispatch-lsf"
617 ServiceNameHealth ServiceName = "arvados-health"
618 ServiceNameWorkbench1 ServiceName = "arvados-workbench1"
619 ServiceNameWorkbench2 ServiceName = "arvados-workbench2"
620 ServiceNameWebsocket ServiceName = "arvados-ws"
621 ServiceNameKeepbalance ServiceName = "keep-balance"
622 ServiceNameKeepweb ServiceName = "keep-web"
623 ServiceNameKeepproxy ServiceName = "keepproxy"
624 ServiceNameKeepstore ServiceName = "keepstore"
627 // Map returns all services as a map, suitable for iterating over all
628 // services or looking up a service by name.
629 func (svcs Services) Map() map[ServiceName]Service {
630 return map[ServiceName]Service{
631 ServiceNameRailsAPI: svcs.RailsAPI,
632 ServiceNameController: svcs.Controller,
633 ServiceNameDispatchCloud: svcs.DispatchCloud,
634 ServiceNameDispatchLSF: svcs.DispatchLSF,
635 ServiceNameHealth: svcs.Health,
636 ServiceNameWorkbench1: svcs.Workbench1,
637 ServiceNameWorkbench2: svcs.Workbench2,
638 ServiceNameWebsocket: svcs.Websocket,
639 ServiceNameKeepbalance: svcs.Keepbalance,
640 ServiceNameKeepweb: svcs.WebDAV,
641 ServiceNameKeepproxy: svcs.Keepproxy,
642 ServiceNameKeepstore: svcs.Keepstore,