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,10 @@
1
+ #
2
+ # The REST API model object representing a domain name alias to an application.
3
+ #
4
+ class Alias < RestApi::Base
5
+ schema do
6
+ string :name
7
+ end
8
+
9
+ belongs_to :application
10
+ end
@@ -0,0 +1,148 @@
1
+ #
2
+ # The REST API model object representing an application instance.
3
+ #
4
+
5
+ # Explicitly require the gear group to prevent race conditions with autoload - http://bit.ly/SVrPH3
6
+ require 'gear_group'
7
+
8
+ class Application < RestApi::Base
9
+ include AsyncAware
10
+
11
+ schema do
12
+ string :name, :creation_time
13
+ string :uuid, :domain_id
14
+ string :git_url, :app_url, :initial_git_url, :initial_git_branch
15
+ string :server_identity
16
+ string :gear_profile, :scale
17
+ string :building_with, :build_job_url, :building_app
18
+ end
19
+
20
+ custom_id :name
21
+ def id #FIXME provided as legacy support for accessing .name via .id
22
+ name
23
+ end
24
+
25
+ belongs_to :domain
26
+ alias_attribute :domain_name, :domain_id
27
+ alias_attribute :scalable, :scale
28
+
29
+ has_many :aliases
30
+ has_many :cartridges
31
+ has_many :gears
32
+ has_many :gear_groups
33
+
34
+ attr_accessible :name, :scale, :gear_profile, :cartridges, :cartridge_names, :initial_git_url, :initial_git_branch
35
+
36
+ def find_cartridge(name)
37
+ Cartridge.find name, child_options
38
+ end
39
+
40
+ def cartridges
41
+ persisted? ? (@cartridges ||= Cartridge.find(:all, child_options)) : []
42
+ end
43
+ def cartridges=(arr)
44
+ attributes[:cartridges] = Array(arr).map do |a|
45
+ if a.is_a?(String)
46
+ a
47
+ elsif a.respond_to?(:[])
48
+ a[:name] || a['name']
49
+ else
50
+ a.name
51
+ end
52
+ end
53
+ end
54
+
55
+ def cartridge_names
56
+ persisted? ? cartridges.map(&:name) : Array(attributes[:cartridges])
57
+ end
58
+ alias_method :cartridge_names=, :cartridges=
59
+
60
+ def gears
61
+ Gear.find :all, child_options
62
+ end
63
+ def gear_groups
64
+ @gear_groups ||= GearGroup.find(:all, child_options)
65
+ end
66
+ def cartridge_gear_groups
67
+ @cartridge_gear_groups ||= GearGroup.infer(cartridges, self)
68
+ end
69
+
70
+ def gear_groups_with_state
71
+ async{ @_gear_groups = cartridge_gear_groups }
72
+ async{ @_gear_groups_with_state = gear_groups }
73
+ join!(30)
74
+
75
+ @_gear_groups.each{ |g| g.merge_gears(@_gear_groups_with_state) }
76
+ @_gear_groups
77
+ end
78
+
79
+ def web_url
80
+ app_url
81
+ end
82
+
83
+ #FIXME would prefer this come from REST API
84
+ def ssh_url
85
+ uri = URI.parse(git_url)
86
+ uri.scheme = 'ssh'
87
+ uri.path = ''
88
+ uri.fragment = nil
89
+ uri
90
+ end
91
+
92
+ # Helper to return the segment that would be provided for command line calls
93
+ def ssh_string
94
+ uri = ssh_url
95
+ user = "#{uri.userinfo}@" if uri.userinfo
96
+ port = ":#{uri.port}" if uri.port
97
+ [user,uri.host,port].join
98
+ end
99
+
100
+ def framework_name
101
+ @framework_name ||= CartridgeType.cached.find(framework, :as => as).display_name rescue framework
102
+ end
103
+
104
+ def embedded
105
+ @attributes[:embedded]
106
+ end
107
+
108
+ def scales?
109
+ scale
110
+ end
111
+
112
+ def scale_status_url
113
+ "#{web_url}haproxy-status/"
114
+ end
115
+
116
+ def builds?
117
+ building_with.present?
118
+ end
119
+
120
+ # FIXME it is assumed that eventually this will be server functionality
121
+ def destroy_build_cartridge
122
+ return true if !builds?
123
+ cart = Cartridge.new({:application => self, :as => as, :name => building_with}, true)
124
+ cart.destroy
125
+ rescue ActiveResource::ConnectionError => e
126
+ raise unless set_remote_errors(e, true)
127
+ #end.tap{ |success| cart.errors.full_messages.each{ |m| errors.add(:base, m) } unless success }
128
+ end
129
+
130
+ def reload
131
+ @gear_groups = nil
132
+ @cartridge_gear_groups = nil
133
+ super
134
+ end
135
+
136
+ protected
137
+ def child_options
138
+ { :params => { :domain_id => domain_id, :application_name => self.name},
139
+ :as => as }
140
+ end
141
+
142
+ class << self
143
+ def rescue_parent_missing(e, options=nil)
144
+ parent = RestApi::ResourceNotFound.new(Domain.model_name, (options[:params][:domain_id] rescue nil), e.response)
145
+ raise parent if parent.domain_missing?
146
+ end
147
+ end
148
+ end
@@ -0,0 +1,36 @@
1
+ module ApplicationAssociations
2
+
3
+ def self.when_belongs_to(klass, options)
4
+ klass.prefix = "#{RestApi::Base.prefix}domains/:domain_id/applications/:application_name/"
5
+ klass.class_eval do
6
+ schema do
7
+ string :application_name
8
+ end
9
+ def application_name=(id)
10
+ if self.prefix_options[:application_name].nil?
11
+ self.prefix_options[:application_name] = id
12
+ else
13
+ super
14
+ end
15
+ end
16
+ def application_name
17
+ super or self.prefix_options[:application_name]
18
+ end
19
+ def domain_id=(id)
20
+ self.prefix_options[:domain_id] = id
21
+ end
22
+ def domain_id
23
+ self.prefix_options[:domain_id]
24
+ end
25
+ def application
26
+ Application.find application_name, :params => {:domain_id => domain_id}, :as => as
27
+ end
28
+ def application=(application)
29
+ self.application_name = application.name
30
+ self.domain_id = application.domain_id
31
+ self.as = application.as if self.as.nil?
32
+ end
33
+ end
34
+ end
35
+
36
+ end
@@ -0,0 +1,90 @@
1
+ class ApplicationTemplate < RestApi::Base
2
+ allow_anonymous
3
+
4
+ schema do
5
+ string :descriptor_yaml, :display_name
6
+ end
7
+
8
+ custom_id :name
9
+
10
+ [:description, :website, :version, :git_url, :git_project_url].each do |s|
11
+ define_attribute_method s
12
+ define_method s do
13
+ metadata.attributes[s]
14
+ end
15
+ end
16
+ {:name => 'Name', :provides => 'Requires'}.each_pair do |s,v|
17
+ define_attribute_method s
18
+ define_method s do
19
+ descriptor[v]
20
+ end
21
+ end
22
+
23
+ def descriptor
24
+ @descriptor ||= YAML.load(descriptor_yaml) || {}
25
+ end
26
+
27
+ def display_name
28
+ attributes['display_name'] || name
29
+ end
30
+ def tags
31
+ @tags ||= super.map{|t| t.to_sym} << :template
32
+ end
33
+ alias_method :categories, :tags
34
+
35
+ def provides
36
+ Array(super)
37
+ end
38
+
39
+ def template
40
+ self
41
+ end
42
+
43
+ def credentials
44
+ creds = metadata.attributes[:credentials]
45
+ creds.map{|x| x.attributes.to_hash } unless creds.nil?
46
+ end
47
+
48
+ def credentials_message
49
+ creds = credentials
50
+ return if creds.blank?
51
+
52
+ str = "Your application contains pre-configured accounts, here are their credentials. " +
53
+ "You may want to change them as soon as possible.\n"
54
+
55
+ credentials.each do |cred|
56
+ str << "\n"
57
+ [:username, :password].each do |type|
58
+ str << "%s: %s\n" % [type.to_s.upcase,cred[type.to_s]]
59
+ end
60
+ end
61
+
62
+ str
63
+ end
64
+
65
+ def scalable
66
+ false
67
+ end
68
+ alias_method :scalable?, :scalable
69
+
70
+ def cartridges
71
+ @cartridges ||= descriptor['Requires'] || []
72
+ end
73
+
74
+ alias_method :initial_git_url, :git_url
75
+ def initial_git_branch
76
+ nil
77
+ end
78
+
79
+ cache_find_method :single, lambda{ |*args| [:template, :find, :by_id, args.shift] }
80
+ cache_find_method :every
81
+
82
+ protected
83
+ def self.find_single(s, opts=nil)
84
+ all(opts).find{ |t| t.name == s }
85
+ end
86
+
87
+ def self.disabled?
88
+ !RestApi.info.link('LIST_TEMPLATES') rescue true
89
+ end
90
+ end
@@ -0,0 +1,258 @@
1
+ class ApplicationType
2
+ include ActiveModel::Conversion
3
+ include ActiveModel::MassAssignmentSecurity
4
+ include RestApi::Cacheable
5
+ extend ActiveModel::Naming
6
+
7
+ PROTECTED_TAGS = [:new, :premium, :blacklist, :featured]
8
+ def self.user_tags(tags)
9
+ tags - PROTECTED_TAGS
10
+ end
11
+
12
+ class NotFound < RestApi::ResourceNotFound
13
+ def initialize(id, response=nil)
14
+ super(ApplicationType.model_name, id, response)
15
+ end
16
+ end
17
+
18
+ CartridgeSpecInvalid = Class.new(StandardError)
19
+
20
+ attr_accessor :id, :display_name, :version, :description
21
+ attr_accessor :cartridges, :initial_git_url, :initial_git_branch, :cartridges_spec
22
+ attr_accessor :template # DEPRECATED
23
+ attr_accessor :website, :license, :license_url
24
+ attr_accessor :tags, :learn_more_url
25
+ attr_accessor :help_topics
26
+ attr_accessor :priority
27
+ attr_accessor :scalable
28
+ alias_method :scalable?, :scalable
29
+ attr_accessor :source
30
+
31
+ attr_accessible :initial_git_url, :cartridges, :initial_git_branch, :scalable
32
+ alias_attribute :categories, :tags
33
+
34
+ def initialize(attributes={}, persisted=false)
35
+ attributes.each do |name,value|
36
+ send("#{name}=", value)
37
+ end
38
+ @persisted = persisted
39
+ end
40
+
41
+ def persisted?
42
+ @persisted
43
+ end
44
+
45
+ def new?
46
+ tags.include?(:new)
47
+ end
48
+
49
+ def to_params
50
+ persisted? ? {:id => id} : [:cartridges, :initial_git_url, :initial_git_branch].inject({}){ |h, s| h[s] = send(s); h }
51
+ end
52
+
53
+ def cartridges=(cartridges)
54
+ @cartridges = Array(cartridges)
55
+ end
56
+
57
+ def cartridge_specs
58
+ begin
59
+ s = (@cartridges_spec || cartridges || [])
60
+ if s.is_a? Array
61
+ s
62
+ else
63
+ s = s.strip
64
+ if s[0] == '['
65
+ ActiveSupport::JSON.decode(s).map{ |s| s.is_a?(Hash) ? s['name'] : s }
66
+ else
67
+ s.split(',').map(&:strip)
68
+ end
69
+ end
70
+ rescue
71
+ raise ApplicationType::CartridgeSpecInvalid, $!, $@
72
+ end
73
+ end
74
+
75
+ def <=>(other)
76
+ return 0 if id == other.id
77
+ c = source_priority - other.source_priority
78
+ return c unless c == 0
79
+ c = priority - other.priority
80
+ return c unless c == 0
81
+ display_name <=> other.display_name
82
+ end
83
+
84
+ def tags
85
+ @tags || []
86
+ end
87
+
88
+ def priority
89
+ @priority || 0
90
+ end
91
+
92
+ def source_priority
93
+ case source
94
+ when :template; -1
95
+ when :cartridge; -2
96
+ else; 0
97
+ end
98
+ end
99
+
100
+ def cartridge?; source == :cartridge; end
101
+ def template?; source == :template; end
102
+ def quickstart?; source == :quickstart; end
103
+
104
+ def matching_cartridges
105
+ self.class.matching_cartridges(cartridge_specs)
106
+ end
107
+
108
+ def >>(app)
109
+ if template
110
+ app.template = template.uuid
111
+ else
112
+ app.cartridges = cartridges if cartridges.present?
113
+ app.initial_git_url = initial_git_url if initial_git_url
114
+ app.initial_git_branch = initial_git_branch if initial_git_branch
115
+ end
116
+ app
117
+ end
118
+
119
+ #
120
+ # Default mass assignment support
121
+ #
122
+ def assign_attributes(values, options = {})
123
+ sanitize_for_mass_assignment(values, options[:as]).each do |k, v|
124
+ send("#{k}=", v)
125
+ end
126
+ self
127
+ end
128
+
129
+ cache_find_method :every
130
+
131
+ class << self
132
+ def all(*arguments)
133
+ find(:all, *arguments)
134
+ end
135
+
136
+ def search(query, opts={})
137
+ find(:all, {:search => query}.merge(opts))
138
+ end
139
+
140
+ def tagged(tag, opts={})
141
+ find(:all, {:tag => tag}.merge(opts))
142
+ end
143
+
144
+ def find(*arguments)
145
+ option = arguments.shift
146
+ case option
147
+ when String
148
+ find_single(option, *arguments)
149
+ when :all
150
+ find_every(*arguments)
151
+ when Symbol
152
+ find_every(*arguments).select { |t| t.tags.include? option }
153
+ else
154
+ raise "Unsupported scope"
155
+ end
156
+ end
157
+
158
+ def matching_cartridges(cartridge_specs)
159
+ valid, invalid = {}, []
160
+ Array(cartridge_specs).uniq.each do |c|
161
+ if (matches = CartridgeType.cached.matches(c)).present?
162
+ valid[c] = matches
163
+ else
164
+ invalid << c
165
+ end
166
+ end
167
+ [valid, invalid]
168
+ end
169
+
170
+ def custom(attrs={})
171
+ attrs = {} if attrs.nil? || attrs.is_a?(String)
172
+ attrs[:scalable] = true unless attrs.has_key?(:scalable)
173
+ new(:id => 'custom', :display_name => 'From Scratch').assign_attributes(attrs)
174
+ end
175
+
176
+ protected
177
+ def find_single(id, *arguments)
178
+ case (match = /^([^!]+)!(.+)/.match(id) || [])[1]
179
+ when 'quickstart'; from_quickstart(Quickstart.find match[2])
180
+ when 'cart'; from_cartridge_type(CartridgeType.cached.find match[2])
181
+ when 'template'; from_application_template(ApplicationTemplate.cached.find match[2])
182
+ else raise NotFound.new(id)
183
+ end
184
+ #find_every(*arguments).find{ |t| t.id == id } or raise NotFound, id
185
+ end
186
+
187
+ def find_every(opts={})
188
+ source = opts[:source].nil? ? nil : Array(opts[:source])
189
+
190
+ types = []
191
+ case
192
+ when opts[:search]
193
+ query = opts[:search].downcase
194
+ types.concat CartridgeType.cached.standalone
195
+ types.concat ApplicationTemplate.cached.all
196
+ types.keep_if &LOCAL_SEARCH.curry[query]
197
+ types.concat Quickstart.search(query)
198
+ when opts[:tag]
199
+ tag = opts[:tag].to_sym rescue (return [])
200
+ types.concat CartridgeType.cached.standalone
201
+ types.concat ApplicationTemplate.cached.all unless tag == :cartridge
202
+ types.keep_if &TAG_FILTER.curry[[tag]]
203
+ types.concat Quickstart.search(tag.to_s) unless tag == :cartridge
204
+ else
205
+ types.concat CartridgeType.cached.standalone
206
+ types.concat ApplicationTemplate.cached.all
207
+ types.concat Quickstart.cached.promoted
208
+ end
209
+ raise "nil types" unless types
210
+
211
+ types.select do |t|
212
+ not (t.tags.include?(:blacklist) or (Rails.env.production? and t.tags.include?(:in_development)))
213
+ end.map do |t|
214
+ case t
215
+ when ApplicationTemplate; from_application_template(t)
216
+ when CartridgeType; from_cartridge_type(t)
217
+ when Quickstart; from_quickstart(t)
218
+ end
219
+ end
220
+ end
221
+
222
+ def from_cartridge_type(type)
223
+ attrs = {:id => "cart!#{type.name}", :source => :cartridge}
224
+ [:display_name, :tags, :description, :website, :version, :license, :license_url, :help_topics, :priority, :scalable].each do |m|
225
+ attrs[m] = type.send(m)
226
+ end
227
+ attrs[:cartridges] = [type.name]
228
+
229
+ new(attrs, type.persisted?)
230
+ end
231
+ def from_application_template(type)
232
+ attrs = { :id => "template!#{type.name}", :source => :template }
233
+ [:display_name, :tags, :description, :website, :version, :template, :cartridges, :scalable, :initial_git_url, :initial_git_branch].each do |m|
234
+ attrs[m] = type.send(m)
235
+ end
236
+
237
+ new(attrs, type.persisted?)
238
+ end
239
+ def from_quickstart(type)
240
+ attrs = { :id => "quickstart!#{type.id}", :source => :quickstart }
241
+ [:display_name, :tags, :description, :website, :initial_git_url, :initial_git_branch, :cartridges_spec, :priority, :scalable, :learn_more_url].each do |m|
242
+ attrs[m] = type.send(m)
243
+ end
244
+
245
+ new(attrs, type.persisted?)
246
+ end
247
+ end
248
+
249
+ protected
250
+ LOCAL_SEARCH = lambda do |query, t|
251
+ t.description.downcase.include?(query) or
252
+ t.display_name.downcase.include?(query) or
253
+ (t.tags.include?(query.to_sym) rescue false)
254
+ end
255
+ TAG_FILTER = lambda do |query, t|
256
+ (t.tags & query) == query
257
+ end
258
+ end