openshift-origin-controller 1.3.2

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of openshift-origin-controller might be problematic. Click here for more details.

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,52 @@
1
+ class EmbCartEventsController < BaseController
2
+ respond_to :xml, :json
3
+ before_filter :authenticate, :check_version
4
+
5
+ # POST /domain/[domain_id]/applications/[application_id]/cartridges/[cartridge_id]/events
6
+ def create
7
+ domain_id = params[:domain_id]
8
+ id = params[:application_id]
9
+ cartridge = params[:cartridge_id]
10
+ event = params[:event]
11
+
12
+ domain = Domain.get(@cloud_user, domain_id)
13
+ return render_error(:not_found, "Domain #{domain_id} not found", 127,
14
+ "CARTRIDGE_EVENT") if !domain || !domain.hasAccess?(@cloud_user)
15
+
16
+ @domain_name = domain.namespace
17
+ application = get_application(id)
18
+ return render_error(:not_found, "Application '#{id}' not found for domain '#{domain_id}'",
19
+ 101, "CARTRIDGE_EVENT") unless application
20
+
21
+ @application_name = application.name
22
+ @application_uuid = application.uuid
23
+ return render_error(:bad_request, "Cartridge #{cartridge} not embedded within application #{id}",
24
+ 129, "CARTRIDGE_EVENT") if !application.embedded or !application.embedded.has_key?(cartridge)
25
+
26
+ begin
27
+ case event
28
+ when 'start'
29
+ application.start(cartridge)
30
+ when 'stop'
31
+ application.stop(cartridge)
32
+ when 'restart'
33
+ application.restart(cartridge)
34
+ when 'reload'
35
+ application.reload(cartridge)
36
+ else
37
+ return render_error(:bad_request, "Invalid event '#{event}' for embedded cartridge #{cartridge} within application '#{id}'",
38
+ 126, "CARTRIDGE_EVENT")
39
+ end
40
+ rescue Exception => e
41
+ return render_exception(e, "CARTRIDGE_EVENT")
42
+ end
43
+
44
+ application = get_application(id)
45
+ if $requested_api_version >= 1.2
46
+ app = RestApplication12.new(application, get_url, nolinks)
47
+ else
48
+ app = RestApplication10.new(application, get_url, nolinks)
49
+ end
50
+ render_success(:ok, "application", app, "CARTRIDGE_EVENT", "Added #{event} on #{cartridge} for application #{id}", true)
51
+ end
52
+ end
@@ -0,0 +1,11 @@
1
+ class EnvironmentController < BaseController
2
+ respond_to :xml, :json
3
+ before_filter :check_version
4
+
5
+ # GET /environment
6
+ def show
7
+ environment = {}
8
+ environment['domain_suffix'] = Rails.application.config.openshift[:domain_suffix]
9
+ render_success(:ok, "environment", environment, "GET_ENVIRONMENT", "Showing broker environment")
10
+ end
11
+ end
@@ -0,0 +1,71 @@
1
+ class EstimatesController < BaseController
2
+ respond_to :xml, :json
3
+ before_filter :authenticate, :check_version
4
+
5
+ # GET /estimates
6
+ def index
7
+ render_success(:ok, "estimates", RestEstimates.new(get_url, nolinks), "LIST_ESTIMATES")
8
+ end
9
+
10
+ # GET /estimates/<id>
11
+ def show
12
+ obj = params[:id]
13
+ descriptor = params[:descriptor]
14
+
15
+ begin
16
+ raise OpenShift::EstimatesException.new("Invalid estimate object. Estimates only valid for objects: 'application'") if obj != "application"
17
+ raise OpenShift::EstimatesException.new("Application 'descriptor' NOT specified") if !descriptor
18
+ # Get available framework cartridges
19
+ standalone_carts = Application.get_available_cartridges("standalone")
20
+
21
+ # Parse given application descriptor
22
+ descriptor.gsub!('\n', "\n")
23
+ descriptor_hash = YAML.load(descriptor)
24
+ #log_action(@request_id, @cloud_user.uuid, @cloud_user.login, "SHOW_ESTIMATE", false, "Invalid application descriptor") unless descriptor_hash
25
+ raise OpenShift::EstimatesException.new("Invalid application descriptor.") unless descriptor_hash
26
+
27
+ # Find app framework
28
+ framework = nil
29
+ descriptor_hash['Requires'].each do |cart|
30
+ if standalone_carts.include?(cart)
31
+ framework = cart
32
+ break
33
+ end
34
+ end if descriptor_hash.has_key?('Requires')
35
+ app_name = descriptor_hash['Name'] || nil
36
+
37
+ #log_action(@request_id, @cloud_user.uuid, @cloud_user.login, "SHOW_ESTIMATE", false, "Application name or framework not found in the descriptor") if !framework or !app_name
38
+ raise OpenShift::EstimatesException.new("Application name or framework not found in the descriptor.") if !framework or !app_name
39
+
40
+ # Elaborate app descriptor
41
+ template = ApplicationTemplate.new
42
+ template.descriptor_yaml = descriptor
43
+ app = Application.new(nil, app_name, nil, nil, framework, template)
44
+ app.elaborate_descriptor
45
+
46
+ # Generate output
47
+ groups = []
48
+ app.group_instance_map.values.uniq.each do |ginst|
49
+ components = []
50
+ ginst.component_instances.each do |cname|
51
+ cinst = app.comp_instance_map[cname]
52
+ next if cinst.parent_cart_name == app.name
53
+ comp = {}
54
+ comp['Name'] = cinst.parent_cart_name
55
+ components.push comp
56
+ end if ginst
57
+
58
+ if !components.empty?
59
+ app_gear = RestApplicationEstimate.new(components)
60
+ groups.push(app_gear)
61
+ end
62
+ end if app.group_instance_map
63
+
64
+ render_success(:ok, "application_estimates", groups, "SHOW_ESTIMATE")
65
+ rescue OpenShift::EstimatesException => e
66
+ return render_error(:unprocessable_entity, e.message, 130, "SHOW_ESTIMATE")
67
+ rescue Exception => e
68
+ return render_exception(e, "SHOW_ESTIMATE")
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,53 @@
1
+ class GearGroupsController < BaseController
2
+ respond_to :xml, :json
3
+ before_filter :authenticate, :check_version
4
+
5
+ # GET /domains/[domain_id]/applications/[application_id]/gear_groups
6
+ def index
7
+ domain_id = params[:domain_id]
8
+ app_id = params[:application_id]
9
+
10
+ domain = Domain.get(@cloud_user, domain_id)
11
+ return render_error(:not_found, "Domain #{domain_id} not found", 127,
12
+ "LIST_GEAR_GROUPS") if !domain || !domain.hasAccess?(@cloud_user)
13
+
14
+ @domain_name = domain.namespace
15
+ app = Application.find(@cloud_user,app_id)
16
+ return render_error(:not_found, "Application '#{app_id}' not found for domain '#{domain_id}'",
17
+ 101, "LIST_GEAR_GROUPS") unless app
18
+
19
+ @application_name = app.name
20
+ @application_uuid = app.uuid
21
+ gear_states = app.show_state()
22
+ group_instances = app.group_instances.map{ |group_inst| RestGearGroup.new(group_inst, gear_states, get_url, nolinks)}
23
+ render_success(:ok, "gear_groups", group_instances, "LIST_GEAR_GROUPS",
24
+ "Showing gear groups for application '#{app_id}' with domain '#{domain_id}'")
25
+ end
26
+
27
+ # GET /domains/[domain_id]/applications/[application_id]/gear_groups/[id]
28
+ def show
29
+ domain_id = params[:domain_id]
30
+ app_id = params[:application_id]
31
+ gear_group_id = params[:id]
32
+
33
+ domain = Domain.get(@cloud_user, domain_id)
34
+ return render_error(:not_found, "Domain #{domain_id} not found", 127,
35
+ "GET_GEAR_GROUP") if !domain || !domain.hasAccess?(@cloud_user)
36
+
37
+ @domain_name = domain.namespace
38
+ app = Application.find(@cloud_user,app_id)
39
+ return render_error(:not_found, "Application '#{app_id}' not found for domain '#{domain_id}'",
40
+ 101, "GET_GEAR_GROUP") unless app
41
+
42
+ @application_name = app.name
43
+ @application_uuid = app.uuid
44
+ selected_gear_group = GroupInstance.get(app, gear_group_id)
45
+ return render_error(:not_found, "Gear group '#{gear_group_id}' for application '#{app_id}' not found",
46
+ 163, "GET_GEAR_GROUP") unless selected_gear_group
47
+
48
+ gear_states = app.show_state()
49
+ group = RestGearGroup.new(selected_gear_group, gear_states, get_url, nolinks)
50
+ render_success(:ok, "gear_group", group, "GET_GEAR_GROUP",
51
+ "Showing gear group '#{app_id}' for application '#{app_id}' with domain '#{domain_id}'")
52
+ end
53
+ end
@@ -0,0 +1,70 @@
1
+ class GearsController < BaseController
2
+ respond_to :xml, :json
3
+ before_filter :authenticate, :check_version
4
+
5
+ def show
6
+ domain_id = params[:domain_id]
7
+ app_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
+ "LIST_GEARS") if !domain || !domain.hasAccess?(@cloud_user)
12
+
13
+ @domain_name = domain.namespace
14
+ app = get_application(app_id)
15
+ return render_error(:not_found, "Application '#{app_id}' not found for domain '#{domain_id}'",
16
+ 101, "LIST_GEARS") unless app
17
+
18
+ @application_name = app.name
19
+ @application_uuid = app.uuid
20
+ begin
21
+ app_gears_info = []
22
+ gears = app.group_instances.uniq.map{ |ginst| ginst.gears }.flatten
23
+
24
+ has_proxy_cart = false
25
+ rx1 = Regexp.new(/^PROXY_HOST=(.*)/)
26
+ rx2 = Regexp.new(/^PROXY_PORT=(.*)/)
27
+ rx3 = Regexp.new(/^PORT=(.*)/)
28
+
29
+ gears.each do |gear|
30
+ comp_list = []
31
+ gear.configured_components.each do |cname|
32
+ comp_inst = app.comp_instance_map[cname]
33
+ has_proxy_cart = true if app.proxy_cartridge and cname.include? app.proxy_cartridge
34
+ next if comp_inst.parent_cart_name == app.name
35
+
36
+ begin
37
+ res = gear.show_port(comp_inst).data
38
+
39
+ m = rx1.match(res)
40
+ proxy_host = m[1] if m
41
+ m = rx2.match(res)
42
+ proxy_port = m[1].to_i if m
43
+ m = rx3.match(res)
44
+ internal_port = m[1].to_i if m
45
+ rescue
46
+ #ignore
47
+ end
48
+
49
+ comp_info = {
50
+ 'name' => comp_inst.parent_cart_name,
51
+ 'proxy_host' => proxy_host,
52
+ 'proxy_port' => proxy_port,
53
+ 'internal_port' => internal_port
54
+ }
55
+ if comp_inst.cart_properties and comp_inst.cart_properties.length > 0
56
+ comp_info = comp_inst.cart_properties.merge comp_info
57
+ end
58
+ comp_list.push comp_info
59
+ end
60
+
61
+ gear_info = RestGear.new(gear.uuid, comp_list)
62
+ app_gears_info.push gear_info
63
+ end
64
+ render_success(:ok, "gears", app_gears_info, "LIST_GEARS",
65
+ "Showing gears for application '#{app_id}' for domain '#{domain_id}'")
66
+ rescue Exception => e
67
+ return render_exception(e, "LIST_GEARS")
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,96 @@
1
+ class KeysController < BaseController
2
+ respond_to :xml, :json
3
+ before_filter :authenticate, :check_version
4
+
5
+ #GET /user/keys
6
+ def index
7
+ ssh_keys = Array.new
8
+ @cloud_user.ssh_keys.each do |name, key|
9
+ ssh_key = RestKey.new(name, key["key"], key["type"], get_url, nolinks)
10
+ ssh_keys.push(ssh_key)
11
+ end if @cloud_user.ssh_keys
12
+ render_success(:ok, "keys", ssh_keys, "LIST_KEYS", "Found #{ssh_keys.length} ssh keys")
13
+ end
14
+
15
+ #GET /user/keys/<id>
16
+ def show
17
+ id = params[:id]
18
+ @cloud_user.ssh_keys.each do |key_name, key|
19
+ return render_success(:ok, "key", RestKey.new(key_name, key["key"], key["type"], get_url, nolinks),
20
+ "SHOW_KEY", "Found SSH key '#{id}'") if key_name == id
21
+ end if @cloud_user.ssh_keys
22
+ render_error(:not_found, "SSH key '#{id}' not found", 118, "SHOW_KEY")
23
+ end
24
+
25
+ #POST /user/keys
26
+ def create
27
+ content = params[:content]
28
+ name = params[:name]
29
+ type = params[:type]
30
+
31
+ Rails.logger.debug "Creating key name:#{name} type:#{type} for user #{@login}"
32
+
33
+ key = Key.new(name, type, content)
34
+ if key.invalid?
35
+ messages = get_error_messages(key)
36
+ return render_error(:unprocessable_entity, nil, nil, "ADD_KEY", nil, nil, messages)
37
+ end
38
+
39
+ @cloud_user.ssh_keys.each do |key_name, key|
40
+ return render_error(:conflict, "SSH key with name #{name} already exists. Use a different name or delete conflicting key and retry.",
41
+ 120, "ADD_KEY", "name") if key_name == name
42
+ return render_error(:conflict, "Given public key is already in use. Use different key or delete conflicting key and retry.",
43
+ 121, "ADD_KEY", "content") if key["key"] == content
44
+ end if @cloud_user.ssh_keys
45
+
46
+ begin
47
+ @cloud_user.add_ssh_key(name, content, type)
48
+ @cloud_user.save
49
+ ssh_key = RestKey.new(name, @cloud_user.ssh_keys[name]["key"], @cloud_user.ssh_keys[name]["type"], get_url, nolinks)
50
+ render_success(:created, "key", ssh_key, "ADD_KEY", "Created SSH key #{name}", true)
51
+ rescue Exception => e
52
+ return render_exception(e, "ADD_KEY")
53
+ end
54
+ end
55
+
56
+ #PUT /user/keys/<id>
57
+ def update
58
+ id = params[:id]
59
+ content = params[:content]
60
+ type = params[:type]
61
+
62
+ Rails.logger.debug "Updating key name:#{id} type:#{type} for user #{@login}"
63
+ key = Key.new(id, type, content)
64
+ if key.invalid?
65
+ messages = get_error_messages(key)
66
+ return render_format_error(:unprocessable_entity, nil, nil, "UPDATE_KEY", nil, nil, messages)
67
+ end
68
+
69
+ return render_format_error(:not_found, "SSH key '#{id}' not found", 118,
70
+ "UPDATE_KEY") if !@cloud_user.ssh_keys or !@cloud_user.ssh_keys.has_key?(id)
71
+
72
+ begin
73
+ @cloud_user.update_ssh_key(content, type, id)
74
+ @cloud_user.save
75
+ ssh_key = RestKey.new(id, @cloud_user.ssh_keys[id]["key"], @cloud_user.ssh_keys[id]["type"], get_url, nolinks)
76
+ render_format_success(:ok, "key", ssh_key, "UPDATE_KEY", "Updated SSH key #{id}", true)
77
+ rescue Exception => e
78
+ return render_format_exception(e, "UPDATE_KEY")
79
+ end
80
+ end
81
+
82
+ #DELETE /user/keys/<id>
83
+ def destroy
84
+ id = params[:id]
85
+ return render_format_error(:not_found, "SSH key '#{id}' not found", 118,
86
+ "DELETE_KEY") if !@cloud_user.ssh_keys or !@cloud_user.ssh_keys.has_key?(id)
87
+
88
+ begin
89
+ @cloud_user.remove_ssh_key(id)
90
+ @cloud_user.save
91
+ render_format_success(:no_content, nil, nil, "DELETE_KEY", "Deleted SSH key #{id}", true)
92
+ rescue Exception => e
93
+ return render_format_exception(e, "DELETE_KEY")
94
+ end
95
+ end
96
+ end
@@ -0,0 +1,510 @@
1
+ class LegacyBrokerController < ApplicationController
2
+ layout nil
3
+ before_filter :validate_request, :process_notification
4
+ before_filter :authenticate, :except => :cart_list_post
5
+ rescue_from Exception, :with => :exception_handler
6
+ include LegacyBrokerHelper
7
+ include UserActionLogger
8
+ include CartridgeHelper
9
+
10
+ # Initialize domain/app variables to be used for logging in user_action.log
11
+ # The values will be set in the controllers handling the requests
12
+ @domain_name = nil
13
+ @application_name = nil
14
+ @application_uuid = nil
15
+
16
+ def user_info_post
17
+ if @cloud_user
18
+ user_info = @cloud_user.as_json
19
+ #FIXME: This is redundant, for now keeping it for backward compatibility
20
+ key_info = @cloud_user.get_ssh_key
21
+ if key_info
22
+ user_info["ssh_key"] = key_info['key']
23
+ user_info["ssh_type"] = key_info['type']
24
+ else
25
+ user_info["ssh_key"] = ""
26
+ user_info["ssh_type"] = ""
27
+ end
28
+
29
+ user_info["rhlogin"] = user_info["login"]
30
+ user_info.delete("login")
31
+ # this is to support old version of client tools
32
+ if @cloud_user.domains and @cloud_user.domains.length > 0
33
+ user_info["namespace"] = @cloud_user.domains.first.namespace
34
+ end
35
+ user_info[:rhc_domain] = Rails.configuration.openshift[:domain_suffix]
36
+ app_info = {}
37
+ unless @cloud_user.applications.nil?
38
+ @cloud_user.applications.each do |app|
39
+ app_info[app.name] = {
40
+ "framework" => app.framework,
41
+ "creation_time" => app.creation_time,
42
+ "uuid" => app.uuid,
43
+ "aliases" => app.aliases,
44
+ "embedded" => app.embedded
45
+ }
46
+ end
47
+ end
48
+
49
+ log_action(@request_id, @cloud_user.uuid, @login, "LEGACY_USER_INFO", true, "", get_extra_log_args)
50
+ @reply.data = {:user_info => user_info, :app_info => app_info}.to_json
51
+ render :json => @reply
52
+ else
53
+ log_action(@request_id, "nil", @login, "LEGACY_USER_INFO", true, "User not found", get_extra_log_args)
54
+ # Return a 404 to denote the user doesn't exist
55
+ @reply.resultIO << "User does not exist"
56
+ @reply.exitcode = 99
57
+
58
+ render :json => @reply, :status => :not_found
59
+ end
60
+ end
61
+
62
+ def ssh_keys_post
63
+ if @cloud_user
64
+ case @req.action
65
+ when "add-key"
66
+ raise OpenShift::UserKeyException.new("Missing SSH key or key name", 119) if @req.ssh.nil? or @req.key_name.nil?
67
+ if @cloud_user.ssh_keys
68
+ raise OpenShift::UserKeyException.new("Key with name #{@req.key_name} already exists. Please choose a different name", 120) if @cloud_user.ssh_keys.has_key?(@req.key_name)
69
+ end
70
+ @cloud_user.add_ssh_key(@req.key_name, @req.ssh, @req.key_type)
71
+ @cloud_user.save
72
+ when "remove-key"
73
+ raise OpenShift::UserKeyException.new("Missing key name", 119) if @req.key_name.nil?
74
+ @cloud_user.remove_ssh_key(@req.key_name)
75
+ @cloud_user.save
76
+ when "update-key"
77
+ raise OpenShift::UserKeyException.new("Missing SSH key or key name", 119) if @req.ssh.nil? or @req.key_name.nil?
78
+ @cloud_user.update_ssh_key(@req.ssh, @req.key_type, @req.key_name)
79
+ @cloud_user.save
80
+ when "list-keys"
81
+ #FIXME: when client tools are updated
82
+ if @cloud_user.ssh_keys.nil? || @cloud_user.ssh_keys.empty?
83
+ @reply.data = {:keys => {}, :ssh_key => "", :ssh_type => ""}.to_json
84
+ else
85
+ other_keys = @cloud_user.ssh_keys.reject {|k, v| k == Key::DEFAULT_SSH_KEY_NAME }
86
+ if @cloud_user.ssh_keys.has_key?(Key::DEFAULT_SSH_KEY_NAME)
87
+ default_key = @cloud_user.ssh_keys[Key::DEFAULT_SSH_KEY_NAME]['key']
88
+ default_key_type = @cloud_user.ssh_keys[Key::DEFAULT_SSH_KEY_NAME]['type']
89
+ else
90
+ default_key = default_key_type = ""
91
+ end
92
+
93
+ @reply.data = { :keys => other_keys,
94
+ :ssh_key => default_key,
95
+ :ssh_type => default_key_type,
96
+ }.to_json
97
+ end
98
+ else
99
+ raise OpenShift::UserKeyException.new("Invalid action #{@req.action}", 111)
100
+ end
101
+ log_action(@request_id, @cloud_user.uuid, @login, "LEGACY_SSH_KEY", true, "Successfully completed action: #{@req.action}", get_extra_log_args)
102
+ render :json => @reply
103
+ else
104
+ raise OpenShift::UserException.new("Invalid user", 99)
105
+ end
106
+ end
107
+
108
+ def domain_post
109
+ domain = get_domain(@cloud_user, @req.namespace)
110
+ domain = @cloud_user.domains.first if !domain && @req.alter
111
+
112
+ if (!domain or not domain.hasFullAccess?(@cloud_user)) && (@req.alter || @req.delete)
113
+ log_action(@request_id, @cloud_user.uuid, @login, "LEGACY_ALTER_DOMAIN", true, "Cannot alter or remove namespace #{@req.namespace}. Namespace does not exist.", get_extra_log_args)
114
+ @reply.resultIO << "Cannot alter or remove namespace #{@req.namespace}. Namespace does not exist.\n"
115
+ @reply.exitcode = 106
116
+ render :json => @reply, :status => :bad_request
117
+ return
118
+ end
119
+
120
+ if @req.alter
121
+
122
+ Rails.logger.debug "Updating namespace for domain #{domain.uuid} from #{domain.namespace} to #{@req.namespace}"
123
+
124
+ raise OpenShift::UserException.new("The supplied namespace '#{@req.namespace}' is not allowed", 106) if OpenShift::ApplicationContainerProxy.blacklisted? @req.namespace
125
+ begin
126
+ if domain.namespace != @req.namespace
127
+ domain.namespace = @req.namespace
128
+ @reply.append domain.save
129
+ log_action(@request_id, @cloud_user.uuid, @login, "LEGACY_ALTER_DOMAIN", true, "Updated namespace for domain #{domain.uuid} to #{@req.namespace}", get_extra_log_args)
130
+ end
131
+ rescue Exception => e
132
+ log_action(@request_id, @cloud_user.uuid, @login, "LEGACY_ALTER_DOMAIN", false, "Failed to updated namespace for domain #{domain.uuid} to #{@req.namespace}", get_extra_log_args)
133
+ Rails.logger.error "Failed to update domain #{domain.uuid} from #{domain.namespace} to #{@req.namespace} #{e.message}"
134
+ Rails.logger.error e.backtrace
135
+ raise
136
+ end
137
+
138
+ if @req.ssh
139
+ @cloud_user.update_ssh_key(@req.ssh, @req.key_type, @req.key_name)
140
+ @cloud_user.save
141
+ log_action(@request_id, @cloud_user.uuid, @login, "LEGACY_ALTER_DOMAIN", true, "Updated SSH key '#{@req.key_name}' for domain #{domain.namespace}", get_extra_log_args)
142
+ end
143
+ elsif @req.delete
144
+ if not domain.hasFullAccess?(@cloud_user)
145
+ log_action(@request_id, @cloud_user.uuid, @login, "LEGACY_DELETE_DOMAIN", true, "Domain #{domain.namespace} is not associated with user", get_extra_log_args)
146
+ @reply.resultIO << "Cannot remove namespace #{@req.namespace}. This namespace is not associated with login: #{@cloud_user.login}\n"
147
+ @reply.exitcode = 106
148
+ render :json => @reply, :status => :bad_request
149
+ return
150
+ end
151
+ if not @cloud_user.applications.empty?
152
+ @cloud_user.applications.each do |app|
153
+ if app.domain.uuid == domain.uuid
154
+ log_action(@request_id, @cloud_user.uuid, @login, "LEGACY_DELETE_DOMAIN", true, "Domain #{domain.namespace} contains applications", get_extra_log_args)
155
+ @reply.resultIO << "Cannot remove namespace #{@req.namespace}. Remove existing app(s) first: "
156
+ @reply.resultIO << @cloud_user.applications.map{|a| a.name}.join("\n")
157
+ @reply.exitcode = 106
158
+ render :json => @reply, :status => :bad_request
159
+ return
160
+ end
161
+ end
162
+ end
163
+ @reply.append domain.delete
164
+ log_action(@request_id, @cloud_user.uuid, @login, "LEGACY_DELETE_DOMAIN", true, "Deleted domain #{@req.namespace}", get_extra_log_args)
165
+ render :json => @reply
166
+ return
167
+ else
168
+ raise OpenShift::UserException.new("The supplied namespace '#{@req.namespace}' is not allowed", 106) if OpenShift::ApplicationContainerProxy.blacklisted? @req.namespace
169
+ raise OpenShift::UserException.new("Domain already exists for user. Update the domain to modify.", 158) if !@cloud_user.domains.empty?
170
+
171
+ key = Key.new(Key::DEFAULT_SSH_KEY_NAME, @req.key_type, @req.ssh)
172
+ if key.invalid?
173
+ log_action(@request_id, @cloud_user.uuid, @login, "LEGACY_CREATE_DOMAIN", true, "Failed to create domain #{@req.namespace}: #{key.errors.first[1][:message]}", get_extra_log_args)
174
+ @reply.resultIO << key.errors.first[1][:message]
175
+ @reply.exitcode = key.errors.first[1][:exit_code]
176
+ render :json => @reply, :status => :bad_request
177
+ return
178
+ end
179
+ @cloud_user.add_ssh_key(Key::DEFAULT_SSH_KEY_NAME, @req.ssh, @req.key_type)
180
+ domain = Domain.new(@req.namespace, @cloud_user)
181
+ @reply.append domain.save
182
+ log_action(@request_id, @cloud_user.uuid, @login, "LEGACY_CREATE_DOMAIN", true, "Created domain #{@req.namespace}", get_extra_log_args)
183
+ end
184
+
185
+ @reply.append @cloud_user.save
186
+ @reply.data = {
187
+ :rhlogin => @cloud_user.login,
188
+ :uuid => @cloud_user.uuid,
189
+ :rhc_domain => Rails.configuration.openshift[:domain_suffix]
190
+ }.to_json
191
+
192
+ render :json => @reply
193
+ end
194
+
195
+ def cart_list_post
196
+ cart_type = @req.cart_type
197
+ unless cart_type
198
+ log_action('nil', 'nil', 'nil', "LEGACY_CART_LIST", true, "Cartridge type not specified", get_extra_log_args)
199
+ @reply.resultIO << "Invalid cartridge types: #{cart_type} specified"
200
+ @reply.exitcode = 109
201
+ render :json => @reply, :status => :bad_request
202
+ return
203
+ end
204
+
205
+ cache_key = "cart_list_#{cart_type}"
206
+ carts = get_cached(cache_key, :expires_in => 21600.seconds) {
207
+ Application.get_available_cartridges(cart_type)
208
+ }
209
+ log_action('nil', 'nil', 'nil', "LEGACY_CART_LIST")
210
+ @reply.data = { :carts => carts }.to_json
211
+ render :json => @reply
212
+ end
213
+
214
+ def cartridge_post
215
+ raise OpenShift::UserException.new("Invalid user", 99) if @cloud_user.nil?
216
+
217
+ case @req.action
218
+ when 'configure' #create app and configure framework
219
+ apps = @cloud_user.applications
220
+ domain = @cloud_user.domains.first
221
+ app = Application.new(@cloud_user, @req.app_name, nil, @req.node_profile, @req.cartridge, nil, false, domain)
222
+ check_cartridge_type(@req.cartridge, "standalone")
223
+ if (@cloud_user.consumed_gears >= @cloud_user.max_gears)
224
+ raise OpenShift::UserException.new("#{@login} has already reached the gear limit of #{@cloud_user.max_gears}", 104)
225
+ end
226
+ raise OpenShift::UserException.new("The supplied application name '#{app.name}' is not allowed", 105) if OpenShift::ApplicationContainerProxy.blacklisted? app.name
227
+ if app.valid?
228
+ @domain_name = domain.namespace
229
+ @application_name = app.name
230
+ @application_uuid = app.uuid
231
+ begin
232
+ app.user_agent = request.headers["User-Agent"]
233
+ Rails.logger.debug "Creating application #{app.name}"
234
+ @reply.append app.create
235
+ Rails.logger.debug "Configuring dependencies #{app.name}"
236
+ @reply.append app.configure_dependencies
237
+
238
+ app.execute_connections
239
+ begin
240
+ @reply.append app.create_dns
241
+
242
+ case app.framework_cartridge
243
+ when 'php'
244
+ page = 'health_check.php'
245
+ when 'perl'
246
+ page = 'health_check.pl'
247
+ else
248
+ page = 'health'
249
+ end
250
+
251
+ @reply.data = {:health_check_path => page, :uuid => app.uuid}.to_json
252
+ rescue Exception => e
253
+ @reply.append app.destroy_dns
254
+ raise
255
+ end
256
+ rescue Exception => e
257
+ log_action(@request_id, @cloud_user.uuid, @login, "LEGACY_CREATE_APP", false, "Failed to create application #{app.name}: #{e.message}", get_extra_log_args)
258
+ @reply.append app.destroy(true)
259
+ if app.persisted?
260
+ app.delete
261
+ end
262
+ @reply.resultIO = StringIO.new(e.message)
263
+ raise
264
+ end
265
+ log_action(@request_id, @cloud_user.uuid, @login, "LEGACY_CREATE_APP", true, "Created application #{app.name}", get_extra_log_args)
266
+ @reply.resultIO << "Successfully created application: #{app.name}" if @reply.resultIO.length == 0
267
+ else
268
+ log_action(@request_id, @cloud_user.uuid, @login, "LEGACY_CREATE_APP", true, "Invalid application: #{app.errors.first[1][:message]}", get_extra_log_args)
269
+ @reply.resultIO << app.errors.first[1][:message]
270
+ @reply.exitcode = app.errors.first[1][:exit_code]
271
+ render :json => @reply, :status => :bad_request
272
+ return
273
+ end
274
+ when 'deconfigure'
275
+ app = get_app_from_request(@cloud_user)
276
+ @reply.append app.cleanup_and_delete
277
+ @reply.resultIO << "Successfully destroyed application: #{app.name}"
278
+ when 'start'
279
+ app = get_app_from_request(@cloud_user)
280
+ @reply.append app.start(app.framework)
281
+ when 'stop'
282
+ app = get_app_from_request(@cloud_user)
283
+ @reply.append app.stop(app.framework)
284
+ when 'restart'
285
+ app = get_app_from_request(@cloud_user)
286
+ @reply.append app.restart(app.framework)
287
+ when 'force-stop'
288
+ app = get_app_from_request(@cloud_user)
289
+ @reply.append app.force_stop(app.framework)
290
+ when 'reload'
291
+ app = get_app_from_request(@cloud_user)
292
+ @reply.append app.reload(app.framework)
293
+ when 'status'
294
+ app = get_app_from_request(@cloud_user)
295
+ @reply.append app.status(app.framework)
296
+ when 'tidy'
297
+ app = get_app_from_request(@cloud_user)
298
+ @reply.append app.tidy(app.framework)
299
+ when 'add-alias'
300
+ app = get_app_from_request(@cloud_user)
301
+ @reply.append app.add_alias @req.server_alias
302
+ when 'remove-alias'
303
+ app = get_app_from_request(@cloud_user)
304
+ @reply.append app.remove_alias @req.server_alias
305
+ when 'threaddump'
306
+ app = get_app_from_request(@cloud_user)
307
+ @reply.append app.threaddump(app.framework)
308
+ when 'expose-port'
309
+ app = get_app_from_request(@cloud_user)
310
+ @reply.append app.expose_port(app.framework)
311
+ when 'conceal-port'
312
+ app = get_app_from_request(@cloud_user)
313
+ @reply.append app.conceal_port(app.framework)
314
+ when 'show-port'
315
+ app = get_app_from_request(@cloud_user)
316
+ @reply.append app.show_port(app.framework)
317
+ when 'system-messages'
318
+ app = get_app_from_request(@cloud_user)
319
+ @reply.append app.system_messages
320
+ else
321
+ raise OpenShift::UserException.new("Invalid action #{@req.action}", 111)
322
+ end
323
+ @reply.resultIO << 'Success' if @reply.resultIO.length == 0
324
+ log_action(@request_id, @cloud_user.uuid, @login, "LEGACY_CARTRIDGE_POST", true, "Processed event #{@req.action} for application #{app.name}", get_extra_log_args)
325
+
326
+ render :json => @reply
327
+ end
328
+
329
+ def embed_cartridge_post
330
+ raise OpenShift::UserException.new("Invalid user", 99) if @cloud_user.nil?
331
+
332
+ app = get_app_from_request(@cloud_user)
333
+ check_cartridge_type(@req.cartridge, "embedded")
334
+
335
+ # making this check here for the specific actions, so that the error codes for other conditions are not affected
336
+ if ['deconfigure', 'start', 'stop', 'restart', 'status', 'reload'].include?(@req.action) and ( app.embedded.nil? or not app.embedded.has_key?(@req.cartridge) )
337
+ raise OpenShift::UserException.new("The application #{app.name} is not configured with the embedded cartridge #{@req.cartridge}.", 129)
338
+ end
339
+
340
+ Rails.logger.debug "DEBUG: Performing action '#{@req.action}'"
341
+ case @req.action
342
+ when 'configure'
343
+ if app.scalable && (@cloud_user.consumed_gears >= @cloud_user.max_gears) && @req.cartridge != 'jenkins-client-1.4' #TODO Need a proper method to let us know if cart will get its own gear
344
+ raise OpenShift::UserException.new("#{@login} has already reached the gear limit of #{@cloud_user.max_gears}", 104)
345
+ end
346
+ @reply.append app.add_dependency(@req.cartridge)
347
+ when 'deconfigure'
348
+ @reply.append app.remove_dependency(@req.cartridge)
349
+ when 'start'
350
+ @reply.append app.start(@req.cartridge)
351
+ when 'stop'
352
+ @reply.append app.stop(@req.cartridge)
353
+ when 'restart'
354
+ @reply.append app.restart(@req.cartridge)
355
+ when 'status'
356
+ @reply.append app.status(@req.cartridge)
357
+ when 'reload'
358
+ @reply.append app.reload(@req.cartridge)
359
+ else
360
+ raise OpenShift::UserException.new("Invalid action #{@req.action}", 111)
361
+ end
362
+
363
+ log_action(@request_id, @cloud_user.uuid, @login, "LEGACY_EMBED_CARTRIDGE_POST", true, "Processed event #{@req.action} for cartridge #{@req.cartridge} of application #{app.name}", get_extra_log_args)
364
+ @reply.resultIO << 'Success' if @reply.resultIO.length == 0
365
+ render :json => @reply
366
+ end
367
+
368
+ protected
369
+
370
+ def process_notification
371
+ message = self.notifications if self.respond_to? "notifications"
372
+ @reply.messageIO << message unless message.nil?
373
+ end
374
+
375
+ # Raise an exception if cartridge type isn't supported
376
+ def check_cartridge_type(framework, cart_type)
377
+ carts = Application.get_available_cartridges(cart_type)
378
+ unless carts.include? framework
379
+ if cart_type == 'standalone'
380
+ raise OpenShift::UserException.new(110), "Invalid application type (-t|--type) specified: '#{framework}'. Valid application types are (#{carts.join(', ')})."
381
+ else
382
+ raise OpenShift::UserException.new(110), "Invalid type (-c|--cartridge) specified: '#{framework}'. Valid cartridge types are (#{carts.join(', ')})."
383
+ end
384
+ end
385
+ end
386
+
387
+ def get_app_from_request(user)
388
+ app = Application.find(user, @req.app_name)
389
+ raise OpenShift::UserException.new("An application named '#{@req.app_name}' does not exist", 101) if app.nil?
390
+ app.user_agent = request.headers["User-Agent"]
391
+
392
+ @application_name = app.name
393
+ @application_uuid = app.uuid
394
+ @domain_name = app.domain.namespace unless app.domain.nil?
395
+
396
+ return app
397
+ end
398
+
399
+ def validate_request
400
+ @reply = ResultIO.new
401
+ begin
402
+ @req = LegacyRequest.new.from_json(params['json_data'])
403
+ if @req.invalid?
404
+ log_action('nil','nil', 'nil', "LEGACY_BROKER", true, "Validation error: #{@req.errors.first[1][:message]}", get_extra_log_args)
405
+ @reply.resultIO << @req.errors.first[1][:message]
406
+ @reply.exitcode = @req.errors.first[1][:exit_code]
407
+ render :json => @reply, :status => :bad_request
408
+ end
409
+ end
410
+ end
411
+
412
+ def authenticate
413
+ @request_id = gen_req_uuid
414
+ begin
415
+ auth = OpenShift::AuthService.instance.login(request, params, cookies)
416
+
417
+ if auth
418
+ @login = auth[:username]
419
+ @auth_method = auth[:auth_method]
420
+
421
+ @cloud_user = CloudUser.find @login
422
+ if @cloud_user.nil?
423
+ Rails.logger.debug "Adding user #{@login}...inside legacy_controller"
424
+ @cloud_user = CloudUser.new(@login)
425
+ begin
426
+ @cloud_user.save
427
+ rescue Exception => e
428
+ cu = CloudUser.find @login
429
+ raise unless cu && (@cloud_user.parent_user_login == cu.parent_user_login)
430
+ @cloud_user = cu
431
+ end
432
+ end
433
+ @cloud_user.auth_method = @auth_method unless @cloud_user.nil?
434
+ end
435
+ unless @login
436
+ log_action('nil','nil', 'nil', "LEGACY_BROKER", true, "Authentication failed: Invalid user credentials", get_extra_log_args)
437
+ @reply.resultIO << "Invalid user credentials"
438
+ @reply.exitcode = 97
439
+ render :json => @reply, :status => :unauthorized
440
+ end
441
+ rescue OpenShift::AccessDeniedException
442
+ log_action('nil','nil', 'nil', "LEGACY_BROKER", true, "Authentication failed: Invalid user credentials", get_extra_log_args)
443
+ @reply.resultIO << "Invalid user credentials"
444
+ @reply.exitcode = 97
445
+ render :json => @reply, :status => :unauthorized
446
+ end
447
+ end
448
+
449
+ def exception_handler(e)
450
+ status = :internal_server_error
451
+
452
+ case e
453
+ when OpenShift::AuthServiceException
454
+ log_action(@request_id, 'nil', 'nil', "LEGACY_BROKER", false, "#{e.class.name} for #{request.path}: #{e.message}", get_extra_log_args)
455
+ Rails.logger.error e.backtrace[0..5].join("\n")
456
+ @reply.append e.resultIO if e.resultIO
457
+ @reply.resultIO << "An error occurred while contacting the authentication service. If the problem persists please contact Red Hat support." if @reply.resultIO.length == 0
458
+ when OpenShift::UserException
459
+ log_action(@request_id.nil? ? 'nil' : @request_id, @cloud_user.nil? ? 'nil' : @cloud_user.uuid, @login.nil? ? 'nil' : @login, "LEGACY_BROKER", true, "#{e.class.name} for #{request.path}: #{e.message}", get_extra_log_args)
460
+ @reply.resultIO << e.message
461
+ status = :bad_request
462
+ when OpenShift::DNSException
463
+ log_action(@request_id.nil? ? 'nil' : @request_id, @cloud_user.nil? ? 'nil' : @cloud_user.uuid, @login.nil? ? 'nil' : @login, "LEGACY_BROKER", false, "#{e.class.name} for #{request.path}: #{e.message}", get_extra_log_args)
464
+ @reply.resultIO << e.message
465
+ status = :service_unavailable
466
+ when OpenShift::OOException
467
+ log_action(@request_id.nil? ? 'nil' : @request_id, @cloud_user.nil? ? 'nil' : @cloud_user.uuid, @login.nil? ? 'nil' : @login, "LEGACY_BROKER", false, "#{e.class.name} for #{request.path}: #{e.message}", get_extra_log_args)
468
+ Rails.logger.error e.backtrace[0..5].join("\n")
469
+ Rails.logger.error e.resultIO
470
+ @reply.resultIO << e.message if @reply.resultIO.length == 0
471
+ @reply.append e.resultIO if e.resultIO
472
+ else
473
+ log_action(@request_id.nil? ? 'nil' : @request_id, @cloud_user.nil? ? 'nil' : @cloud_user.uuid, @login.nil? ? 'nil' : @login, "LEGACY_BROKER", false, "#{e.class.name} for #{request.path}: #{e.message}", get_extra_log_args)
474
+ Rails.logger.error e.backtrace
475
+ @reply.debugIO << e.message
476
+ @reply.debugIO << e.backtrace[0..5].join("\n")
477
+ @reply.resultIO << e.message if @reply.resultIO.length == 0
478
+ end
479
+
480
+ @reply.exitcode = e.respond_to?('code') ? e.code : 1
481
+ render :json => @reply, :status => status
482
+ end
483
+
484
+ def get_domain(cloud_user, id)
485
+ cloud_user.domains.each do |domain|
486
+ if domain.namespace == id
487
+ @domain_name = domain.namespace
488
+ return domain
489
+ end
490
+ end
491
+ return nil
492
+ end
493
+
494
+ def gen_req_uuid
495
+ # The request id can be generated differently to make it a bit more meaningful
496
+ File.open("/proc/sys/kernel/random/uuid", "r") do |file|
497
+ file.gets.strip.gsub("-","")
498
+ end
499
+ end
500
+
501
+ def get_extra_log_args
502
+ args = {}
503
+ args["APP"] = @application_name if @application_name
504
+ args["DOMAIN"] = @domain_name if @domain_name
505
+ args["APP_UUID"] = @application_uuid if @application_uuid
506
+
507
+ return args
508
+ end
509
+
510
+ end