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
80 type ManagedProperties map[string]struct {
87 ClusterID string `json:"-"`
88 ManagementToken string
89 SystemRootToken string
91 InstanceTypes InstanceTypeMap
92 Containers ContainersConfig
93 RemoteClusters map[string]RemoteCluster
97 AsyncPermissionsUpdateInterval Duration
98 DisabledAPIs StringSet
99 MaxIndexDatabaseRead int
100 MaxItemsPerResponse int
101 MaxConcurrentRequests int
102 MaxKeepBlobBuffers int
103 MaxRequestAmplification int
105 MaxTokenLifetime Duration
106 RequestTimeout Duration
108 WebsocketClientEventQueue int
109 WebsocketServerEventQueue int
110 KeepServiceRequestTimeout Duration
111 VocabularyPath string
116 UnloggedAttributes StringSet
120 BlobSigningKey string
121 BlobSigningTTL Duration
123 BlobTrashLifetime Duration
124 BlobTrashCheckInterval Duration
125 BlobTrashConcurrency int
126 BlobDeleteConcurrency int
127 BlobReplicateConcurrency int
128 CollectionVersioning bool
129 DefaultTrashLifetime Duration
130 DefaultReplication int
131 ManagedProperties ManagedProperties
132 PreserveVersionIfIdle Duration
133 TrashSweepInterval Duration
135 ForwardSlashNameSubstitution string
138 BlobMissingReport string
139 BalancePeriod Duration
140 BalanceCollectionBatch int
141 BalanceCollectionBuffers int
142 BalanceTimeout Duration
143 BalanceUpdateLimit int
145 WebDAVCache WebDAVCacheConfig
147 KeepproxyPermission UploadDownloadRolePermissions
148 WebDAVPermission UploadDownloadRolePermissions
164 SearchAttribute string
165 SearchBindUser string
166 SearchBindPassword string
169 EmailAttribute string
170 UsernameAttribute string
176 AlternateEmailAddresses bool
177 AuthenticationRequestParameters map[string]string
179 OpenIDConnect struct {
185 EmailVerifiedClaim string
187 AcceptAccessToken bool
188 AcceptAccessTokenScope string
189 AuthenticationRequestParameters map[string]string
194 DefaultEmailDomain string
198 Users map[string]TestUser
201 RemoteTokenRefresh Duration
202 TokenLifetime Duration
203 TrustedClients map[string]struct{}
204 IssueTrustedTokens bool
207 MailchimpAPIKey string
208 MailchimpListID string
209 SendUserSetupNotificationEmail bool
210 IssueReporterEmailFrom string
211 IssueReporterEmailTo string
212 SupportEmailAddress string
218 MaxRequestLogParamsSize int
226 ActivatedUsersAreVisibleToOthers bool
227 AnonymousUserToken string
228 AdminNotifierEmailFrom string
229 AutoAdminFirstUser bool
230 AutoAdminUserWithEmail string
231 AutoSetupNewUsers bool
232 AutoSetupNewUsersWithRepository bool
233 AutoSetupNewUsersWithVmUUID string
234 AutoSetupUsernameBlacklist StringSet
235 EmailSubjectPrefix string
236 NewInactiveUserNotificationRecipients StringSet
237 NewUserNotificationRecipients StringSet
238 NewUsersAreActive bool
239 UserNotifierEmailFrom string
240 UserNotifierEmailBcc StringSet
241 UserProfileNotificationAddress string
242 PreferDomainForUsername string
243 UserSetupMailText string
245 StorageClasses map[string]StorageClassConfig
246 Volumes map[string]Volume
248 ActivationContactLink string
249 APIClientConnectTimeout Duration
250 APIClientReceiveTimeout Duration
251 APIResponseCompression bool
252 ApplicationMimetypesWithViewIcon StringSet
253 ArvadosDocsite string
254 ArvadosPublicDataDocURL string
255 DefaultOpenIdPrefix string
256 EnableGettingStartedPopup bool
257 EnablePublicProjectsPage bool
258 FileViewersConfigURL string
259 LogViewerMaxBytes ByteSize
260 MultiSiteSearch string
261 ProfilingEnabled bool
263 RepositoryCache string
264 RunningJobLogRecordsToFetch int
266 ShowRecentCollectionsOnDashboard bool
267 ShowUserAgreementInline bool
268 ShowUserNotifications bool
271 UserProfileFormFields map[string]struct {
273 FormFieldTitle string
274 FormFieldDescription string
277 Options map[string]struct{}
279 UserProfileFormMessage string
280 WelcomePageHTML string
281 InactivePageHTML string
282 SSHHelpPageHTML string
283 SSHHelpHostSuffix string
288 type StorageClassConfig struct {
294 AccessViaHosts map[URL]VolumeAccess
297 StorageClasses map[string]bool
299 DriverParameters json.RawMessage
302 type S3VolumeDriverParameters struct {
305 SecretAccessKey string
309 LocationConstraint bool
311 UseAWSS3v2Driver bool
313 ConnectTimeout Duration
320 type AzureVolumeDriverParameters struct {
321 StorageAccountName string
322 StorageAccountKey string
323 StorageBaseURL string
325 RequestTimeout Duration
326 ListBlobsRetryDelay Duration
327 ListBlobsMaxAttempts int
330 type DirectoryVolumeDriverParameters struct {
335 type VolumeAccess struct {
339 type Services struct {
342 DispatchCloud Service
351 WebDAVDownload Service
359 type Service struct {
360 InternalURLs map[URL]ServiceInstance
364 type TestUser struct {
369 // URL is a url.URL that is also usable as a JSON key/value.
372 // UnmarshalText implements encoding.TextUnmarshaler so URL can be
373 // used as a JSON key/value.
374 func (su *URL) UnmarshalText(text []byte) error {
375 u, err := url.Parse(string(text))
378 if su.Path == "" && su.Host != "" {
379 // http://example really means http://example/
386 func (su URL) MarshalText() ([]byte, error) {
387 return []byte(fmt.Sprintf("%s", (*url.URL)(&su).String())), nil
390 func (su URL) String() string {
391 return (*url.URL)(&su).String()
394 type ServiceInstance struct {
395 Rendezvous string `json:",omitempty"`
398 type PostgreSQL struct {
399 Connection PostgreSQLConnection
403 type PostgreSQLConnection map[string]string
405 type RemoteCluster struct {
413 type CUDAFeatures struct {
415 HardwareCapability string
419 type InstanceType struct {
425 IncludedScratch ByteSize
426 AddedScratch ByteSize
432 type ContainersConfig struct {
433 CloudVMs CloudVMsConfig
434 CrunchRunCommand string
435 CrunchRunArgumentsList []string
436 DefaultKeepCacheRAM ByteSize
437 DispatchPrivateKey string
438 LogReuseDecisions bool
440 MaxDispatchAttempts int
442 MinRetryPeriod Duration
443 ReserveExtraRAM ByteSize
444 StaleLockTimeout Duration
445 SupportedDockerImageFormats StringSet
446 UsePreemptibleInstances bool
448 LocalKeepBlobBuffersPerVCPU int
449 LocalKeepLogsToContainerLog string
453 GitInternalDir string
458 LogSecondsBetweenEvents Duration
459 LogThrottlePeriod Duration
462 LimitLogBytesPerJob int
463 LogPartialLineThrottlePeriod Duration
464 LogUpdatePeriod Duration
465 LogUpdateSize ByteSize
473 SbatchArgumentsList []string
474 SbatchEnvironmentVariables map[string]string
476 DNSServerConfDir string
477 DNSServerConfTemplate string
478 DNSServerReloadCommand string
479 DNSServerUpdateCommand string
480 ComputeNodeDomain string
481 ComputeNodeNameservers StringSet
482 AssignNodeHostname string
487 BsubArgumentsList []string
491 type CloudVMsConfig struct {
494 BootProbeCommand string
495 DeployRunnerBinary string
497 MaxCloudOpsPerSecond int
498 MaxProbesPerSecond int
499 MaxConcurrentInstanceCreateOps int
500 PollInterval Duration
501 ProbeInterval Duration
503 SyncInterval Duration
504 TimeoutBooting Duration
506 TimeoutProbe Duration
507 TimeoutShutdown Duration
508 TimeoutSignal Duration
509 TimeoutStaleRunLock Duration
511 ResourceTags map[string]string
515 DriverParameters json.RawMessage
518 type InstanceTypeMap map[string]InstanceType
520 var errDuplicateInstanceTypeName = errors.New("duplicate instance type name")
522 // UnmarshalJSON handles old config files that provide an array of
523 // instance types instead of a hash.
524 func (it *InstanceTypeMap) UnmarshalJSON(data []byte) error {
525 fixup := func(t InstanceType) (InstanceType, error) {
526 if t.ProviderType == "" {
527 t.ProviderType = t.Name
530 t.Scratch = t.IncludedScratch + t.AddedScratch
531 } else if t.AddedScratch == 0 {
532 t.AddedScratch = t.Scratch - t.IncludedScratch
533 } else if t.IncludedScratch == 0 {
534 t.IncludedScratch = t.Scratch - t.AddedScratch
537 if t.Scratch != (t.IncludedScratch + t.AddedScratch) {
538 return t, fmt.Errorf("InstanceType %q: Scratch != (IncludedScratch + AddedScratch)", t.Name)
543 if len(data) > 0 && data[0] == '[' {
544 var arr []InstanceType
545 err := json.Unmarshal(data, &arr)
553 *it = make(map[string]InstanceType, len(arr))
554 for _, t := range arr {
555 if _, ok := (*it)[t.Name]; ok {
556 return errDuplicateInstanceTypeName
566 var hash map[string]InstanceType
567 err := json.Unmarshal(data, &hash)
571 // Fill in Name field (and ProviderType field, if not
572 // specified) using hash key.
573 *it = InstanceTypeMap(hash)
574 for name, t := range *it {
585 type StringSet map[string]struct{}
587 // UnmarshalJSON handles old config files that provide an array of
588 // instance types instead of a hash.
589 func (ss *StringSet) UnmarshalJSON(data []byte) error {
590 if len(data) > 0 && data[0] == '[' {
592 err := json.Unmarshal(data, &arr)
600 *ss = make(map[string]struct{}, len(arr))
601 for _, t := range arr {
602 (*ss)[t] = struct{}{}
606 var hash map[string]struct{}
607 err := json.Unmarshal(data, &hash)
611 *ss = make(map[string]struct{}, len(hash))
612 for t := range hash {
613 (*ss)[t] = struct{}{}
619 type ServiceName string
622 ServiceNameRailsAPI ServiceName = "arvados-api-server"
623 ServiceNameController ServiceName = "arvados-controller"
624 ServiceNameDispatchCloud ServiceName = "arvados-dispatch-cloud"
625 ServiceNameDispatchLSF ServiceName = "arvados-dispatch-lsf"
626 ServiceNameHealth ServiceName = "arvados-health"
627 ServiceNameWorkbench1 ServiceName = "arvados-workbench1"
628 ServiceNameWorkbench2 ServiceName = "arvados-workbench2"
629 ServiceNameWebsocket ServiceName = "arvados-ws"
630 ServiceNameKeepbalance ServiceName = "keep-balance"
631 ServiceNameKeepweb ServiceName = "keep-web"
632 ServiceNameKeepproxy ServiceName = "keepproxy"
633 ServiceNameKeepstore ServiceName = "keepstore"
636 // Map returns all services as a map, suitable for iterating over all
637 // services or looking up a service by name.
638 func (svcs Services) Map() map[ServiceName]Service {
639 return map[ServiceName]Service{
640 ServiceNameRailsAPI: svcs.RailsAPI,
641 ServiceNameController: svcs.Controller,
642 ServiceNameDispatchCloud: svcs.DispatchCloud,
643 ServiceNameDispatchLSF: svcs.DispatchLSF,
644 ServiceNameHealth: svcs.Health,
645 ServiceNameWorkbench1: svcs.Workbench1,
646 ServiceNameWorkbench2: svcs.Workbench2,
647 ServiceNameWebsocket: svcs.Websocket,
648 ServiceNameKeepbalance: svcs.Keepbalance,
649 ServiceNameKeepweb: svcs.WebDAV,
650 ServiceNameKeepproxy: svcs.Keepproxy,
651 ServiceNameKeepstore: svcs.Keepstore,