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
66 MaxPermissionEntries int
71 type UploadDownloadPermission struct {
76 type UploadDownloadRolePermissions struct {
77 User UploadDownloadPermission
78 Admin UploadDownloadPermission
82 ClusterID string `json:"-"`
83 ManagementToken string
84 SystemRootToken string
86 InstanceTypes InstanceTypeMap
87 Containers ContainersConfig
88 RemoteClusters map[string]RemoteCluster
92 AsyncPermissionsUpdateInterval Duration
93 DisabledAPIs StringSet
94 MaxIndexDatabaseRead int
95 MaxItemsPerResponse int
96 MaxConcurrentRequests int
97 MaxKeepBlobBuffers int
98 MaxRequestAmplification int
100 MaxTokenLifetime Duration
101 RequestTimeout Duration
103 WebsocketClientEventQueue int
104 WebsocketServerEventQueue int
105 KeepServiceRequestTimeout Duration
110 UnloggedAttributes StringSet
114 BlobSigningKey string
115 BlobSigningTTL Duration
117 BlobTrashLifetime Duration
118 BlobTrashCheckInterval Duration
119 BlobTrashConcurrency int
120 BlobDeleteConcurrency int
121 BlobReplicateConcurrency int
122 CollectionVersioning bool
123 DefaultTrashLifetime Duration
124 DefaultReplication int
125 ManagedProperties map[string]struct {
130 PreserveVersionIfIdle Duration
131 TrashSweepInterval Duration
133 ForwardSlashNameSubstitution string
136 BlobMissingReport string
137 BalancePeriod Duration
138 BalanceCollectionBatch int
139 BalanceCollectionBuffers int
140 BalanceTimeout Duration
141 BalanceUpdateLimit int
143 WebDAVCache WebDAVCacheConfig
145 KeepproxyPermission UploadDownloadRolePermissions
146 WebDAVPermission UploadDownloadRolePermissions
162 SearchAttribute string
163 SearchBindUser string
164 SearchBindPassword string
167 EmailAttribute string
168 UsernameAttribute string
174 AlternateEmailAddresses bool
175 AuthenticationRequestParameters map[string]string
177 OpenIDConnect struct {
183 EmailVerifiedClaim string
185 AcceptAccessToken bool
186 AcceptAccessTokenScope string
187 AuthenticationRequestParameters map[string]string
192 DefaultEmailDomain string
196 Users map[string]TestUser
199 RemoteTokenRefresh Duration
200 TokenLifetime Duration
201 TrustedClients map[string]struct{}
202 IssueTrustedTokens bool
205 MailchimpAPIKey string
206 MailchimpListID string
207 SendUserSetupNotificationEmail bool
208 IssueReporterEmailFrom string
209 IssueReporterEmailTo string
210 SupportEmailAddress string
216 MaxRequestLogParamsSize int
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 UserProfileNotificationAddress string
238 PreferDomainForUsername string
239 UserSetupMailText string
241 Volumes map[string]Volume
243 ActivationContactLink string
244 APIClientConnectTimeout Duration
245 APIClientReceiveTimeout Duration
246 APIResponseCompression bool
247 ApplicationMimetypesWithViewIcon StringSet
248 ArvadosDocsite string
249 ArvadosPublicDataDocURL string
250 DefaultOpenIdPrefix string
251 EnableGettingStartedPopup bool
252 EnablePublicProjectsPage bool
253 FileViewersConfigURL string
254 LogViewerMaxBytes ByteSize
255 MultiSiteSearch string
256 ProfilingEnabled bool
258 RepositoryCache string
259 RunningJobLogRecordsToFetch int
261 ShowRecentCollectionsOnDashboard bool
262 ShowUserAgreementInline bool
263 ShowUserNotifications bool
266 UserProfileFormFields map[string]struct {
268 FormFieldTitle string
269 FormFieldDescription string
272 Options map[string]struct{}
274 UserProfileFormMessage string
276 WelcomePageHTML string
277 InactivePageHTML string
278 SSHHelpPageHTML string
279 SSHHelpHostSuffix string
285 AccessViaHosts map[URL]VolumeAccess
288 StorageClasses map[string]bool
290 DriverParameters json.RawMessage
293 type S3VolumeDriverParameters struct {
296 SecretAccessKey string
300 LocationConstraint bool
302 UseAWSS3v2Driver bool
304 ConnectTimeout Duration
310 type AzureVolumeDriverParameters struct {
311 StorageAccountName string
312 StorageAccountKey string
313 StorageBaseURL string
315 RequestTimeout Duration
316 ListBlobsRetryDelay Duration
317 ListBlobsMaxAttempts int
320 type DirectoryVolumeDriverParameters struct {
325 type VolumeAccess struct {
329 type Services struct {
332 DispatchCloud Service
340 WebDAVDownload Service
348 type Service struct {
349 InternalURLs map[URL]ServiceInstance
353 type TestUser struct {
358 // URL is a url.URL that is also usable as a JSON key/value.
361 // UnmarshalText implements encoding.TextUnmarshaler so URL can be
362 // used as a JSON key/value.
363 func (su *URL) UnmarshalText(text []byte) error {
364 u, err := url.Parse(string(text))
367 if su.Path == "" && su.Host != "" {
368 // http://example really means http://example/
375 func (su URL) MarshalText() ([]byte, error) {
376 return []byte(fmt.Sprintf("%s", (*url.URL)(&su).String())), nil
379 func (su URL) String() string {
380 return (*url.URL)(&su).String()
383 type ServiceInstance struct {
384 Rendezvous string `json:",omitempty"`
387 type PostgreSQL struct {
388 Connection PostgreSQLConnection
392 type PostgreSQLConnection map[string]string
394 type RemoteCluster struct {
402 type InstanceType struct {
408 IncludedScratch ByteSize
409 AddedScratch ByteSize
414 type ContainersConfig struct {
415 CloudVMs CloudVMsConfig
416 CrunchRunCommand string
417 CrunchRunArgumentsList []string
418 DefaultKeepCacheRAM ByteSize
419 DispatchPrivateKey string
420 LogReuseDecisions bool
422 MaxDispatchAttempts int
424 MinRetryPeriod Duration
425 ReserveExtraRAM ByteSize
426 StaleLockTimeout Duration
427 SupportedDockerImageFormats StringSet
428 UsePreemptibleInstances bool
433 GitInternalDir string
438 LogSecondsBetweenEvents Duration
439 LogThrottlePeriod Duration
442 LimitLogBytesPerJob int
443 LogPartialLineThrottlePeriod Duration
444 LogUpdatePeriod Duration
445 LogUpdateSize ByteSize
453 SbatchArgumentsList []string
454 SbatchEnvironmentVariables map[string]string
456 DNSServerConfDir string
457 DNSServerConfTemplate string
458 DNSServerReloadCommand string
459 DNSServerUpdateCommand string
460 ComputeNodeDomain string
461 ComputeNodeNameservers StringSet
462 AssignNodeHostname string
467 type CloudVMsConfig struct {
470 BootProbeCommand string
471 DeployRunnerBinary string
473 MaxCloudOpsPerSecond int
474 MaxProbesPerSecond int
475 MaxConcurrentInstanceCreateOps int
476 PollInterval Duration
477 ProbeInterval Duration
479 SyncInterval Duration
480 TimeoutBooting Duration
482 TimeoutProbe Duration
483 TimeoutShutdown Duration
484 TimeoutSignal Duration
485 TimeoutStaleRunLock Duration
487 ResourceTags map[string]string
491 DriverParameters json.RawMessage
494 type InstanceTypeMap map[string]InstanceType
496 var errDuplicateInstanceTypeName = errors.New("duplicate instance type name")
498 // UnmarshalJSON handles old config files that provide an array of
499 // instance types instead of a hash.
500 func (it *InstanceTypeMap) UnmarshalJSON(data []byte) error {
501 fixup := func(t InstanceType) (InstanceType, error) {
502 if t.ProviderType == "" {
503 t.ProviderType = t.Name
506 t.Scratch = t.IncludedScratch + t.AddedScratch
507 } else if t.AddedScratch == 0 {
508 t.AddedScratch = t.Scratch - t.IncludedScratch
509 } else if t.IncludedScratch == 0 {
510 t.IncludedScratch = t.Scratch - t.AddedScratch
513 if t.Scratch != (t.IncludedScratch + t.AddedScratch) {
514 return t, fmt.Errorf("InstanceType %q: Scratch != (IncludedScratch + AddedScratch)", t.Name)
519 if len(data) > 0 && data[0] == '[' {
520 var arr []InstanceType
521 err := json.Unmarshal(data, &arr)
529 *it = make(map[string]InstanceType, len(arr))
530 for _, t := range arr {
531 if _, ok := (*it)[t.Name]; ok {
532 return errDuplicateInstanceTypeName
542 var hash map[string]InstanceType
543 err := json.Unmarshal(data, &hash)
547 // Fill in Name field (and ProviderType field, if not
548 // specified) using hash key.
549 *it = InstanceTypeMap(hash)
550 for name, t := range *it {
561 type StringSet map[string]struct{}
563 // UnmarshalJSON handles old config files that provide an array of
564 // instance types instead of a hash.
565 func (ss *StringSet) UnmarshalJSON(data []byte) error {
566 if len(data) > 0 && data[0] == '[' {
568 err := json.Unmarshal(data, &arr)
576 *ss = make(map[string]struct{}, len(arr))
577 for _, t := range arr {
578 (*ss)[t] = struct{}{}
582 var hash map[string]struct{}
583 err := json.Unmarshal(data, &hash)
587 *ss = make(map[string]struct{}, len(hash))
588 for t := range hash {
589 (*ss)[t] = struct{}{}
595 type ServiceName string
598 ServiceNameRailsAPI ServiceName = "arvados-api-server"
599 ServiceNameController ServiceName = "arvados-controller"
600 ServiceNameDispatchCloud ServiceName = "arvados-dispatch-cloud"
601 ServiceNameHealth ServiceName = "arvados-health"
602 ServiceNameWorkbench1 ServiceName = "arvados-workbench1"
603 ServiceNameWorkbench2 ServiceName = "arvados-workbench2"
604 ServiceNameWebsocket ServiceName = "arvados-ws"
605 ServiceNameKeepbalance ServiceName = "keep-balance"
606 ServiceNameKeepweb ServiceName = "keep-web"
607 ServiceNameKeepproxy ServiceName = "keepproxy"
608 ServiceNameKeepstore ServiceName = "keepstore"
611 // Map returns all services as a map, suitable for iterating over all
612 // services or looking up a service by name.
613 func (svcs Services) Map() map[ServiceName]Service {
614 return map[ServiceName]Service{
615 ServiceNameRailsAPI: svcs.RailsAPI,
616 ServiceNameController: svcs.Controller,
617 ServiceNameDispatchCloud: svcs.DispatchCloud,
618 ServiceNameHealth: svcs.Health,
619 ServiceNameWorkbench1: svcs.Workbench1,
620 ServiceNameWorkbench2: svcs.Workbench2,
621 ServiceNameWebsocket: svcs.Websocket,
622 ServiceNameKeepbalance: svcs.Keepbalance,
623 ServiceNameKeepweb: svcs.WebDAV,
624 ServiceNameKeepproxy: svcs.Keepproxy,
625 ServiceNameKeepstore: svcs.Keepstore,