openshift-origin-controller 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 (180) hide show
  1. data/COPYRIGHT +1 -0
  2. data/Gemfile +4 -0
  3. data/LICENSE +12 -0
  4. data/README.md +3 -0
  5. data/Rakefile +9 -0
  6. data/app/controllers/app_events_controller.rb +115 -0
  7. data/app/controllers/application_templates_controller.rb +19 -0
  8. data/app/controllers/applications_controller.rb +214 -0
  9. data/app/controllers/base_controller.rb +367 -0
  10. data/app/controllers/cartridges_controller.rb +48 -0
  11. data/app/controllers/descriptors_controller.rb +23 -0
  12. data/app/controllers/dns_resolvable_controller.rb +35 -0
  13. data/app/controllers/domains_controller.rb +156 -0
  14. data/app/controllers/emb_cart_controller.rb +276 -0
  15. data/app/controllers/emb_cart_events_controller.rb +52 -0
  16. data/app/controllers/environment_controller.rb +11 -0
  17. data/app/controllers/estimates_controller.rb +71 -0
  18. data/app/controllers/gear_groups_controller.rb +53 -0
  19. data/app/controllers/gears_controller.rb +70 -0
  20. data/app/controllers/keys_controller.rb +96 -0
  21. data/app/controllers/legacy_broker_controller.rb +510 -0
  22. data/app/controllers/quickstarts_controller.rb +29 -0
  23. data/app/controllers/user_controller.rb +38 -0
  24. data/app/helpers/cartridge_helper.rb +25 -0
  25. data/app/helpers/legacy_broker_helper.rb +21 -0
  26. data/app/helpers/user_action_logger.rb +38 -0
  27. data/app/models/application.rb +1718 -0
  28. data/app/models/application_template.rb +27 -0
  29. data/app/models/cartridge_cache.rb +51 -0
  30. data/app/models/cloud_user.rb +334 -0
  31. data/app/models/component_instance.rb +228 -0
  32. data/app/models/connection_endpoint.rb +10 -0
  33. data/app/models/district.rb +210 -0
  34. data/app/models/domain.rb +234 -0
  35. data/app/models/gear.rb +376 -0
  36. data/app/models/group_instance.rb +306 -0
  37. data/app/models/key.rb +20 -0
  38. data/app/models/legacy_reply.rb +15 -0
  39. data/app/models/legacy_request.rb +126 -0
  40. data/app/models/link.rb +11 -0
  41. data/app/models/message.rb +10 -0
  42. data/app/models/name_server_cache.rb +46 -0
  43. data/app/models/optional_param.rb +12 -0
  44. data/app/models/param.rb +13 -0
  45. data/app/models/remote_job.rb +57 -0
  46. data/app/models/rest_application.rb +126 -0
  47. data/app/models/rest_application10.rb +106 -0
  48. data/app/models/rest_application12.rb +124 -0
  49. data/app/models/rest_application_estimate.rb +12 -0
  50. data/app/models/rest_application_template.rb +20 -0
  51. data/app/models/rest_cartridge10.rb +41 -0
  52. data/app/models/rest_cartridge11.rb +151 -0
  53. data/app/models/rest_domain.rb +43 -0
  54. data/app/models/rest_domain10.rb +42 -0
  55. data/app/models/rest_estimates.rb +16 -0
  56. data/app/models/rest_gear.rb +14 -0
  57. data/app/models/rest_gear_group.rb +26 -0
  58. data/app/models/rest_key.rb +24 -0
  59. data/app/models/rest_reply.rb +31 -0
  60. data/app/models/rest_user.rb +43 -0
  61. data/app/models/result_io.rb +67 -0
  62. data/app/models/usage_record.rb +37 -0
  63. data/app/models/validators/app_validator.rb +30 -0
  64. data/app/models/validators/key_validator.rb +30 -0
  65. data/app/models/validators/namespace_validator.rb +18 -0
  66. data/config/routes.rb +36 -0
  67. data/lib/controller_engine.rb +7 -0
  68. data/lib/openshift-origin-controller.rb +14 -0
  69. data/lib/openshift/application_container_proxy.rb +241 -0
  70. data/lib/openshift/auth_service.rb +101 -0
  71. data/lib/openshift/data_store.rb +33 -0
  72. data/lib/openshift/dns_service.rb +41 -0
  73. data/lib/openshift/mongo_data_store.rb +671 -0
  74. data/openshift-origin-controller.gemspec +42 -0
  75. data/rubygem-openshift-origin-controller.spec +274 -0
  76. data/test/cucumber/application-estimate.feature +25 -0
  77. data/test/cucumber/cartridge-10gen-mms-agent.feature +28 -0
  78. data/test/cucumber/cartridge-cron.feature +32 -0
  79. data/test/cucumber/cartridge-haproxy.feature +31 -0
  80. data/test/cucumber/cartridge-jenkins-build.feature +12 -0
  81. data/test/cucumber/cartridge-jenkins-client.feature +10 -0
  82. data/test/cucumber/cartridge-lifecycle-diy.feature +21 -0
  83. data/test/cucumber/cartridge-lifecycle-jbossas.feature +61 -0
  84. data/test/cucumber/cartridge-lifecycle-jbosseap.feature +61 -0
  85. data/test/cucumber/cartridge-lifecycle-jbossews10.feature +61 -0
  86. data/test/cucumber/cartridge-lifecycle-jenkins.feature +41 -0
  87. data/test/cucumber/cartridge-lifecycle-nodejs.feature +59 -0
  88. data/test/cucumber/cartridge-lifecycle-perl.feature +40 -0
  89. data/test/cucumber/cartridge-lifecycle-php.feature +106 -0
  90. data/test/cucumber/cartridge-lifecycle-python.feature +40 -0
  91. data/test/cucumber/cartridge-lifecycle-ruby18.feature +49 -0
  92. data/test/cucumber/cartridge-lifecycle-ruby19.feature +41 -0
  93. data/test/cucumber/cartridge-mongodb.feature +31 -0
  94. data/test/cucumber/cartridge-mysql.feature +30 -0
  95. data/test/cucumber/cartridge-php.feature +14 -0
  96. data/test/cucumber/cartridge-phpmyadmin.feature +32 -0
  97. data/test/cucumber/cartridge-postgresql.feature +32 -0
  98. data/test/cucumber/cartridge-runtime-extended-db.feature +64 -0
  99. data/test/cucumber/cartridge-runtime-extended-jboss.feature +24 -0
  100. data/test/cucumber/cartridge-runtime-extended-nodejs.feature +21 -0
  101. data/test/cucumber/cartridge-runtime-extended-perl.feature +18 -0
  102. data/test/cucumber/cartridge-runtime-extended-php.feature +19 -0
  103. data/test/cucumber/cartridge-runtime-extended-python.feature +18 -0
  104. data/test/cucumber/cartridge-runtime-extended-ruby.feature +22 -0
  105. data/test/cucumber/cartridge-runtime-standard-diy.feature +6 -0
  106. data/test/cucumber/cartridge-runtime-standard-jbossas.feature +7 -0
  107. data/test/cucumber/cartridge-runtime-standard-jbosseap.feature +7 -0
  108. data/test/cucumber/cartridge-runtime-standard-jbossews10.feature +7 -0
  109. data/test/cucumber/cartridge-runtime-standard-jenkins.feature +8 -0
  110. data/test/cucumber/cartridge-runtime-standard-nodejs.feature +7 -0
  111. data/test/cucumber/cartridge-runtime-standard-perl.feature +6 -0
  112. data/test/cucumber/cartridge-runtime-standard-php.feature +6 -0
  113. data/test/cucumber/cartridge-runtime-standard-python.feature +6 -0
  114. data/test/cucumber/cartridge-runtime-standard-ruby.feature +19 -0
  115. data/test/cucumber/cartridge-switchyard.feature +36 -0
  116. data/test/cucumber/descriptor.feature +40 -0
  117. data/test/cucumber/embedded.feature +44 -0
  118. data/test/cucumber/idler.feature +75 -0
  119. data/test/cucumber/misc/descriptor/manifest.yml +22 -0
  120. data/test/cucumber/misc/php/db_test.php +21 -0
  121. data/test/cucumber/openshift-node.feature +21 -0
  122. data/test/cucumber/rest-application-templates.feature +31 -0
  123. data/test/cucumber/rest-applications.feature +431 -0
  124. data/test/cucumber/rest-cartridge-types.feature +16 -0
  125. data/test/cucumber/rest-domains.feature +276 -0
  126. data/test/cucumber/rest-gears.feature +38 -0
  127. data/test/cucumber/rest-keys.feature +247 -0
  128. data/test/cucumber/rest-quickstarts.feature +27 -0
  129. data/test/cucumber/rest-workflow.feature +64 -0
  130. data/test/cucumber/step_definitions/api_steps.rb +369 -0
  131. data/test/cucumber/step_definitions/application-estimate-steps.rb +51 -0
  132. data/test/cucumber/step_definitions/application_steps.rb +215 -0
  133. data/test/cucumber/step_definitions/cartridge-10gen-mms-agent_steps.rb +11 -0
  134. data/test/cucumber/step_definitions/cartridge-cron_steps.rb +51 -0
  135. data/test/cucumber/step_definitions/cartridge-haproxy_steps.rb +30 -0
  136. data/test/cucumber/step_definitions/cartridge-jenkins_steps.rb +93 -0
  137. data/test/cucumber/step_definitions/cartridge-lifecycle-nodejs_steps.rb +30 -0
  138. data/test/cucumber/step_definitions/cartridge-mongodb_steps.rb +60 -0
  139. data/test/cucumber/step_definitions/cartridge-mysql_steps.rb +56 -0
  140. data/test/cucumber/step_definitions/cartridge-php_steps.rb +72 -0
  141. data/test/cucumber/step_definitions/cartridge-postgresql_steps.rb +59 -0
  142. data/test/cucumber/step_definitions/cartridge-switchyard_steps.rb +29 -0
  143. data/test/cucumber/step_definitions/client_steps.rb +12 -0
  144. data/test/cucumber/step_definitions/descriptor_step.rb +32 -0
  145. data/test/cucumber/step_definitions/idler_steps.rb +37 -0
  146. data/test/cucumber/step_definitions/node_steps.rb +203 -0
  147. data/test/cucumber/step_definitions/runtime_steps.rb +547 -0
  148. data/test/cucumber/step_definitions/runtime_url_steps.rb +46 -0
  149. data/test/cucumber/step_definitions/trap-user-extended_steps.rb +14 -0
  150. data/test/cucumber/step_definitions/trap-user_steps.rb +58 -0
  151. data/test/cucumber/support/00_setup_helper.rb +106 -0
  152. data/test/cucumber/support/app_helper.rb +243 -0
  153. data/test/cucumber/support/assertions.rb +52 -0
  154. data/test/cucumber/support/command_helper.rb +453 -0
  155. data/test/cucumber/support/dns_helper.rb +54 -0
  156. data/test/cucumber/support/env.rb +5 -0
  157. data/test/cucumber/support/process_helper.rb +44 -0
  158. data/test/cucumber/support/runtime_support.rb +440 -0
  159. data/test/cucumber/support/unused.rb +27 -0
  160. data/test/cucumber/support/user_helper.rb +37 -0
  161. data/test/cucumber/trap-user-extended.feature +53 -0
  162. data/test/cucumber/trap-user.feature +34 -0
  163. data/test/ddns/1.168.192-rev.db.init +13 -0
  164. data/test/ddns/HOWTO.txt +207 -0
  165. data/test/ddns/Kexample.com.+157+06142.key +1 -0
  166. data/test/ddns/Kexample.com.+157+06142.private +7 -0
  167. data/test/ddns/authconfig.rb +14 -0
  168. data/test/ddns/example.com.db.init +23 -0
  169. data/test/ddns/example.com.key +4 -0
  170. data/test/ddns/named.ca +52 -0
  171. data/test/ddns/named.conf +48 -0
  172. data/test/ddns/named.empty +10 -0
  173. data/test/ddns/named.localhost +10 -0
  174. data/test/ddns/named.loopback +11 -0
  175. data/test/ddns/named.rfc1912.zones +42 -0
  176. data/test/ddns/named.root.key +5 -0
  177. data/test/ddns/named_service.rb +127 -0
  178. data/test/unit/bind_dns_service_test.rb +167 -0
  179. data/test/unit/broker_auth_test.rb +28 -0
  180. metadata +545 -0
