14812: Migrate UserProfileFormFields
[arvados.git] / apps / workbench / config / arvados_config.rb
1 # Copyright (C) The Arvados Authors. All rights reserved.
2 #
3 # SPDX-License-Identifier: AGPL-3.0
4
5 #
6 # Load Arvados configuration from /etc/arvados/config.yml, using defaults
7 # from config.default.yml
8 #
9 # Existing application.yml is migrated into the new config structure.
10 # Keys in the legacy application.yml take precedence.
11 #
12 # Use "bundle exec config:dump" to get the complete active configuration
13 #
14 # Use "bundle exec config:migrate" to migrate application.yml to
15 # config.yml.  After adding the output of config:migrate to
16 # /etc/arvados/config.yml, you will be able to delete application.yml.
17
18 require 'config_loader'
19 require 'config_validators'
20 require 'open3'
21
22 begin
23   # If secret_token.rb exists here, we need to load it first.
24   require_relative 'secret_token.rb'
25 rescue LoadError
26   # Normally secret_token.rb is missing and the secret token is
27   # configured by application.yml (i.e., here!) instead.
28 end
29
30 # Load the defaults, used by config:migrate and fallback loading
31 # legacy application.yml
32 Open3.popen2("arvados-server", "config-defaults") do |stdin, stdout, status_thread|
33   confs = YAML.load(stdout, deserialize_symbols: false)
34   clusterID, clusterConfig = confs["Clusters"].first
35   $arvados_config_defaults = clusterConfig
36   $arvados_config_defaults["ClusterID"] = clusterID
37 end
38
39 # Load the global config file
40 Open3.popen2("arvados-server", "config-dump") do |stdin, stdout, status_thread|
41   confs = YAML.load(stdout, deserialize_symbols: false)
42   if confs && !confs.empty?
43     # config-dump merges defaults with user configuration, so every
44     # key should be set.
45     clusterID, clusterConfig = confs["Clusters"].first
46     $arvados_config_global = clusterConfig
47     $arvados_config_global["ClusterID"] = clusterID
48   else
49     # config-dump failed, assume we will be loading from legacy
50     # application.yml, initialize with defaults.
51     $arvados_config_global = $arvados_config_defaults.deep_dup
52   end
53 end
54
55 # Now make a copy
56 $arvados_config = $arvados_config_global.deep_dup
57
58 # Declare all our configuration items.
59 arvcfg = ConfigLoader.new
60
61 arvcfg.declare_config "ManagementToken", String, :ManagementToken
62 arvcfg.declare_config "TLS.Insecure", Boolean, :arvados_insecure_https
63
64 arvcfg.declare_config "Services.Controller.ExternalURL", URI, :arvados_v1_base, ->(cfg, k, v) {
65   u = URI(v)
66   u.path = ""
67   ConfigLoader.set_cfg cfg, "Services.Controller.ExternalURL", u
68 }
69
70 arvcfg.declare_config "Services.WebShell.ExternalURL", URI, :shell_in_a_box_url, ->(cfg, k, v) {
71   v ||= ""
72   u = URI(v.sub("%{hostname}", "*"))
73   u.path = ""
74   ConfigLoader.set_cfg cfg, "Services.WebShell.ExternalURL", u
75 }
76
77 arvcfg.declare_config "Services.WebDAV.ExternalURL", URI, :keep_web_url, ->(cfg, k, v) {
78   v ||= ""
79   u = URI(v.sub("%{uuid_or_pdh}", "*"))
80   u.path = ""
81   ConfigLoader.set_cfg cfg, "Services.WebDAV.ExternalURL", u
82 }
83
84 arvcfg.declare_config "Services.WebDAVDownload.ExternalURL", URI, :keep_web_download_url, ->(cfg, k, v) {
85   v ||= ""
86   u = URI(v.sub("%{uuid_or_pdh}", "*"))
87   u.path = ""
88   ConfigLoader.set_cfg cfg, "Services.WebDAVDownload.ExternalURL", u
89 }
90
91 arvcfg.declare_config "Services.Composer.ExternalURL", URI, :composer_url
92 arvcfg.declare_config "Services.Workbench2.ExternalURL", URI, :workbench2_url
93
94 arvcfg.declare_config "Users.AnonymousUserToken", String, :anonymous_user_token
95
96 arvcfg.declare_config "Workbench.SecretToken", String, :secret_token
97 arvcfg.declare_config "Workbench.SecretKeyBase", String, :secret_key_base
98
99 arvcfg.declare_config "Workbench.ApplicationMimetypesWithViewIcon", Hash, :application_mimetypes_with_view_icon, ->(cfg, k, v) {
100   mimetypes = {}
101   v.each do |m|
102     mimetypes[m] = {}
103   end
104   ConfigLoader.set_cfg cfg, "Workbench.ApplicationMimetypesWithViewIcon", mimetypes
105 }
106
107 arvcfg.declare_config "Workbench.RunningJobLogRecordsToFetch", Integer, :running_job_log_records_to_fetch
108 arvcfg.declare_config "Workbench.LogViewerMaxBytes", Integer, :log_viewer_max_bytes
109 arvcfg.declare_config "Workbench.TrustAllContent", Boolean, :trust_all_content
110 arvcfg.declare_config "Workbench.UserProfileFormFields", Hash, :user_profile_form_fields, ->(cfg, k, v) {
111   if !v
112     v = []
113   end
114   entries = {}
115   v.each_with_index do |s,i|
116     entries[s["key"]] = {
117       "Type" => s["type"],
118       "FormFieldTitle" => s["form_field_title"],
119       "FormFieldDescription" => s["form_field_description"],
120       "Required" => s["required"],
121       "Position": i
122     }
123     if s["options"]
124       entries[s["key"]]["Options"] = {}
125       s["options"].each do |o|
126         entries[s["key"]]["Options"][o] = {}
127       end
128     end
129   end
130   ConfigLoader.set_cfg cfg, "Workbench.UserProfileFormFields", entries
131 }
132 arvcfg.declare_config "Workbench.UserProfileFormMessage", String, :user_profile_form_message
133 arvcfg.declare_config "Workbench.Theme", String, :arvados_theme
134 arvcfg.declare_config "Workbench.ShowUserNotifications", Boolean, :show_user_notifications
135 arvcfg.declare_config "Workbench.ShowUserAgreementInline", Boolean, :show_user_agreement_inline
136 arvcfg.declare_config "Workbench.RepositoryCache", String, :repository_cache
137 arvcfg.declare_config "Workbench.Repositories", Boolean, :repositories
138 arvcfg.declare_config "Workbench.APIClientConnectTimeout", ActiveSupport::Duration, :api_client_connect_timeout
139 arvcfg.declare_config "Workbench.APIClientReceiveTimeout", ActiveSupport::Duration, :api_client_receive_timeout
140 arvcfg.declare_config "Workbench.APIResponseCompression", Boolean, :api_response_compression
141 arvcfg.declare_config "Workbench.SiteName", String, :site_name
142 arvcfg.declare_config "Workbench.MultiSiteSearch", String, :multi_site_search, ->(cfg, k, v) {
143   if !v
144     v = ""
145   end
146   ConfigLoader.set_cfg cfg, "Workbench.MultiSiteSearch", v.to_s
147 }
148 arvcfg.declare_config "Workbench.EnablePublicProjectsPage", Boolean, :enable_public_projects_page
149 arvcfg.declare_config "Workbench.EnableGettingStartedPopup", Boolean, :enable_getting_started_popup
150 arvcfg.declare_config "Workbench.ArvadosPublicDataDocURL", String, :arvados_public_data_doc_url
151 arvcfg.declare_config "Workbench.ArvadosDocsite", String, :arvados_docsite
152 arvcfg.declare_config "Workbench.ShowRecentCollectionsOnDashboard", Boolean, :show_recent_collections_on_dashboard
153 arvcfg.declare_config "Workbench.ActivationContactLink", String, :activation_contact_link
154 arvcfg.declare_config "Workbench.DefaultOpenIdPrefix", String, :default_openid_prefix
155
156 arvcfg.declare_config "Mail.SendUserSetupNotificationEmail", Boolean, :send_user_setup_notification_email
157 arvcfg.declare_config "Mail.IssueReporterEmailFrom", String, :issue_reporter_email_from
158 arvcfg.declare_config "Mail.IssueReporterEmailTo", String, :issue_reporter_email_to
159 arvcfg.declare_config "Mail.SupportEmailAddress", String, :support_email_address
160 arvcfg.declare_config "Mail.EmailFrom", String, :email_from
161
162 application_config = {}
163 %w(application.default application).each do |cfgfile|
164   path = "#{::Rails.root.to_s}/config/#{cfgfile}.yml"
165   confs = ConfigLoader.load(path, erb: true)
166   # Ignore empty YAML file:
167   next if confs == false
168   application_config.deep_merge!(confs['common'] || {})
169   application_config.deep_merge!(confs[::Rails.env.to_s] || {})
170 end
171
172 $remaining_config = arvcfg.migrate_config(application_config, $arvados_config)
173
174 # Checks for wrongly typed configuration items, coerces properties
175 # into correct types (such as Duration), and optionally raise error
176 # for essential configuration that can't be empty.
177 arvcfg.coercion_and_check $arvados_config_defaults, check_nonempty: false
178 arvcfg.coercion_and_check $arvados_config_global, check_nonempty: false
179 arvcfg.coercion_and_check $arvados_config, check_nonempty: true
180
181 # * $arvados_config_defaults is the defaults
182 # * $arvados_config_global is $arvados_config_defaults merged with the contents of /etc/arvados/config.yml
183 # These are used by the rake config: tasks
184 #
185 # * $arvados_config is $arvados_config_global merged with the migrated contents of application.yml
186 # This is what actually gets copied into the Rails configuration object.
187
188 ArvadosWorkbench::Application.configure do
189   # Copy into the Rails config object.  This also turns Hash into
190   # OrderedOptions so that application code can use
191   # Rails.configuration.API.Blah instead of
192   # Rails.configuration.API["Blah"]
193   ConfigLoader.copy_into_config $arvados_config, config
194   ConfigLoader.copy_into_config $remaining_config, config
195   secrets.secret_key_base = $arvados_config["Workbench"]["SecretKeyBase"]
196   ConfigValidators.validate_wb2_url_config()
197 end