openshift-origin-console 1.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (291) hide show
  1. data/COPYRIGHT +1 -0
  2. data/Gemfile +21 -0
  3. data/LICENSE +203 -0
  4. data/README.md +123 -0
  5. data/Rakefile +44 -0
  6. data/app/assets/images/cartridge-edge.gif +0 -0
  7. data/app/assets/images/console/arrow-down.png +0 -0
  8. data/app/assets/images/console/console-sprite.png +0 -0
  9. data/app/assets/images/favicon-32.png +0 -0
  10. data/app/assets/images/loader-dark.gif +0 -0
  11. data/app/assets/images/loader.gif +0 -0
  12. data/app/assets/images/sprite-vert.png +0 -0
  13. data/app/assets/javascripts/console.js +10 -0
  14. data/app/assets/javascripts/console/form.js.coffee +51 -0
  15. data/app/assets/stylesheets/_alerts.scss +84 -0
  16. data/app/assets/stylesheets/_breadcrumbs.scss +31 -0
  17. data/app/assets/stylesheets/_buttons.scss +229 -0
  18. data/app/assets/stylesheets/_code.scss +86 -0
  19. data/app/assets/stylesheets/_custom.scss +207 -0
  20. data/app/assets/stylesheets/_footer.scss +54 -0
  21. data/app/assets/stylesheets/_forms.scss +710 -0
  22. data/app/assets/stylesheets/_grid.scss +28 -0
  23. data/app/assets/stylesheets/_input-prepend-append.scss +138 -0
  24. data/app/assets/stylesheets/_labels.scss +40 -0
  25. data/app/assets/stylesheets/_mixins.scss +76 -0
  26. data/app/assets/stylesheets/_override-variables.scss +1 -0
  27. data/app/assets/stylesheets/_responsive.scss +438 -0
  28. data/app/assets/stylesheets/_ribbon.scss +57 -0
  29. data/app/assets/stylesheets/_type.scss +306 -0
  30. data/app/assets/stylesheets/_utilities.scss +10 -0
  31. data/app/assets/stylesheets/_variables.scss +131 -0
  32. data/app/assets/stylesheets/common.css.scss +82 -0
  33. data/app/assets/stylesheets/console/_application.scss +194 -0
  34. data/app/assets/stylesheets/console/_base.scss +26 -0
  35. data/app/assets/stylesheets/console/_breadcrumbs.scss +32 -0
  36. data/app/assets/stylesheets/console/_buttons.scss +214 -0
  37. data/app/assets/stylesheets/console/_core.scss +1002 -0
  38. data/app/assets/stylesheets/console/_dropdowns.scss +63 -0
  39. data/app/assets/stylesheets/console/_help.scss +54 -0
  40. data/app/assets/stylesheets/console/_mixins.scss +11 -0
  41. data/app/assets/stylesheets/console/_navbar.scss +415 -0
  42. data/app/assets/stylesheets/console/_ribbon.scss +82 -0
  43. data/app/assets/stylesheets/console/_tile.scss +122 -0
  44. data/app/assets/stylesheets/origin.css.scss +37 -0
  45. data/app/controllers/account/dashboard.rb +13 -0
  46. data/app/controllers/account_controller.rb +3 -0
  47. data/app/controllers/application_types_controller.rb +80 -0
  48. data/app/controllers/applications_controller.rb +183 -0
  49. data/app/controllers/building_controller.rb +81 -0
  50. data/app/controllers/capability_aware.rb +18 -0
  51. data/app/controllers/cartridge_types_controller.rb +53 -0
  52. data/app/controllers/cartridges_controller.rb +43 -0
  53. data/app/controllers/console/auth/basic.rb +65 -0
  54. data/app/controllers/console/auth/none.rb +5 -0
  55. data/app/controllers/console/auth/remote_user.rb +69 -0
  56. data/app/controllers/console/rescue.rb +48 -0
  57. data/app/controllers/console_controller.rb +19 -0
  58. data/app/controllers/console_index_controller.rb +14 -0
  59. data/app/controllers/domain_aware.rb +26 -0
  60. data/app/controllers/domain_session_sweeper.rb +29 -0
  61. data/app/controllers/domains_controller.rb +30 -0
  62. data/app/controllers/keys_controller.rb +43 -0
  63. data/app/controllers/scaling_controller.rb +46 -0
  64. data/app/controllers/sshkey_aware.rb +23 -0
  65. data/app/controllers/sshkey_session_sweeper.rb +29 -0
  66. data/app/controllers/user_session_sweeper.rb +29 -0
  67. data/app/helpers/console/community_helper.rb +78 -0
  68. data/app/helpers/console/console_helper.rb +26 -0
  69. data/app/helpers/console/help_helper.rb +270 -0
  70. data/app/helpers/console/html5_boilerplate_helper.rb +63 -0
  71. data/app/helpers/console/layout_helper.rb +277 -0
  72. data/app/helpers/console/model_helper.rb +106 -0
  73. data/app/helpers/console/secured_helper.rb +5 -0
  74. data/app/models/alias.rb +10 -0
  75. data/app/models/application.rb +148 -0
  76. data/app/models/application_associations.rb +36 -0
  77. data/app/models/application_template.rb +90 -0
  78. data/app/models/application_type.rb +258 -0
  79. data/app/models/async_aware.rb +60 -0
  80. data/app/models/capabilities.rb +62 -0
  81. data/app/models/cartridge.rb +122 -0
  82. data/app/models/cartridge_type.rb +140 -0
  83. data/app/models/domain.rb +44 -0
  84. data/app/models/domain_associations.rb +33 -0
  85. data/app/models/embedded.rb +11 -0
  86. data/app/models/gear.rb +13 -0
  87. data/app/models/gear_group.rb +104 -0
  88. data/app/models/key.rb +87 -0
  89. data/app/models/quickstart.rb +135 -0
  90. data/app/models/rest_api.rb +130 -0
  91. data/app/models/rest_api/base.rb +781 -0
  92. data/app/models/rest_api/cacheable.rb +91 -0
  93. data/app/models/rest_api/environment.rb +13 -0
  94. data/app/models/rest_api/info.rb +34 -0
  95. data/app/models/rest_api/log_subscriber.rb +29 -0
  96. data/app/models/rest_api/railties/controller_runtime.rb +37 -0
  97. data/app/models/user.rb +27 -0
  98. data/app/models/user_associations.rb +6 -0
  99. data/app/views/account/_domain.html.haml +14 -0
  100. data/app/views/account/_keys.html.haml +20 -0
  101. data/app/views/account/_user.html.haml +5 -0
  102. data/app/views/account/show.html.haml +15 -0
  103. data/app/views/application_templates/_application_template.html.haml +5 -0
  104. data/app/views/application_types/_application_type.html.haml +19 -0
  105. data/app/views/application_types/_custom.html.haml +19 -0
  106. data/app/views/application_types/_persisted.html.haml +26 -0
  107. data/app/views/application_types/_tile.html.haml +9 -0
  108. data/app/views/application_types/index.html.haml +87 -0
  109. data/app/views/application_types/search.html.haml +67 -0
  110. data/app/views/application_types/show.html.haml +219 -0
  111. data/app/views/applications/_application.html.haml +34 -0
  112. data/app/views/applications/_applications_filter.html.haml +8 -0
  113. data/app/views/applications/_footer.html.haml +0 -0
  114. data/app/views/applications/_name.html.haml +28 -0
  115. data/app/views/applications/delete.html.haml +19 -0
  116. data/app/views/applications/get_started.html.haml +145 -0
  117. data/app/views/applications/index.html.haml +55 -0
  118. data/app/views/applications/show.html.haml +193 -0
  119. data/app/views/building/delete.html.haml +22 -0
  120. data/app/views/building/new.html.haml +57 -0
  121. data/app/views/building/show.html.haml +12 -0
  122. data/app/views/cartridge_types/_cartridge_type.html.haml +61 -0
  123. data/app/views/cartridge_types/index.html.haml +37 -0
  124. data/app/views/cartridge_types/show.html.haml +21 -0
  125. data/app/views/cartridges/next_steps.html.haml +58 -0
  126. data/app/views/cartridges/show.html.haml +1 -0
  127. data/app/views/console/error.html.haml +58 -0
  128. data/app/views/console/help.html.haml +90 -0
  129. data/app/views/console/not_found.html.haml +69 -0
  130. data/app/views/console/unauthorized.html.haml +7 -0
  131. data/app/views/domains/_domain.html.haml +14 -0
  132. data/app/views/domains/_form.html.haml +13 -0
  133. data/app/views/domains/edit.html.haml +5 -0
  134. data/app/views/domains/new.html.haml +6 -0
  135. data/app/views/keys/_form.html.haml +14 -0
  136. data/app/views/keys/_simple_form.html.haml +14 -0
  137. data/app/views/keys/new.html.haml +2 -0
  138. data/app/views/layouts/_footer.html.haml +38 -0
  139. data/app/views/layouts/_head.html.haml +35 -0
  140. data/app/views/layouts/console.html.haml +60 -0
  141. data/app/views/layouts/console/_header.html.haml +44 -0
  142. data/app/views/layouts/console/_identity.html.haml +7 -0
  143. data/app/views/layouts/console/_javascripts.html.haml +5 -0
  144. data/app/views/layouts/console/_stylesheets.html.haml +6 -0
  145. data/app/views/scaling/delete.html.haml +17 -0
  146. data/app/views/scaling/new.html.haml +24 -0
  147. data/app/views/scaling/show.html.haml +81 -0
  148. data/app/views/shared/_tracking.html.haml +0 -0
  149. data/conf/console.conf.example +108 -0
  150. data/conf/openshift_console.conf +10 -0
  151. data/config/cartridge_types.yml +54 -0
  152. data/config/initializers/barista_config.rb +86 -0
  153. data/config/initializers/cartridge_types.rb +5 -0
  154. data/config/initializers/console_security.rb +1 -0
  155. data/config/initializers/date_helper.rb +5 -0
  156. data/config/initializers/extended_logger.rb +51 -0
  157. data/config/initializers/formtastic.rb +100 -0
  158. data/config/initializers/inflections.rb +38 -0
  159. data/config/initializers/rdiscount.rb +8 -0
  160. data/config/initializers/rest_api.rb +22 -0
  161. data/config/initializers/sass.rb +30 -0
  162. data/config/initializers/session_trace.rb +32 -0
  163. data/config/initializers/x_frame_options.rb +53 -0
  164. data/config/locales/en.yml +12 -0
  165. data/lib/active_resource/associations.rb +107 -0
  166. data/lib/active_resource/associations/builder/association.rb +35 -0
  167. data/lib/active_resource/associations/builder/belongs_to.rb +5 -0
  168. data/lib/active_resource/associations/builder/has_many.rb +5 -0
  169. data/lib/active_resource/associations/builder/has_one.rb +5 -0
  170. data/lib/active_resource/persistent_connection.rb +341 -0
  171. data/lib/active_resource/persistent_http_mock.rb +68 -0
  172. data/lib/active_resource/reflection.rb +78 -0
  173. data/lib/console.rb +8 -0
  174. data/lib/console/config_file.rb +13 -0
  175. data/lib/console/configuration.rb +163 -0
  176. data/lib/console/engine.rb +28 -0
  177. data/lib/console/formtastic/bootstrap_form_builder.rb +369 -0
  178. data/lib/console/rails/app_redirector.rb +40 -0
  179. data/lib/console/rails/filter_hash.rb +15 -0
  180. data/lib/console/rails/routes.rb +51 -0
  181. data/lib/console/version.rb +5 -0
  182. data/lib/tasks/assets.rake +79 -0
  183. data/lib/tasks/stats.rake +18 -0
  184. data/lib/tasks/test_suites.rake +73 -0
  185. data/test/coverage_helper.rb +27 -0
  186. data/test/fixtures/cartridges.json +1 -0
  187. data/test/fixtures/quickstarts.csv +3 -0
  188. data/test/functional/account_controller_test.rb +14 -0
  189. data/test/functional/application_types_controller_test.rb +251 -0
  190. data/test/functional/applications_controller_sanity_test.rb +26 -0
  191. data/test/functional/applications_controller_test.rb +365 -0
  192. data/test/functional/building_controller_test.rb +203 -0
  193. data/test/functional/cartridge_types_controller_isolation_test.rb +68 -0
  194. data/test/functional/cartridge_types_controller_test.rb +48 -0
  195. data/test/functional/cartridges_controller_test.rb +83 -0
  196. data/test/functional/console_auth_basic_controller_test.rb +82 -0
  197. data/test/functional/console_auth_remote_user_controller_test.rb +90 -0
  198. data/test/functional/console_index_controller_test.rb +22 -0
  199. data/test/functional/domains_controller_test.rb +194 -0
  200. data/test/functional/keys_controller_test.rb +163 -0
  201. data/test/functional/quickstarts.json +18 -0
  202. data/test/functional/scaling_controller_test.rb +153 -0
  203. data/test/integration/assets_test.rb +34 -0
  204. data/test/integration/help_link_test.rb +43 -0
  205. data/test/integration/quickstarts_test.rb +24 -0
  206. data/test/integration/rescue_from_test.rb +25 -0
  207. data/test/integration/rest_api/application_test.rb +115 -0
  208. data/test/integration/rest_api/cartridge_test.rb +44 -0
  209. data/test/integration/rest_api/cartridge_type_test.rb +143 -0
  210. data/test/integration/rest_api/domain_test.rb +91 -0
  211. data/test/integration/rest_api/info_test.rb +9 -0
  212. data/test/integration/rest_api/key_test.rb +85 -0
  213. data/test/integration/static_pages_test.rb +44 -0
  214. data/test/rails_app/Rakefile +7 -0
  215. data/test/rails_app/app/controllers/application_controller.rb +5 -0
  216. data/test/rails_app/config.ru +4 -0
  217. data/test/rails_app/config/application.rb +48 -0
  218. data/test/rails_app/config/boot.rb +10 -0
  219. data/test/rails_app/config/database.yml +25 -0
  220. data/test/rails_app/config/environment.rb +5 -0
  221. data/test/rails_app/config/environments/development.rb +38 -0
  222. data/test/rails_app/config/environments/production.rb +70 -0
  223. data/test/rails_app/config/environments/test.rb +43 -0
  224. data/test/rails_app/config/initializers/auth.rb +0 -0
  225. data/test/rails_app/config/initializers/backtrace_silencers.rb +7 -0
  226. data/test/rails_app/config/initializers/inflections.rb +10 -0
  227. data/test/rails_app/config/initializers/mime_types.rb +5 -0
  228. data/test/rails_app/config/initializers/secret_token.rb +7 -0
  229. data/test/rails_app/config/initializers/session_store.rb +8 -0
  230. data/test/rails_app/config/locales/en.yml +5 -0
  231. data/test/rails_app/config/routes.rb +4 -0
  232. data/test/rails_app/script/rails +6 -0
  233. data/test/support/auth.rb +111 -0
  234. data/test/support/base.rb +142 -0
  235. data/test/support/errors.rb +28 -0
  236. data/test/support/rest_api.rb +189 -0
  237. data/test/test_helper.rb +14 -0
  238. data/test/unit/active_model_compliance_test.rb +23 -0
  239. data/test/unit/async_aware_test.rb +55 -0
  240. data/test/unit/configuration_test.rb +158 -0
  241. data/test/unit/filter_hash_test.rb +64 -0
  242. data/test/unit/helpers/model_helper_test.rb +61 -0
  243. data/test/unit/overrides_test.rb +9 -0
  244. data/test/unit/rest_api_test.rb +1590 -0
  245. data/vendor/assets/javascripts/MIT-LICENSE.txt +20 -0
  246. data/vendor/assets/javascripts/bootstrap-collapse.js +157 -0
  247. data/vendor/assets/javascripts/bootstrap-dropdown.js +100 -0
  248. data/vendor/assets/javascripts/bootstrap-tab.js +135 -0
  249. data/vendor/assets/javascripts/bootstrap-transition.js +61 -0
  250. data/vendor/assets/javascripts/jquery.spin.js +47 -0
  251. data/vendor/assets/javascripts/jquery.ui.widget.js +16 -0
  252. data/vendor/assets/javascripts/jquery_cookie.js +41 -0
  253. data/vendor/assets/javascripts/jquery_validate_min.js +51 -0
  254. data/vendor/assets/javascripts/modernizr.min.js +2 -0
  255. data/vendor/assets/javascripts/plugins.js +16 -0
  256. data/vendor/assets/stylesheets/bootstrap/_accordion.scss +28 -0
  257. data/vendor/assets/stylesheets/bootstrap/_alerts.scss +70 -0
  258. data/vendor/assets/stylesheets/bootstrap/_breadcrumbs.scss +22 -0
  259. data/vendor/assets/stylesheets/bootstrap/_button-groups.scss +147 -0
  260. data/vendor/assets/stylesheets/bootstrap/_buttons.scss +183 -0
  261. data/vendor/assets/stylesheets/bootstrap/_carousel.scss +121 -0
  262. data/vendor/assets/stylesheets/bootstrap/_close.scss +18 -0
  263. data/vendor/assets/stylesheets/bootstrap/_code.scss +57 -0
  264. data/vendor/assets/stylesheets/bootstrap/_component-animations.scss +18 -0
  265. data/vendor/assets/stylesheets/bootstrap/_dropdowns.scss +130 -0
  266. data/vendor/assets/stylesheets/bootstrap/_forms.scss +522 -0
  267. data/vendor/assets/stylesheets/bootstrap/_grid.scss +8 -0
  268. data/vendor/assets/stylesheets/bootstrap/_hero-unit.scss +20 -0
  269. data/vendor/assets/stylesheets/bootstrap/_labels.scss +32 -0
  270. data/vendor/assets/stylesheets/bootstrap/_layouts.scss +17 -0
  271. data/vendor/assets/stylesheets/bootstrap/_mixins.scss +602 -0
  272. data/vendor/assets/stylesheets/bootstrap/_modals.scss +84 -0
  273. data/vendor/assets/stylesheets/bootstrap/_navbar.scss +299 -0
  274. data/vendor/assets/stylesheets/bootstrap/_navs.scss +353 -0
  275. data/vendor/assets/stylesheets/bootstrap/_pager.scss +30 -0
  276. data/vendor/assets/stylesheets/bootstrap/_pagination.scss +55 -0
  277. data/vendor/assets/stylesheets/bootstrap/_popovers.scss +49 -0
  278. data/vendor/assets/stylesheets/bootstrap/_progress-bars.scss +95 -0
  279. data/vendor/assets/stylesheets/bootstrap/_reset.scss +126 -0
  280. data/vendor/assets/stylesheets/bootstrap/_scaffolding.scss +33 -0
  281. data/vendor/assets/stylesheets/bootstrap/_sprites.scss +158 -0
  282. data/vendor/assets/stylesheets/bootstrap/_tables.scss +150 -0
  283. data/vendor/assets/stylesheets/bootstrap/_thumbnails.scss +35 -0
  284. data/vendor/assets/stylesheets/bootstrap/_tooltip.scss +35 -0
  285. data/vendor/assets/stylesheets/bootstrap/_type.scss +218 -0
  286. data/vendor/assets/stylesheets/bootstrap/_utilities.scss +23 -0
  287. data/vendor/assets/stylesheets/bootstrap/_variables.scss +107 -0
  288. data/vendor/assets/stylesheets/bootstrap/_wells.scss +17 -0
  289. data/vendor/assets/stylesheets/bootstrap/bootstrap.scss +66 -0
  290. data/vendor/assets/stylesheets/bootstrap/responsive.scss +334 -0
  291. metadata +506 -0
