1 // Copyright (C) The Arvados Authors. All rights reserved.
3 // SPDX-License-Identifier: Apache-2.0
13 "git.curoverse.com/arvados.git/sdk/go/config"
16 const DefaultConfigFile = "/etc/arvados/config.yml"
19 Clusters map[string]Cluster
22 // GetConfig returns the current system config, loading it from
23 // configFile if needed.
24 func GetConfig(configFile string) (*Config, error) {
26 err := config.LoadFile(&cfg, configFile)
30 // GetCluster returns the cluster ID and config for the given
31 // cluster, or the default/only configured cluster if clusterID is "".
32 func (sc *Config) GetCluster(clusterID string) (*Cluster, error) {
34 if len(sc.Clusters) == 0 {
35 return nil, fmt.Errorf("no clusters configured")
36 } else if len(sc.Clusters) > 1 {
37 return nil, fmt.Errorf("multiple clusters configured, cannot choose")
39 for id, cc := range sc.Clusters {
45 if cc, ok := sc.Clusters[clusterID]; !ok {
46 return nil, fmt.Errorf("cluster %q is not configured", clusterID)
48 cc.ClusterID = clusterID
54 MaxItemsPerResponse int
55 MaxRequestAmplification int
56 RequestTimeout Duration
60 ClusterID string `json:"-"`
61 ManagementToken string
62 SystemRootToken string
64 InstanceTypes InstanceTypeMap
65 Containers ContainersConfig
66 RemoteClusters map[string]RemoteCluster
73 type Services struct {
89 InternalURLs map[URL]ServiceInstance `json:",omitempty"`
93 // URL is a url.URL that is also usable as a JSON key/value.
96 // UnmarshalText implements encoding.TextUnmarshaler so URL can be
97 // used as a JSON key/value.
98 func (su *URL) UnmarshalText(text []byte) error {
99 u, err := url.Parse(string(text))
106 func (su URL) MarshalText() ([]byte, error) {
107 return []byte(fmt.Sprintf("%s", (*url.URL)(&su).String())), nil
110 type ServiceInstance struct{}
112 type SystemLogs struct {
115 MaxRequestLogParamsSize int
118 type PostgreSQL struct {
119 Connection PostgreSQLConnection
123 type PostgreSQLConnection map[string]string
125 type RemoteCluster struct {
126 // API endpoint host or host:port; default is {id}.arvadosapi.com
128 // Perform a proxy request when a local client requests an
129 // object belonging to this remote.
131 // Scheme, default "https". Can be set to "http" for testing.
133 // Disable TLS verify. Can be set to true for testing.
137 type InstanceType struct {
143 IncludedScratch ByteSize
144 AddedScratch ByteSize
149 type ContainersConfig struct {
150 CloudVMs CloudVMsConfig
151 DispatchPrivateKey string
152 StaleLockTimeout Duration
155 type CloudVMsConfig struct {
158 BootProbeCommand string
160 MaxCloudOpsPerSecond int
161 MaxProbesPerSecond int
162 PollInterval Duration
163 ProbeInterval Duration
165 SyncInterval Duration
166 TimeoutBooting Duration
168 TimeoutProbe Duration
169 TimeoutShutdown Duration
170 TimeoutSignal Duration
174 DriverParameters json.RawMessage
177 type InstanceTypeMap map[string]InstanceType
179 var errDuplicateInstanceTypeName = errors.New("duplicate instance type name")
181 // UnmarshalJSON handles old config files that provide an array of
182 // instance types instead of a hash.
183 func (it *InstanceTypeMap) UnmarshalJSON(data []byte) error {
184 if len(data) > 0 && data[0] == '[' {
185 var arr []InstanceType
186 err := json.Unmarshal(data, &arr)
194 *it = make(map[string]InstanceType, len(arr))
195 for _, t := range arr {
196 if _, ok := (*it)[t.Name]; ok {
197 return errDuplicateInstanceTypeName
199 if t.ProviderType == "" {
200 t.ProviderType = t.Name
203 t.Scratch = t.IncludedScratch + t.AddedScratch
204 } else if t.AddedScratch == 0 {
205 t.AddedScratch = t.Scratch - t.IncludedScratch
206 } else if t.IncludedScratch == 0 {
207 t.IncludedScratch = t.Scratch - t.AddedScratch
210 if t.Scratch != (t.IncludedScratch + t.AddedScratch) {
211 return fmt.Errorf("%v: Scratch != (IncludedScratch + AddedScratch)", t.Name)
217 var hash map[string]InstanceType
218 err := json.Unmarshal(data, &hash)
222 // Fill in Name field (and ProviderType field, if not
223 // specified) using hash key.
224 *it = InstanceTypeMap(hash)
225 for name, t := range *it {
227 if t.ProviderType == "" {
228 t.ProviderType = name
235 type ServiceName string
238 ServiceNameRailsAPI ServiceName = "arvados-api-server"
239 ServiceNameController ServiceName = "arvados-controller"
240 ServiceNameDispatchCloud ServiceName = "arvados-dispatch-cloud"
241 ServiceNameHealth ServiceName = "arvados-health"
242 ServiceNameNodemanager ServiceName = "arvados-node-manager"
243 ServiceNameWorkbench1 ServiceName = "arvados-workbench1"
244 ServiceNameWorkbench2 ServiceName = "arvados-workbench2"
245 ServiceNameWebsocket ServiceName = "arvados-ws"
246 ServiceNameKeepbalance ServiceName = "keep-balance"
247 ServiceNameKeepweb ServiceName = "keep-web"
248 ServiceNameKeepproxy ServiceName = "keepproxy"
249 ServiceNameKeepstore ServiceName = "keepstore"
252 // Map returns all services as a map, suitable for iterating over all
253 // services or looking up a service by name.
254 func (svcs Services) Map() map[ServiceName]Service {
255 return map[ServiceName]Service{
256 ServiceNameRailsAPI: svcs.RailsAPI,
257 ServiceNameController: svcs.Controller,
258 ServiceNameDispatchCloud: svcs.DispatchCloud,
259 ServiceNameHealth: svcs.Health,
260 ServiceNameNodemanager: svcs.Nodemanager,
261 ServiceNameWorkbench1: svcs.Workbench1,
262 ServiceNameWorkbench2: svcs.Workbench2,
263 ServiceNameWebsocket: svcs.Websocket,
264 ServiceNameKeepbalance: svcs.Keepbalance,
265 ServiceNameKeepweb: svcs.WebDAV,
266 ServiceNameKeepproxy: svcs.Keepproxy,
267 ServiceNameKeepstore: svcs.Keepstore,