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
244 RoleGroupsVisibleToAll bool
246 StorageClasses map[string]StorageClassConfig
247 Volumes map[string]Volume
249 ActivationContactLink string
250 APIClientConnectTimeout Duration
251 APIClientReceiveTimeout Duration
252 APIResponseCompression bool
253 ApplicationMimetypesWithViewIcon StringSet
254 ArvadosDocsite string
255 ArvadosPublicDataDocURL string
256 DefaultOpenIdPrefix string
257 EnableGettingStartedPopup bool
258 EnablePublicProjectsPage bool
259 FileViewersConfigURL string
260 LogViewerMaxBytes ByteSize
261 MultiSiteSearch string
262 ProfilingEnabled bool
264 RepositoryCache string
265 RunningJobLogRecordsToFetch int
267 ShowRecentCollectionsOnDashboard bool
268 ShowUserAgreementInline bool
269 ShowUserNotifications bool
272 UserProfileFormFields map[string]struct {
274 FormFieldTitle string
275 FormFieldDescription string
278 Options map[string]struct{}
280 UserProfileFormMessage string
281 WelcomePageHTML string
282 InactivePageHTML string
283 SSHHelpPageHTML string
284 SSHHelpHostSuffix string
289 type StorageClassConfig struct {
295 AccessViaHosts map[URL]VolumeAccess
298 StorageClasses map[string]bool
300 DriverParameters json.RawMessage
303 type S3VolumeDriverParameters struct {
306 SecretAccessKey string
310 LocationConstraint bool
312 UseAWSS3v2Driver bool
314 ConnectTimeout Duration
321 type AzureVolumeDriverParameters struct {
322 StorageAccountName string
323 StorageAccountKey string
324 StorageBaseURL string
326 RequestTimeout Duration
327 ListBlobsRetryDelay Duration
328 ListBlobsMaxAttempts int
331 type DirectoryVolumeDriverParameters struct {
336 type VolumeAccess struct {
340 type Services struct {
343 DispatchCloud Service
352 WebDAVDownload Service
360 type Service struct {
361 InternalURLs map[URL]ServiceInstance
365 type TestUser struct {
370 // URL is a url.URL that is also usable as a JSON key/value.
373 // UnmarshalText implements encoding.TextUnmarshaler so URL can be
374 // used as a JSON key/value.
375 func (su *URL) UnmarshalText(text []byte) error {
376 u, err := url.Parse(string(text))
379 if su.Path == "" && su.Host != "" {
380 // http://example really means http://example/
387 func (su URL) MarshalText() ([]byte, error) {
388 return []byte(fmt.Sprintf("%s", (*url.URL)(&su).String())), nil
391 func (su URL) String() string {
392 return (*url.URL)(&su).String()
395 type ServiceInstance struct {
396 Rendezvous string `json:",omitempty"`
399 type PostgreSQL struct {
400 Connection PostgreSQLConnection
404 type PostgreSQLConnection map[string]string
406 type RemoteCluster struct {
414 type CUDAFeatures struct {
416 HardwareCapability string
420 type InstanceType struct {
426 IncludedScratch ByteSize
427 AddedScratch ByteSize
433 type ContainersConfig struct {
434 CloudVMs CloudVMsConfig
435 CrunchRunCommand string
436 CrunchRunArgumentsList []string
437 DefaultKeepCacheRAM ByteSize
438 DispatchPrivateKey string
439 LogReuseDecisions bool
441 MaxDispatchAttempts int
443 MinRetryPeriod Duration
444 ReserveExtraRAM ByteSize
445 StaleLockTimeout Duration
446 SupportedDockerImageFormats StringSet
447 AlwaysUsePreemptibleInstances bool
448 PreemptiblePriceFactor float64
450 LocalKeepBlobBuffersPerVCPU int
451 LocalKeepLogsToContainerLog string
455 GitInternalDir string
460 LogSecondsBetweenEvents Duration
461 LogThrottlePeriod Duration
464 LimitLogBytesPerJob int
465 LogPartialLineThrottlePeriod Duration
466 LogUpdatePeriod Duration
467 LogUpdateSize ByteSize
475 SbatchArgumentsList []string
476 SbatchEnvironmentVariables map[string]string
478 DNSServerConfDir string
479 DNSServerConfTemplate string
480 DNSServerReloadCommand string
481 DNSServerUpdateCommand string
482 ComputeNodeDomain string
483 ComputeNodeNameservers StringSet
484 AssignNodeHostname string
489 BsubArgumentsList []string
490 BsubCUDAArguments []string
494 type CloudVMsConfig struct {
497 BootProbeCommand string
498 DeployRunnerBinary string
500 MaxCloudOpsPerSecond int
501 MaxProbesPerSecond int
502 MaxConcurrentInstanceCreateOps int
503 PollInterval Duration
504 ProbeInterval Duration
506 SyncInterval Duration
507 TimeoutBooting Duration
509 TimeoutProbe Duration
510 TimeoutShutdown Duration
511 TimeoutSignal Duration
512 TimeoutStaleRunLock Duration
514 ResourceTags map[string]string
518 DriverParameters json.RawMessage
521 type InstanceTypeMap map[string]InstanceType
523 var errDuplicateInstanceTypeName = errors.New("duplicate instance type name")
525 // UnmarshalJSON handles old config files that provide an array of
526 // instance types instead of a hash.
527 func (it *InstanceTypeMap) UnmarshalJSON(data []byte) error {
528 fixup := func(t InstanceType) (InstanceType, error) {
529 if t.ProviderType == "" {
530 t.ProviderType = t.Name
533 t.Scratch = t.IncludedScratch + t.AddedScratch
534 } else if t.AddedScratch == 0 {
535 t.AddedScratch = t.Scratch - t.IncludedScratch
536 } else if t.IncludedScratch == 0 {
537 t.IncludedScratch = t.Scratch - t.AddedScratch
540 if t.Scratch != (t.IncludedScratch + t.AddedScratch) {
541 return t, fmt.Errorf("InstanceType %q: Scratch != (IncludedScratch + AddedScratch)", t.Name)
546 if len(data) > 0 && data[0] == '[' {
547 var arr []InstanceType
548 err := json.Unmarshal(data, &arr)
556 *it = make(map[string]InstanceType, len(arr))
557 for _, t := range arr {
558 if _, ok := (*it)[t.Name]; ok {
559 return errDuplicateInstanceTypeName
569 var hash map[string]InstanceType
570 err := json.Unmarshal(data, &hash)
574 // Fill in Name field (and ProviderType field, if not
575 // specified) using hash key.
576 *it = InstanceTypeMap(hash)
577 for name, t := range *it {
588 type StringSet map[string]struct{}
590 // UnmarshalJSON handles old config files that provide an array of
591 // instance types instead of a hash.
592 func (ss *StringSet) UnmarshalJSON(data []byte) error {
593 if len(data) > 0 && data[0] == '[' {
595 err := json.Unmarshal(data, &arr)
603 *ss = make(map[string]struct{}, len(arr))
604 for _, t := range arr {
605 (*ss)[t] = struct{}{}
609 var hash map[string]struct{}
610 err := json.Unmarshal(data, &hash)
614 *ss = make(map[string]struct{}, len(hash))
615 for t := range hash {
616 (*ss)[t] = struct{}{}
622 type ServiceName string
625 ServiceNameRailsAPI ServiceName = "arvados-api-server"
626 ServiceNameController ServiceName = "arvados-controller"
627 ServiceNameDispatchCloud ServiceName = "arvados-dispatch-cloud"
628 ServiceNameDispatchLSF ServiceName = "arvados-dispatch-lsf"
629 ServiceNameHealth ServiceName = "arvados-health"
630 ServiceNameWorkbench1 ServiceName = "arvados-workbench1"
631 ServiceNameWorkbench2 ServiceName = "arvados-workbench2"
632 ServiceNameWebsocket ServiceName = "arvados-ws"
633 ServiceNameKeepbalance ServiceName = "keep-balance"
634 ServiceNameKeepweb ServiceName = "keep-web"
635 ServiceNameKeepproxy ServiceName = "keepproxy"
636 ServiceNameKeepstore ServiceName = "keepstore"
639 // Map returns all services as a map, suitable for iterating over all
640 // services or looking up a service by name.
641 func (svcs Services) Map() map[ServiceName]Service {
642 return map[ServiceName]Service{
643 ServiceNameRailsAPI: svcs.RailsAPI,
644 ServiceNameController: svcs.Controller,
645 ServiceNameDispatchCloud: svcs.DispatchCloud,
646 ServiceNameDispatchLSF: svcs.DispatchLSF,
647 ServiceNameHealth: svcs.Health,
648 ServiceNameWorkbench1: svcs.Workbench1,
649 ServiceNameWorkbench2: svcs.Workbench2,
650 ServiceNameWebsocket: svcs.Websocket,
651 ServiceNameKeepbalance: svcs.Keepbalance,
652 ServiceNameKeepweb: svcs.WebDAV,
653 ServiceNameKeepproxy: svcs.Keepproxy,
654 ServiceNameKeepstore: svcs.Keepstore,