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 AnonymousUserToken string
224 AdminNotifierEmailFrom string
225 AutoAdminFirstUser bool
226 AutoAdminUserWithEmail string
227 AutoSetupNewUsers bool
228 AutoSetupNewUsersWithRepository bool
229 AutoSetupNewUsersWithVmUUID string
230 AutoSetupUsernameBlacklist StringSet
231 EmailSubjectPrefix string
232 NewInactiveUserNotificationRecipients StringSet
233 NewUserNotificationRecipients StringSet
234 NewUsersAreActive bool
235 UserNotifierEmailFrom string
236 UserNotifierEmailBcc StringSet
237 UserProfileNotificationAddress string
238 PreferDomainForUsername string
239 UserSetupMailText string
241 StorageClasses map[string]StorageClassConfig
242 Volumes map[string]Volume
244 ActivationContactLink string
245 APIClientConnectTimeout Duration
246 APIClientReceiveTimeout Duration
247 APIResponseCompression bool
248 ApplicationMimetypesWithViewIcon StringSet
249 ArvadosDocsite string
250 ArvadosPublicDataDocURL string
251 DefaultOpenIdPrefix string
252 EnableGettingStartedPopup bool
253 EnablePublicProjectsPage bool
254 FileViewersConfigURL string
255 LogViewerMaxBytes ByteSize
256 MultiSiteSearch string
257 ProfilingEnabled bool
259 RepositoryCache string
260 RunningJobLogRecordsToFetch int
262 ShowRecentCollectionsOnDashboard bool
263 ShowUserAgreementInline bool
264 ShowUserNotifications bool
267 UserProfileFormFields map[string]struct {
269 FormFieldTitle string
270 FormFieldDescription string
273 Options map[string]struct{}
275 UserProfileFormMessage string
277 WelcomePageHTML string
278 InactivePageHTML string
279 SSHHelpPageHTML string
280 SSHHelpHostSuffix string
285 type StorageClassConfig struct {
291 AccessViaHosts map[URL]VolumeAccess
294 StorageClasses map[string]bool
296 DriverParameters json.RawMessage
299 type S3VolumeDriverParameters struct {
302 SecretAccessKey string
306 LocationConstraint bool
308 UseAWSS3v2Driver bool
310 ConnectTimeout Duration
317 type AzureVolumeDriverParameters struct {
318 StorageAccountName string
319 StorageAccountKey string
320 StorageBaseURL string
322 RequestTimeout Duration
323 ListBlobsRetryDelay Duration
324 ListBlobsMaxAttempts int
327 type DirectoryVolumeDriverParameters struct {
332 type VolumeAccess struct {
336 type Services struct {
339 DispatchCloud Service
348 WebDAVDownload Service
356 type Service struct {
357 InternalURLs map[URL]ServiceInstance
361 type TestUser struct {
366 // URL is a url.URL that is also usable as a JSON key/value.
369 // UnmarshalText implements encoding.TextUnmarshaler so URL can be
370 // used as a JSON key/value.
371 func (su *URL) UnmarshalText(text []byte) error {
372 u, err := url.Parse(string(text))
375 if su.Path == "" && su.Host != "" {
376 // http://example really means http://example/
383 func (su URL) MarshalText() ([]byte, error) {
384 return []byte(fmt.Sprintf("%s", (*url.URL)(&su).String())), nil
387 func (su URL) String() string {
388 return (*url.URL)(&su).String()
391 type ServiceInstance struct {
392 Rendezvous string `json:",omitempty"`
395 type PostgreSQL struct {
396 Connection PostgreSQLConnection
400 type PostgreSQLConnection map[string]string
402 type RemoteCluster struct {
410 type InstanceType struct {
416 IncludedScratch ByteSize
417 AddedScratch ByteSize
422 type ContainersConfig struct {
423 CloudVMs CloudVMsConfig
424 CrunchRunCommand string
425 CrunchRunArgumentsList []string
426 DefaultKeepCacheRAM ByteSize
427 DispatchPrivateKey string
428 LogReuseDecisions bool
430 MaxDispatchAttempts int
432 MinRetryPeriod Duration
433 ReserveExtraRAM ByteSize
434 StaleLockTimeout Duration
435 SupportedDockerImageFormats StringSet
436 UsePreemptibleInstances bool
438 LocalKeepBlobBuffersPerVCPU int
442 GitInternalDir string
447 LogSecondsBetweenEvents Duration
448 LogThrottlePeriod Duration
451 LimitLogBytesPerJob int
452 LogPartialLineThrottlePeriod Duration
453 LogUpdatePeriod Duration
454 LogUpdateSize ByteSize
462 SbatchArgumentsList []string
463 SbatchEnvironmentVariables map[string]string
465 DNSServerConfDir string
466 DNSServerConfTemplate string
467 DNSServerReloadCommand string
468 DNSServerUpdateCommand string
469 ComputeNodeDomain string
470 ComputeNodeNameservers StringSet
471 AssignNodeHostname string
476 BsubArgumentsList []string
480 type CloudVMsConfig struct {
483 BootProbeCommand string
484 DeployRunnerBinary string
486 MaxCloudOpsPerSecond int
487 MaxProbesPerSecond int
488 MaxConcurrentInstanceCreateOps int
489 PollInterval Duration
490 ProbeInterval Duration
492 SyncInterval Duration
493 TimeoutBooting Duration
495 TimeoutProbe Duration
496 TimeoutShutdown Duration
497 TimeoutSignal Duration
498 TimeoutStaleRunLock Duration
500 ResourceTags map[string]string
504 DriverParameters json.RawMessage
507 type InstanceTypeMap map[string]InstanceType
509 var errDuplicateInstanceTypeName = errors.New("duplicate instance type name")
511 // UnmarshalJSON handles old config files that provide an array of
512 // instance types instead of a hash.
513 func (it *InstanceTypeMap) UnmarshalJSON(data []byte) error {
514 fixup := func(t InstanceType) (InstanceType, error) {
515 if t.ProviderType == "" {
516 t.ProviderType = t.Name
519 t.Scratch = t.IncludedScratch + t.AddedScratch
520 } else if t.AddedScratch == 0 {
521 t.AddedScratch = t.Scratch - t.IncludedScratch
522 } else if t.IncludedScratch == 0 {
523 t.IncludedScratch = t.Scratch - t.AddedScratch
526 if t.Scratch != (t.IncludedScratch + t.AddedScratch) {
527 return t, fmt.Errorf("InstanceType %q: Scratch != (IncludedScratch + AddedScratch)", t.Name)
532 if len(data) > 0 && data[0] == '[' {
533 var arr []InstanceType
534 err := json.Unmarshal(data, &arr)
542 *it = make(map[string]InstanceType, len(arr))
543 for _, t := range arr {
544 if _, ok := (*it)[t.Name]; ok {
545 return errDuplicateInstanceTypeName
555 var hash map[string]InstanceType
556 err := json.Unmarshal(data, &hash)
560 // Fill in Name field (and ProviderType field, if not
561 // specified) using hash key.
562 *it = InstanceTypeMap(hash)
563 for name, t := range *it {
574 type StringSet map[string]struct{}
576 // UnmarshalJSON handles old config files that provide an array of
577 // instance types instead of a hash.
578 func (ss *StringSet) UnmarshalJSON(data []byte) error {
579 if len(data) > 0 && data[0] == '[' {
581 err := json.Unmarshal(data, &arr)
589 *ss = make(map[string]struct{}, len(arr))
590 for _, t := range arr {
591 (*ss)[t] = struct{}{}
595 var hash map[string]struct{}
596 err := json.Unmarshal(data, &hash)
600 *ss = make(map[string]struct{}, len(hash))
601 for t := range hash {
602 (*ss)[t] = struct{}{}
608 type ServiceName string
611 ServiceNameRailsAPI ServiceName = "arvados-api-server"
612 ServiceNameController ServiceName = "arvados-controller"
613 ServiceNameDispatchCloud ServiceName = "arvados-dispatch-cloud"
614 ServiceNameDispatchLSF ServiceName = "arvados-dispatch-lsf"
615 ServiceNameHealth ServiceName = "arvados-health"
616 ServiceNameWorkbench1 ServiceName = "arvados-workbench1"
617 ServiceNameWorkbench2 ServiceName = "arvados-workbench2"
618 ServiceNameWebsocket ServiceName = "arvados-ws"
619 ServiceNameKeepbalance ServiceName = "keep-balance"
620 ServiceNameKeepweb ServiceName = "keep-web"
621 ServiceNameKeepproxy ServiceName = "keepproxy"
622 ServiceNameKeepstore ServiceName = "keepstore"
625 // Map returns all services as a map, suitable for iterating over all
626 // services or looking up a service by name.
627 func (svcs Services) Map() map[ServiceName]Service {
628 return map[ServiceName]Service{
629 ServiceNameRailsAPI: svcs.RailsAPI,
630 ServiceNameController: svcs.Controller,
631 ServiceNameDispatchCloud: svcs.DispatchCloud,
632 ServiceNameDispatchLSF: svcs.DispatchLSF,
633 ServiceNameHealth: svcs.Health,
634 ServiceNameWorkbench1: svcs.Workbench1,
635 ServiceNameWorkbench2: svcs.Workbench2,
636 ServiceNameWebsocket: svcs.Websocket,
637 ServiceNameKeepbalance: svcs.Keepbalance,
638 ServiceNameKeepweb: svcs.WebDAV,
639 ServiceNameKeepproxy: svcs.Keepproxy,
640 ServiceNameKeepstore: svcs.Keepstore,