@@ -0,0 +1,60 @@
1
+ #
2
+ # Prototype support for simple parallel requests. It is the callers
3
+ # responsibility to ensure that blocks are side-effect free.
4
+ #
5
+ module AsyncAware
6
+ extend ActiveSupport::Concern
7
+
8
+ def async(&block)
9
+ (@threads ||= []) << Thread.start do
10
+ begin
11
+ Thread.current[:out] = yield block
12
+ rescue => e
13
+ Thread.current[:out] = e
14
+ end
15
+ end
16
+ end
17
+ def join(limit=nil)
18
+ running = @threads
19
+ t1 = Time.now.to_i
20
+
21
+ threads = begin
22
+ @threads.map{ |t| limit ? t.join(limit) : t.join }
23
+ ensure
24
+ @threads.each(&:kill)
25
+ @threads = nil
26
+ end
27
+
28
+ #puts "**** Joined #{Time.now.to_i - t1} (limit=#{limit})"
29
+ #puts running.map{ |t| " #{t.inspect}: #{threads.include?(t) ? "" : "(did not finish) "}#{t[:out].inspect}" }.join("\n")
30
+
31
+ running.map do |t|
32
+ if threads.include?(t)
33
+ t[:out]
34
+ else
35
+ begin; raise(ThreadTimedOut.new(t, limit)); rescue => e; e; end
36
+ end
37
+ end
38
+ end
39
+
40
+ #
41
+ # Throw the first exception encountered
42
+ #
43
+ def join!(limit=nil)
44
+ join(limit).tap do |results|
45
+ exceptions = results.select{ |r| r.is_a? StandardError }
46
+ exceptions[1..-1].each{ |e| Rails.logger.error "#{e.class} (#{e})\n #{Rails.backtrace_cleaner.clean(e.backtrace).join("\n ")}" } if exceptions.size > 1
47
+ raise exceptions.first unless exceptions.empty?
48
+ end
49
+ end
50
+
51
+ class ThreadTimedOut < StandardError
52
+ attr_reader :thread
53
+ def initialize(thread, timeout)
54
+ @thread, @timeout = thread, timeout
55
+ end
56
+ def to_s
57
+ "The thread #{thread.inspect} did not complete within #{@timeout} seconds."
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,62 @@
1
+ module Capabilities
2
+ extend ActiveSupport::Concern
3
+
4
+ included do
5
+ has_one :capabilities, :class_name => 'rest_api/base/attribute_hash'
6
+ include Helpers
7
+ end
8
+
9
+ def gear_sizes
10
+ @gear_sizes ||= capabilities[:gear_sizes].map(&:to_sym)
11
+ end
12
+
13
+ def to_capabilities
14
+ Capabilities::Cacheable.from(self)
15
+ end
16
+
17
+ module Helpers
18
+ def gears_free?
19
+ gears_free > 0
20
+ end
21
+
22
+ def gears_free
23
+ [max_gears - consumed_gears, 0].max
24
+ end
25
+ end
26
+
27
+ class Cacheable
28
+ include Helpers
29
+
30
+ # Changing this order will break serialization of cached data
31
+ ATTRS = [:max_gears, :consumed_gears, :gear_sizes].each{ |s| attr_reader s }
32
+
33
+ def initialize(*args)
34
+ arg = args.each
35
+ ATTRS.each{ |t| send("#{t}=", arg.next) }
36
+ rescue StopIteration
37
+ end
38
+
39
+ def self.from(obj)
40
+ new(*(obj.is_a?(Array) ? obj : ATTRS.map{ |s| obj.send(s) })) if obj
41
+ end
42
+
43
+ def to_capabilities
44
+ self
45
+ end
46
+
47
+ def to_a
48
+ ATTRS.map{ |s| send(s) }
49
+ end
50
+
51
+ private
52
+ def max_gears=(i)
53
+ @max_gears = Integer(i)
54
+ end
55
+ def consumed_gears=(i)
56
+ @consumed_gears = Integer(i)
57
+ end
58
+ def gear_sizes=(arr)
59
+ @gear_sizes = Array(arr)
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,122 @@
1
+ #
2
+ # The REST API model object representing a cartridge instance.
3
+ #
4
+ class Cartridge < RestApi::Base
5
+ include Comparable
6
+
7
+ #use_patch_on_update
8
+
9
+ schema do
10
+ string :name, 'type'
11
+ integer :supported_scales_from, :supported_scales_to
12
+ integer :scales_from, :scales_to, :current_scale
13
+ string :scales_with
14
+ string :gear_profile
15
+ end
16
+ custom_id :name
17
+
18
+ attr_accessor :git_url, :ssh_url, :ssh_string
19
+ attr_reader :gears
20
+
21
+ belongs_to :application
22
+ has_one :cartridge_type
23
+ has_many :collocated_with, :class_name => 'string'
24
+ has_many :properties, :class_name => 'rest_api/base/attribute_hash'
25
+ has_one :help_topics, :class_name => 'rest_api/base/attribute_hash'
26
+
27
+ delegate :display_name, :tags, :priority, :to => :cartridge_type, :allow_nil => false
28
+
29
+ def collocated_with
30
+ @attributes[:collocated_with] ||= []
31
+ end
32
+
33
+ def supported_scales_from
34
+ super || 1
35
+ end
36
+ def supported_scales_to
37
+ super || 1
38
+ end
39
+ def type
40
+ @attributes[:type]
41
+ end
42
+
43
+ def type=(type)
44
+ @attributes[:type]=type
45
+ end
46
+
47
+ def runs_on(new_gears)
48
+ gears.concat(new_gears)
49
+ end
50
+ def gears
51
+ @gears ||= []
52
+ end
53
+ def gear_count
54
+ @gears.length
55
+ end
56
+
57
+ # deprecated
58
+ def scales
59
+ @scales || ScaleRelation::Null
60
+ end
61
+
62
+ def scales?
63
+ @scales.present? || supported_scales_from != supported_scales_to
64
+ end
65
+
66
+ # deprecated with args
67
+ def scales_with(*args)
68
+ args.length == 0 ? super : begin
69
+ @scales = ScaleRelation.new args[0], args[1].is_a?(String) ? args[1] : args[1].name, args[2]
70
+ end
71
+ end
72
+
73
+ #
74
+ # The build attributes are used for view manipulation only
75
+ #
76
+ # deprecated
77
+ def buildable?
78
+ git_url.present? and tags.include? :web_framework
79
+ end
80
+ def builds
81
+ @builds || BuildRelation::Null
82
+ end
83
+ def builds?
84
+ @builds.present?
85
+ end
86
+ def builds_with(cart, gear_group)
87
+ @builds = BuildRelation.new cart, gear_group.is_a?(String) ? gear_group : gear_group.name
88
+ end
89
+
90
+ def grouping
91
+ @grouping ||= [name].concat(collocated_with).uniq.sort
92
+ end
93
+
94
+ def <=>(other)
95
+ return 0 if name == other.name
96
+ cartridge_type <=> other.cartridge_type
97
+ end
98
+
99
+ def cartridge_type
100
+ @cartridge_type ||= CartridgeType.cached.find(name)
101
+ end
102
+ end
103
+
104
+ class Cartridge::ScaleRelation
105
+ attr_accessor :with, :on, :times
106
+
107
+ def initialize(with, on, times)
108
+ @with, @on, @times = with, on, times
109
+ end
110
+
111
+ Null = new(nil,nil,1)
112
+ end
113
+
114
+ class Cartridge::BuildRelation
115
+ attr_accessor :with, :on
116
+
117
+ def initialize(with, on)
118
+ @with, @on = with, on
119
+ end
120
+
121
+ Null = new(nil,nil)
122
+ end
@@ -0,0 +1,140 @@
1
+ class CartridgeType < RestApi::Base
2
+ include ActiveModel::Conversion
3
+ extend ActiveModel::Naming
4
+ include Comparable
5
+
6
+ schema do
7
+ string :name, 'type'
8
+ string :tags
9
+ end
10
+
11
+ custom_id :name
12
+
13
+ allow_anonymous
14
+
15
+ attr_accessor :version, :description
16
+ attr_accessor :display_name
17
+ attr_accessor :provides
18
+ attr_accessor :cartridge
19
+ attr_accessor :website, :license, :license_url
20
+ attr_accessor :learn_more_url
21
+ attr_accessor :conflicts, :requires
22
+ attr_accessor :help_topics
23
+ attr_accessor :priority
24
+
25
+ has_many :properties, :class_name => 'rest_api/base/attribute_hash'
26
+
27
+ self.element_name = 'cartridges'
28
+
29
+ def initialize(attributes={},persisted=false)
30
+ attributes = attributes.with_indifferent_access
31
+ name = attributes['name'].presence || attributes[:name].presence
32
+ defaults = self.class.defaults(name)
33
+ defaults.keys.each{ |k| attributes.delete(k) if attributes[k].blank? }
34
+ attributes.reverse_merge!(defaults)
35
+ super attributes, persisted
36
+ end
37
+
38
+ def type
39
+ (@attributes[:type] || :embedded).to_sym
40
+ end
41
+
42
+ def embedded?; type == :embedded; end
43
+ def standalone?; type == :standalone; end
44
+
45
+ def display_name
46
+ @display_name || name
47
+ end
48
+
49
+ # Legacy, use #tags
50
+ def categories
51
+ @categories || []
52
+ end
53
+ def categories=(cats)
54
+ @categories = cats.map{ |c| c.to_sym }.compact.uniq
55
+ end
56
+
57
+ def tags
58
+ @tags ||= (super || [] rescue []).map{ |t| t.to_sym}.concat(categories).compact
59
+ end
60
+ def tags=(tags)
61
+ @tags = nil
62
+ @attributes[:tags] = tags
63
+ end
64
+
65
+ def conflicts
66
+ @conflicts || []
67
+ end
68
+
69
+ def requires
70
+ @requires || []
71
+ end
72
+
73
+ def help_topics
74
+ @help_topics || {}
75
+ end
76
+
77
+ def priority
78
+ @priority || 0
79
+ end
80
+
81
+ def scalable
82
+ self.attributes['supported_scales_to'] != self.attributes['supported_scales_from']
83
+ end
84
+ alias_method :scalable?, :scalable
85
+
86
+ def <=>(other)
87
+ return 0 if name == other.name
88
+ c = self.class.tag_compare(tags, other.tags)
89
+ return c unless c == 0
90
+ c = priority - other.priority
91
+ return c unless c == 0
92
+ display_name <=> other.display_name
93
+ end
94
+
95
+ def self.embedded(*arguments)
96
+ all(*arguments).select(&:embedded?)
97
+ end
98
+
99
+ def self.standalone(*arguments)
100
+ all(*arguments).select(&:standalone?)
101
+ end
102
+
103
+ def self.matches(s, opts=nil)
104
+ every = all(opts)
105
+ s.split('|').map{ |s| s.gsub('*','') }.map do |s|
106
+ Array(every.find{ |t| t.name == s } || every.select do |t|
107
+ t.name.include?(s)
108
+ end)
109
+ end.flatten.uniq
110
+ end
111
+
112
+ cache_find_method :every
113
+
114
+ def self.tag_compare(a,b)
115
+ [:web_framework, :database].each do |t|
116
+ if a.include? t
117
+ return -1 unless b.include? t
118
+ else
119
+ return 1 if b.include? t
120
+ end
121
+ end
122
+ 0
123
+ end
124
+
125
+ class Property < RestApi::Base
126
+ end
127
+
128
+ protected
129
+ def self.find_single(scope, options)
130
+ all(options).find{ |t| t.to_param == scope } or new(:name => scope, :as => options[:as])
131
+ end
132
+
133
+ def self.type_map
134
+ Rails.application.config.cartridge_types_by_name
135
+ end
136
+
137
+ def self.defaults(name)
138
+ type_map[name.to_s] || {}
139
+ end
140
+ end
@@ -0,0 +1,44 @@
1
+ #
2
+ # The REST API model object representing the domain, which may contain multiple applications.
3
+ #
4
+ class Domain < RestApi::Base
5
+ schema do
6
+ string :id
7
+ string :suffix
8
+ end
9
+
10
+ on_exit_code(158, :on_invalid => (Domain::UserAlreadyHasDomain = Class.new(ActiveResource::ResourceInvalid)))
11
+ on_exit_code(103, :on_invalid => (Domain::AlreadyExists = Class.new(ActiveResource::ResourceInvalid)))
12
+
13
+ custom_id :id, true # domain id is mutable, FIXME rename method to primary_key
14
+ alias_attribute :name, :id
15
+
16
+ has_many :applications
17
+ def applications
18
+ @applications ||= Application.find :all, { :params => { :domain_id => self.id }, :as => as }
19
+ end
20
+ def find_application(name)
21
+ Application.find name, { :params => { :domain_id => self.id }, :as => as}
22
+ end
23
+
24
+ #FIXME should have an observer pattern that clears cached associations on reload
25
+ def reload
26
+ @applications = nil
27
+ super
28
+ end
29
+
30
+ def user
31
+ User.find :one, :as => as
32
+ end
33
+
34
+ def destroy_recursive
35
+ connection.delete(element_path({:force => true}.merge(prefix_options)), self.class.headers)
36
+ end
37
+
38
+ # FIXME: Temporary until multiple domains are supported
39
+ def self.find_one(options)
40
+ domain = first(options)
41
+ raise RestApi::ResourceNotFound.new(model_name, nil) if domain.nil?
42
+ domain
43
+ end
44
+ end
@@ -0,0 +1,33 @@
1
+ module DomainAssociations
2
+
3
+ def self.when_belongs_to(klass, options)
4
+ klass.prefix = "#{RestApi::Base.prefix}domains/:domain_id/"
5
+ klass.class_eval do
6
+ # domain_id overlaps with the attribute returned by the server
7
+ def domain_id=(id)
8
+ if self.prefix_options[:domain_id].nil?
9
+ self.prefix_options[:domain_id] = id
10
+ else
11
+ super
12
+ end
13
+ end
14
+ def domain_id
15
+ super or self.prefix_options[:domain_id]
16
+ end
17
+
18
+ def domain
19
+ Domain.find(domain_id, :as => as)
20
+ end
21
+
22
+ def domain=(domain)
23
+ self.domain_id = if domain.kind_of?(Domain)
24
+ self.as = domain.as if self.as.nil?
25
+ domain.id
26
+ else
27
+ domain
28
+ end
29
+ end
30
+ end
31
+ end
32
+
33
+ end