@@ -0,0 +1,48 @@
1
+ class CartridgesController < BaseController
2
+ respond_to :xml, :json
3
+ before_filter :check_version
4
+ include LegacyBrokerHelper
5
+
6
+ def show
7
+ index
8
+ end
9
+
10
+ # GET /cartridges
11
+ def index
12
+ type = params[:id]
13
+
14
+ cartridges = Array.new
15
+ if type.nil? or type == "standalone"
16
+ cart_type = "standalone"
17
+ cache_key = "cart_list_#{cart_type}"
18
+ carts = get_cached(cache_key, :expires_in => 21600.seconds) do
19
+ Application.get_available_cartridges(cart_type)
20
+ end
21
+ carts.each do |cart|
22
+ if $requested_api_version >= 1.1
23
+ cartridge = RestCartridge11.new(cart_type, cart, nil, get_url, nil, nolinks)
24
+ else
25
+ cartridge = RestCartridge10.new(cart_type, cart, nil, get_url, nil, nolinks)
26
+ end
27
+ cartridges.push(cartridge)
28
+ end
29
+ end
30
+
31
+ if type.nil? or type == "embedded"
32
+ cart_type = "embedded"
33
+ cache_key = "cart_list_#{cart_type}"
34
+ carts = get_cached(cache_key, :expires_in => 21600.seconds) do
35
+ Application.get_available_cartridges(cart_type)
36
+ end
37
+ carts.each do |cart|
38
+ if $requested_api_version >= 1.1
39
+ cartridge = RestCartridge11.new(cart_type, cart, nil, get_url, nil, nolinks)
40
+ else
41
+ cartridge = RestCartridge10.new(cart_type, cart, nil, get_url, nil, nolinks)
42
+ end
43
+ cartridges.push(cartridge)
44
+ end
45
+ end
46
+ render_success(:ok, "cartridges", cartridges, "LIST_CARTRIDGES", "List #{type.nil? ? 'all' : type} cartridges")
47
+ end
48
+ end
@@ -0,0 +1,23 @@
1
+ class DescriptorsController < BaseController
2
+ respond_to :xml, :json
3
+ before_filter :authenticate, :check_version
4
+
5
+ def show
6
+ domain_id = params[:domain_id]
7
+ application_id = params[:application_id]
8
+
9
+ domain = Domain.get(@cloud_user, domain_id)
10
+ return render_error(:not_found, "Domain #{domain_id} not found", 127,
11
+ "SHOW_DESCRIPTOR") if !domain || !domain.hasAccess?(@cloud_user)
12
+
13
+ @domain_name = domain.namespace
14
+ application = Application.find(@cloud_user,application_id)
15
+ return render_error(:not_found, "Application '#{application_id}' not found for domain '#{domain_id}'",
16
+ 101, "SHOW_DESCRIPTOR") unless application
17
+
18
+ @application_name = application.name
19
+ @application_uuid = application.uuid
20
+ render_success(:ok, "descriptor", application.to_descriptor.to_yaml, "SHOW_DESCRIPTOR",
21
+ "Show descriptor for application '#{application_id}' for domain '#{domain_id}'")
22
+ end
23
+ end
@@ -0,0 +1,35 @@
1
+ require 'rubygems'
2
+ require 'dnsruby'
3
+
4
+ class DnsResolvableController < BaseController
5
+ respond_to :xml, :json
6
+ before_filter :authenticate, :check_version
7
+
8
+ # GET /domains/[domain_id]/applications/<id>/dns_resolvable
9
+ def show
10
+ domain_id = params[:domain_id]
11
+ id = params[:application_id]
12
+
13
+ domain = Domain.get(@cloud_user, domain_id)
14
+ return render_error(:not_found, "Domain #{domain_id} not found", 127,
15
+ "DNS_RESOLVABLE") if !domain || !domain.hasAccess?(@cloud_user)
16
+
17
+ @domain_name = domain.namespace
18
+ application = Application.find(@cloud_user,id)
19
+ return render_error(:not_found, "Application '#{id}' not found", 101,
20
+ "DNS_RESOLVABLE") unless application
21
+
22
+ @application_name = application.name
23
+ @application_uuid = application.uuid
24
+ name = "#{application.name}-#{application.domain.namespace}.#{Rails.configuration.openshift[:domain_suffix]}"
25
+ nameservers = NameServerCache.get_name_servers
26
+
27
+ dns = Dnsruby::Resolver.new(:nameserver => nameservers[rand(nameservers.length)])
28
+ begin
29
+ dns.query(name, Dnsruby::Types.A)
30
+ render_success(:ok, "boolean", true, "DNS_RESOLVABLE", "Resolved DNS #{name}")
31
+ rescue
32
+ render_error(:not_found, "Could not resolve DNS #{name}", 170, "DNS_RESOLVABLE")
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,156 @@
1
+ class DomainsController < BaseController
2
+ respond_to :xml, :json
3
+ before_filter :authenticate, :check_version
4
+
5
+ # GET /domains
6
+ def index
7
+ domains = Array.new
8
+ Rails.logger.debug "Getting domains for user #{@cloud_user.login}"
9
+ Rails.logger.debug @cloud_user.domains
10
+ @cloud_user.domains.each do |domain|
11
+ if $requested_api_version >= 1.3
12
+ domains.push(RestDomain.new(domain, get_url, nolinks))
13
+ else
14
+ domains.push(RestDomain10.new(domain, get_url, nolinks))
15
+ end
16
+ end
17
+ render_success(:ok, "domains", domains, "LIST_DOMAINS")
18
+ end
19
+
20
+ # GET /domains/<id>
21
+ def show
22
+ id = params[:id]
23
+ Rails.logger.debug "Getting domain #{id}"
24
+
25
+ domain = Domain.get(@cloud_user, id)
26
+ if domain and domain.hasAccess?(@cloud_user)
27
+ @domain_name = domain.namespace
28
+ if $requested_api_version >= 1.3
29
+ domain = RestDomain.new(domain, get_url, nolinks)
30
+ else
31
+ domain = RestDomain10.new(domain, get_url, nolinks)
32
+ end
33
+ return render_success(:ok, "domain", domain, "SHOW_DOMAIN", "Found domain #{id}")
34
+ end
35
+ render_error(:not_found, "Domain #{id} not found.", 127, "SHOW_DOMAIN")
36
+ end
37
+
38
+ # POST /domains
39
+ def create
40
+ namespace = params[:id]
41
+ Rails.logger.debug "Creating domain with namespace #{namespace}"
42
+
43
+ domain = Domain.new(namespace, @cloud_user)
44
+ if not domain.valid?
45
+ Rails.logger.error "Domain is not valid"
46
+ messages = get_error_messages(domain, "namespace", "id")
47
+ return render_error(:unprocessable_entity, nil, nil, "ADD_DOMAIN", nil, nil, messages)
48
+ end
49
+
50
+ begin
51
+ dom_available = Domain.namespace_available?(namespace)
52
+ rescue Exception => e
53
+ return render_exception(e, "ADD_DOMAIN")
54
+ end
55
+
56
+ return render_error(:unprocessable_entity, "Namespace '#{namespace}' is already in use. Please choose another.", 103, "ADD_DOMAIN", "id") if !dom_available
57
+
58
+ return render_error(:conflict, "Domain already exists for user. Update the domain to modify.", 158, "ADD_DOMAIN") if !@cloud_user.domains.empty?
59
+
60
+ @domain_name = namespace
61
+ begin
62
+ domain.save
63
+ rescue Exception => e
64
+ return render_exception(e, "ADD_DOMAIN")
65
+ end
66
+
67
+ if $requested_api_version >= 1.3
68
+ domain = RestDomain.new(domain, get_url, nolinks)
69
+ else
70
+ domain = RestDomain10.new(domain, get_url, nolinks)
71
+ end
72
+ render_success(:created, "domain", domain, "ADD_DOMAIN", "Created domain with namespace #{namespace}", true)
73
+ end
74
+
75
+ # PUT /domains/<existing_id>
76
+ def update
77
+ id = params[:existing_id]
78
+ new_namespace = params[:id]
79
+ domain = Domain.get(@cloud_user, id)
80
+
81
+ new_domain = Domain.new(new_namespace, @cloud_user)
82
+ if not new_domain.valid?
83
+ messages = get_error_messages(new_domain, "namespace", "id")
84
+ return render_format_error(:unprocessable_entity, nil, nil, "UPDATE_DOMAIN", nil, nil, messages)
85
+ end
86
+ return render_format_error(:not_found, "Domain '#{id}' not found", 127,
87
+ "UPDATE_DOMAIN") if !domain || !domain.hasAccess?(@cloud_user)
88
+
89
+ return render_format_error(:forbidden, "User does not have permission to modify domain '#{id}'",
90
+ 132, "UPDATE_DOMAIN") if domain && !domain.hasFullAccess?(@cloud_user)
91
+
92
+ Rails.logger.debug "Updating domain #{domain.namespace} to #{new_namespace}"
93
+ begin
94
+ dom_available = Domain.namespace_available?(new_namespace)
95
+ rescue Exception => e
96
+ return render_format_exception(e, "UPDATE_DOMAIN")
97
+ end
98
+
99
+ return render_format_error(:unprocessable_entity, "Namespace '#{new_namespace}' already in use. Please choose another.",
100
+ 103, "UPDATE_DOMAIN", "id") if !dom_available
101
+
102
+ domain.namespace = new_namespace
103
+ if domain.invalid?
104
+ messages = get_error_messages(domain, "namespace", "id")
105
+ return render_format_error(:unprocessable_entity, nil, nil, "UPDATE_DOMAIN", nil, nil, messages)
106
+ end
107
+
108
+ @domain_name = id
109
+ begin
110
+ domain.save
111
+ rescue Exception => e
112
+ return render_format_exception(e, "UPDATE_DOMAIN")
113
+ end
114
+
115
+ @cloud_user = CloudUser.find(@login)
116
+ if $requested_api_version >= 1.3
117
+ domain = RestDomain.new(domain, get_url, nolinks)
118
+ else
119
+ domain = RestDomain10.new(domain, get_url, nolinks)
120
+ end
121
+ render_format_success(:ok, "domain", domain, "UPDATE_DOMAIN", "Updated domain #{id} to #{new_namespace}")
122
+ end
123
+
124
+ # DELETE /domains/<id>
125
+ def destroy
126
+ id = params[:id]
127
+ force = get_bool(params[:force])
128
+
129
+ domain = Domain.get(@cloud_user, id)
130
+ return render_format_error(:not_found, "Domain #{id} not found", 127,
131
+ "DELETE_DOMAIN") if !domain || !domain.hasAccess?(@cloud_user)
132
+
133
+ return render_format_error(:forbidden, "User does not have permission to delete domain '#{id}'",
134
+ 132, "DELETE_DOMAIN") if domain && !domain.hasFullAccess?(@cloud_user)
135
+
136
+ if force
137
+ Rails.logger.debug "Force deleting domain #{id}"
138
+ @cloud_user.applications.each do |app|
139
+ app.cleanup_and_delete if app.domain.uuid == domain.uuid
140
+ end if @cloud_user.applications
141
+ else
142
+ @cloud_user.applications.each do |app|
143
+ return render_format_error(:bad_request, "Domain contains applications. Delete applications first or set force to true.",
144
+ 128, "DELETE_DOMAIN") if app.domain.uuid == domain.uuid
145
+ end if @cloud_user.applications
146
+ end
147
+
148
+ @domain_name = id
149
+ begin
150
+ domain.delete
151
+ render_format_success(:no_content, nil, nil, "DELETE_DOMAIN", "Domain #{id} deleted.", true)
152
+ rescue Exception => e
153
+ return render_format_exception(e, "DELETE_DOMAIN")
154
+ end
155
+ end
156
+ end
@@ -0,0 +1,276 @@
1
+ class EmbCartController < BaseController
2
+ respond_to :xml, :json
3
+ before_filter :authenticate, :check_version
4
+ include LegacyBrokerHelper
5
+ include CartridgeHelper
6
+
7
+ # GET /domains/[domain_id]/applications/[application_id]/cartridges
8
+ def index
9
+ domain_id = params[:domain_id]
10
+ id = params[:application_id]
11
+
12
+ domain = Domain.get(@cloud_user, domain_id)
13
+ return render_error(:not_found, "Domain #{domain_id} not found", 127,
14
+ "LIST_APP_CARTRIDGES") if !domain || !domain.hasAccess?(@cloud_user)
15
+
16
+ @domain_name = domain.namespace
17
+
18
+ Rails.logger.debug "Getting cartridges for application #{id} under domain #{domain_id}"
19
+ application = get_application(id)
20
+ return render_error(:not_found, "Application '#{id}' not found for domain '#{domain_id}'",
21
+ 101, "LIST_APP_CARTRIDGES") unless application
22
+ #used for user action log
23
+ @application_name = application.name
24
+ @application_uuid = application.uuid
25
+
26
+ cartridges = get_cartridges(application)
27
+
28
+ render_success(:ok, "cartridges", cartridges, "LIST_APP_CARTRIDGES",
29
+ "Listing cartridges for application #{id} under domain #{domain_id}")
30
+ end
31
+
32
+ # GET /domains/[domain_id]/applications/[application_id]/cartridges/[id]
33
+ def show
34
+ domain_id = params[:domain_id]
35
+ application_id = params[:application_id]
36
+ id = params[:id]
37
+ #include=status_messages
38
+ status_messages = (params[:include] == "status_messages")
39
+
40
+ domain = Domain.get(@cloud_user, domain_id)
41
+ return render_error(:not_found, "Domain #{domain_id} not found", 127,
42
+ "SHOW_APP_CARTRIDGE") if !domain || !domain.hasAccess?(@cloud_user)
43
+ #used for user action log
44
+ @domain_name = domain.namespace
45
+ Rails.logger.debug "Getting cartridge #{id} for application #{application_id} under domain #{domain_id}"
46
+ application = get_application(application_id)
47
+ return render_error(:not_found, "Application '#{application_id}' not found for domain '#{domain_id}'",
48
+ 101, "SHOW_APP_CARTRIDGE") if !application
49
+
50
+ @application_name = application.name
51
+ @application_uuid = application.uuid
52
+ cartridge = nil
53
+ application.embedded.each do |key, value|
54
+ if key == id
55
+ app_status = application.status(key, false) if status_messages
56
+ if $requested_api_version == 1.0
57
+ cartridge = RestCartridge10.new("embedded", key, application, get_url, app_status, nolinks)
58
+ else
59
+ cartridge = RestCartridge11.new("embedded", key, application, get_url, app_status, nolinks)
60
+ end
61
+ break
62
+ end
63
+ end if application.embedded
64
+
65
+ if !cartridge and id == application.framework and $requested_api_version != 1.0
66
+ app_status = application.status(application.framework, false) if status_messages
67
+ app_status.each do |gear_status|
68
+ #FIXME: work around until cartridge status hook provides better interface
69
+ message = "#{application.framework} is started."
70
+ message = "#{application.framework} is stopped or inaccessible." if gear_status['message'].match(/(stopped)|(inaccessible)/)
71
+ gear_status['message'] = message
72
+ end if app_status
73
+ cartridge = RestCartridge11.new("standalone", application.framework, application, get_url, app_status, nolinks)
74
+ end
75
+ return render_success(:ok, "cartridge", cartridge, "SHOW_APP_CARTRIDGE",
76
+ "Showing cartridge #{id} for application #{application_id} under domain #{domain_id}") if cartridge
77
+
78
+ render_error(:not_found, "Cartridge #{id} not found for application #{application_id}",
79
+ 129, "SHOW_APP_CARTRIDGE")
80
+ end
81
+
82
+ # POST /domains/[domain_id]/applications/[application_id]/cartridges
83
+ def create
84
+ domain_id = params[:domain_id]
85
+ id = params[:application_id]
86
+
87
+ name = params[:name]
88
+ # :cartridge param is deprecated because it isn't consistent with
89
+ # the rest of the apis which take :name. Leave it here because
90
+ # some tools may still use it
91
+ name = params[:cartridge] unless name
92
+ colocate_with = params[:colocate_with]
93
+
94
+ domain = Domain.get(@cloud_user, domain_id)
95
+ return render_error(:not_found, "Domain #{domain_id} not found", 127,
96
+ "EMBED_CARTRIDGE") if !domain || !domain.hasAccess?(@cloud_user)
97
+
98
+ @domain_name = domain.namespace
99
+ application = get_application(id)
100
+ return render_error(:not_found, "Application '#{id}' not found for domain '#{domain_id}'",
101
+ 101, "EMBED_CARTRIDGE") unless application
102
+
103
+ @application_name = application.name
104
+ @application_uuid = application.uuid
105
+ begin
106
+ #container = OpenShift::ApplicationContainerProxy.find_available(application.server_identity)
107
+ container = OpenShift::ApplicationContainerProxy.find_available(nil)
108
+ if not check_cartridge_type(name, container, "embedded")
109
+ carts = get_cached("cart_list_embedded", :expires_in => 21600.seconds) {
110
+ Application.get_available_cartridges("embedded")}
111
+ return render_error(:bad_request, "Invalid cartridge. Valid values are (#{carts.join(', ')})",
112
+ 109, "EMBED_CARTRIDGE", "cartridge")
113
+ end
114
+ rescue Exception => e
115
+ return render_exception(e, "EMBED_CARTRIDGE")
116
+ end
117
+
118
+ #TODO: Need a proper method to let us know if cart will get its own gear
119
+ if application.scalable && colocate_with.nil? && (@cloud_user.consumed_gears >= @cloud_user.max_gears) && name != 'jenkins-client-1.4'
120
+ return render_error(:unprocessable_entity, "#{@cloud_user.login} has already reached the gear limit of #{@cloud_user.max_gears}",
121
+ 104, "EMBED_CARTRIDGE")
122
+ end
123
+
124
+ cart_create_reply = ""
125
+ begin
126
+ application.add_group_override(name, colocate_with) if colocate_with
127
+ cart_create_reply = application.add_dependency(name)
128
+ rescue Exception => e
129
+ return render_exception(e, "EMBED_CARTRIDGE")
130
+ end
131
+
132
+ application = get_application(id)
133
+
134
+ application.embedded.each do |key, value|
135
+ if key == name
136
+ if $requested_api_version == 1.0
137
+ cartridge = RestCartridge10.new("embedded", key, application, get_url, nil, nolinks)
138
+ else
139
+ cartridge = RestCartridge11.new("embedded", key, application, get_url, nil, nolinks)
140
+ end
141
+ messages = []
142
+ log_msg = "Added #{name} to application #{id}"
143
+ messages.push(Message.new(:info, log_msg))
144
+ messages.push(Message.new(:info, cart_create_reply.resultIO.string, 0, :result))
145
+ messages.push(Message.new(:info, cart_create_reply.appInfoIO.string, 0, :appinfo))
146
+ return render_success(:created, "cartridge", cartridge, "EMBED_CARTRIDGE", log_msg, nil, nil, messages)
147
+
148
+ end
149
+ end if application.embedded
150
+ render_error(:internal_server_error, "Cartridge #{name} not embedded within application #{id}", nil, "EMBED_CARTRIDGE")
151
+ end
152
+
153
+ # DELETE /domains/[domain_id]/applications/[application_id]/cartridges/[id]
154
+ def destroy
155
+ domain_id = params[:domain_id]
156
+ id = params[:application_id]
157
+ cartridge = params[:id]
158
+
159
+ domain = Domain.get(@cloud_user, domain_id)
160
+ return render_format_error(:not_found, "Domain #{domain_id} not found", 127,
161
+ "REMOVE_CARTRIDGE") if !domain || !domain.hasAccess?(@cloud_user)
162
+
163
+ @domain_name = domain.namespace
164
+ application = get_application(id)
165
+ return render_format_error(:not_found, "Application '#{id}' not found for domain '#{domain_id}'",
166
+ 101, "REMOVE_CARTRIDGE") unless application
167
+
168
+ @application_name = application.name
169
+ @application_uuid = application.uuid
170
+ return render_format_error(:bad_request, "Cartridge #{cartridge} not embedded within application #{id}",
171
+ 129, "REMOVE_CARTRIDGE") if !application.embedded or !application.embedded.has_key?(cartridge)
172
+
173
+ begin
174
+ Rails.logger.debug "Removing #{cartridge} from application #{id}"
175
+ application.remove_dependency(cartridge)
176
+ rescue Exception => e
177
+ return render_format_exception(e, "REMOVE_CARTRIDGE")
178
+ end
179
+
180
+ application = get_application(id)
181
+ if $requested_api_version == 1.0
182
+ app = RestApplication10.new(application, get_url, nolinks)
183
+ else
184
+ app = RestApplication12.new(application, get_url, nolinks)
185
+ end
186
+ render_format_success(:ok, "application", app, "REMOVE_CARTRIDGE", "Removed #{cartridge} from application #{id}", true)
187
+ end
188
+
189
+ # UPDATE /domains/[domain_id]/applications/[application_id]/cartridges/[id]
190
+ def update
191
+ domain_id = params[:domain_id]
192
+ app_id = params[:application_id]
193
+ cartridge_name = params[:id]
194
+ additional_storage = params[:additional_gear_storage]
195
+ scales_from = params[:scales_from]
196
+ scales_to = params[:scales_to]
197
+
198
+ domain = Domain.get(@cloud_user, domain_id)
199
+ return render_format_error(:not_found, "Domain #{domain_id} not found", 127,
200
+ "UPDATE_CARTRIDGE") if !domain || !domain.hasAccess?(@cloud_user)
201
+
202
+ @domain_name = domain.namespace
203
+ application = get_application(app_id)
204
+ return render_format_error(:not_found, "Application '#{app_id}' not found for domain '#{domain_id}'",
205
+ 101, "UPDATE_CARTRIDGE") unless application
206
+ #used for user action log
207
+ @application_name = application.name
208
+ @application_uuid = application.uuid
209
+ return render_format_error(:bad_request, "Cartridge #{cartridge_name} for application #{app_id} not found",
210
+ 129, "UPDATE_CARTRIDGE") if ((!application.embedded or !application.embedded.has_key?(cartridge_name)) and application.framework!=cartridge_name)
211
+
212
+ storage_map = {}
213
+ application.comp_instance_map.values.each do |cinst|
214
+ if cinst.parent_cart_name==cartridge_name
215
+ group_name = cinst.group_instance_name
216
+ storage_map[group_name] = [] unless storage_map.has_key?(group_name)
217
+ storage_map[group_name] << cinst
218
+ end
219
+ end
220
+ return render_format_error(:not_found, "Cartridge '#{cartridge_name}' for application '#{app_id}' not found",
221
+ 129, "UPDATE_CARTRIDGE") unless storage_map.keys.length>0
222
+
223
+ #only update attributes that are specified
224
+ if additional_storage and additional_storage!=0
225
+ max_storage = @cloud_user.capabilities['max_storage_per_gear']
226
+ return render_format_error(:forbidden, "User is not allowed to change storage quota", 164,
227
+ "UPDATE_CARTRIDGE") unless max_storage
228
+ num_storage = nil
229
+ begin
230
+ num_storage = Integer(additional_storage)
231
+ rescue => e
232
+ return render_format_error(:unprocessable_entity, "Invalid storage value provided.", 165, "UPDATE_CARTRIDGE", "additional_gear_storage")
233
+ end
234
+ begin
235
+ # first check against max_storage limit
236
+ storage_map.each do |group_name, component_instance_list|
237
+ ginst = application.group_instance_map[group_name]
238
+ current_sum = 0
239
+ component_instance_list.each { |cinst| current_sum += cinst.addtl_fs_gb }
240
+ current_sum = ginst.addtl_fs_gb-current_sum
241
+ current_sum += ginst.get_cached_min_storage_in_gb
242
+ current_sum += num_storage
243
+ return render_format_error(:forbidden, "Total additional storage for all cartridges on gear should be less than max_storage_per_gear (new_storage: #{current_sum}, max: #{max_storage}).", 166, "UPDATE_CARTRIDGE", "additional_gear_storage") if current_sum>max_storage
244
+ end
245
+ # now actually change the quota
246
+ storage_map.each do |group_name, component_instance_list|
247
+ each_component_share = (Float(num_storage))/component_instance_list.length
248
+ ginst = application.group_instance_map[group_name]
249
+ component_instance_list.each { |cinst| cinst.set_additional_quota(application, each_component_share) }
250
+ end
251
+ application.save
252
+ rescue Exception => e
253
+ return render_format_exception(e, "UPDATE_CARTRIDGE")
254
+ end
255
+ end
256
+
257
+ if scales_from or scales_to
258
+ begin
259
+ application.set_user_min_max(storage_map, scales_from, scales_to)
260
+ rescue OpenShift::UserException=>e
261
+ return render_format_error(:unprocessable_entity, e.message, 168,
262
+ "UPDATE_CARTRIDGE")
263
+ rescue Exception=>e
264
+ return render_format_error(:forbidden, e.message, 164,
265
+ "UPDATE_CARTRIDGE")
266
+ end
267
+ end
268
+ cart_type = cartridge_name==application.framework ? "standalone" : "embedded"
269
+ if $requested_api_version == 1.0
270
+ cartridge = RestCartridge10.new(cart_type, cartridge_name, application, get_url, nil, nolinks)
271
+ else
272
+ cartridge = RestCartridge11.new(cart_type, cartridge_name, application, get_url, nil, nolinks)
273
+ end
274
+ render_format_success(:ok, "cartridge", cartridge, "UPDATE_CARTRIDGE", "Updated #{cartridge_name} from application #{app_id}", true)
275
+ end
276
+ end