module Devops module API2_0 module Routes module ProjectRoutes def self.registered(app) # Get project types # # * *Request* # - method : GET # - headers : # - Accept: application/json # # * *Returns* : # [ # "type" # ] app.get_with_headers "/project_types", :headers => [:accept] do check_privileges("project", "r") json Devops::API2_0::Handler::Project.new(request).project_types end # Get projects list # # * *Request* # - method : GET # - headers : # - Accept: application/json # - params : # - fields - show project fields, available values: deploy_envs, type # # * *Returns* : # [ # {"name" : "project_1"} # ] app.get_with_headers "/projects", :headers => [:accept] do check_privileges("project", "r") json Devops::API2_0::Handler::Project.new(request).projects.map(&:to_hash) end # Get project by id # # * *Request* # - method : GET # - headers : # - Accept: application/json # # * *Returns* : # { # "deploy_envs": [ # { # "flavor": "flavor", # "identifier": "prod", # "image": "image id", # "run_list": [ # "role[project_1-prod]" # ], # "subnets": [ # "private" # ], # "expires": null, # "provider": "openstack", # "groups": [ # "default" # ], # "users": [ # "user" # ] # } # ], # "name": "project_1" # } hash = {} hash["GET"] = lambda {|project| check_privileges("project", "r") json Devops::API2_0::Handler::Project.new(request).project(project) } # Update project and create chef roles # # * *Request* # - method : PUT # - headers : # - Accept: application/json # - Content-Type: application/json # - body : # { # "deploy_envs": [ # { # "identifier": "dev", # "provider": "openstack", # "flavor": "m1.small", # "image": "image id", # "subnets": [ # "private" # ], # "groups": [ # "default" # ], # "users": [ # "user" # ], # "run_list": [ # # ], # "expires": null # } # ], # "name": "project_1" # } # # * *Returns* : # 200 - Updated hash["PUT"] = lambda { |project| check_privileges("project", "w") r = Devops::API2_0::Handler::Project.new(request).update_project project info = "Project '#{project}' has been updated." + r create_response(info) } # Delete project # # * *Request* # - method : DELETE # - headers : # - Accept: application/json # - Content-Type: application/json # - body : # { # "deploy_env": "env" -> if not null, will be deleted environment only # } # # * *Returns* : # 200 - Deleted hash["DELETE"] = lambda {|project| check_privileges("project", "w") info = Devops::API2_0::Handler::Project.new(request).delete_project(project) create_response(info) } app.multi_routes "/project/:project", {}, hash # Get project servers # # * *Request* # - method : GET # - headers : # - Accept: application/json # - parameters : # - deploy_env=:env -> show servers with environment :env # # * *Returns* : # [ # { # "provider": "openstack", # "chef_node_name": "project_1_server", # "remote_user": "root", # "project": "project_1", # "deploy_env": "prod", # "private_ip": "10.8.8.8", # "public_ip": null, # "created_at": "2014-04-23 13:35:18 UTC", # "created_by": "user", # "static": false, # "key": "ssh key", # "id": "nstance id" # } # ] app.get_with_headers "/project/:project/servers", :headers => [:accept] do |project| check_privileges("project", "r") json Devops::API2_0::Handler::Project.new(request).project_servers(project).map(&:to_hash) end # Get project stacks # # * *Request* # - method : GET # - headers : # - Accept: application/json # - parameters : # - deploy_env=:env -> show stacks with environment :env # # * *Returns* : # [ # "provider": "openstack", # "project": "test_openstack", # "deploy_env": "test", # "stack_template": "openstack_template", # "cloud_stack_id": "4c712026-dcd5-4664-90b8-0915494c1332", # "parameters": { # "admin_pass": "Pass12", # "key_name": "devops", # "image": "CirrOS_0.3.1" # }, # "details": null, # "stack_status": null, # "id": "openstack_stack" # ] app.get_with_headers "/project/:project/stacks", :headers => [:accept] do |project| check_privileges("project", "r") json Devops::API2_0::Handler::Project.new(request).project_stacks(project).map(&:to_hash) end # Create project and chef roles # # * *Request* # - method : POST # - headers : # - Accept: application/json # - Content-Type: application/json # - body : # { # "deploy_envs": [ # { # "identifier": "prod", # "provider": "openstack", # "flavor": "m1.small", # "image": "image id", # "subnets": [ # "private" # ], # "groups": [ # "default" # ], # "users": [ # "user" # ], # "run_list": [ # # ], # "expires": null # } # ], # "name": "project_1" # } # # * *Returns* : # 201 - Created app.post_with_headers "/project", :headers => [:accept, :content_type] do check_privileges("project", "w") begin res = Devops::API2_0::Handler::Project.new(request).create_project res = "Created. " + res create_response(res, nil, 201) rescue InvalidRecord => e halt_response(e.message) end end users_hash = {} # Add users to project environment # # * *Request* # - method : PUT # - headers : # - Accept: application/json # - Content-Type: application/json # - body : # { # "users": [ # "user1" # ], # "deploy_env": "env" -> if null, users will be added to all environments # } # # * *Returns* : # 200 - Updated users_hash["PUT"] = lambda { |project| check_privileges("project", "w") info = Devops::API2_0::Handler::Project.new(request).update_project_users(project) create_response(info) } # Delete users from project environment # # * *Request* # - method : DELETE # - headers : # - Accept: application/json # - Content-Type: application/json # - body : # { # "users": [ # "user1" # ], # "deploy_env": "env" -> if null, users will be deleted from all environments # } # # * *Returns* : # 200 - Updated users_hash["DELETE"] = lambda {|project| check_privileges("project", "w") info = Devops::API2_0::Handler::Project.new(request).delete_project_users(project) create_response(info) } app.multi_routes "/project/:id/user", {}, users_hash # Set run_list to project # # * *Request* # - method : PATCH # - headers : # - Accept: application/json # - Content-Type: application/json # - body : # [ # "role[role_1]", # "recipe[recipe_1]" # ] # # * *Returns* : # 200 - Updated app.patch_with_headers "/project/:id/run_list", :headers => [:accept, :content_type] do |project| check_privileges("project", "w") info = Devops::API2_0::Handler::Project.new(request).set_project_run_list(project) create_response(info) end # Set run_list to project environment # # * *Request* # - method : PATCH # - headers : # - Accept: application/json # - Content-Type: application/json # - body : # [ # "role[role_1]", # "recipe[recipe_1]" # ] # # * *Returns* : # 200 - Updated app.patch_with_headers "/project/:id/:env/run_list", :headers => [:accept, :content_type] do |project, deploy_env| check_privileges("project", "w") info = Devops::API2_0::Handler::Project.new(request).set_project_env_run_list(project, deploy_env) create_response(info) end # Run chef-client on reserved project servers # # * *Request* # - method : POST # - headers : # - X-Stream: true -> return output in text stream # - Content-Type: application/json # - body : # { # "servers": [ # "server_1" # ], -> deploy servers from list, all servers if null # "deploy_env": "env" -> deploy servers with environment 'env' or all project servers if null # } # # * *Returns* : text stream app.post_with_headers "/project/:id/deploy", :headers => [:content_type] do |project| check_privileges("project", "x") handler = Devops::API2_0::Handler::Project.new(request) if request["X-Stream"] stream() do |out| begin status = handler.deploy_project_stream out, project out << create_status(status) rescue IOError => e logger.error e.message end end else json handler.deploy_project project end end # Set project to archivated state # # * *Request* # - method : POST # - headers : # - Content-Type: application/json app.post_with_headers "/project/:project/archive", :headers => [:content_type] do |project| check_privileges("project", "w") info = Devops::API2_0::Handler::Project.new(request).archive_project(project) create_response(info) end # Set project to normal state # # * *Request* # - method : POST # - headers : # - Content-Type: application/json app.post_with_headers "/project/:project/unarchive", :headers => [:content_type] do |project| check_privileges("project", "w") info = Devops::API2_0::Handler::Project.new(request).unarchive_project(project) create_response(info) end # Test project environment # # Run tests: # - run server # - bootstrap server # - delete server # # * *Request* # - method : DELETE # - headers : # - Accept: application/json # - Content-Type: application/json # # * *Returns* : # 200 - # { # "servers": [ # { # "id": "132958f0-61c5-4665-8cc3-66e1bacd285b", # "create": { # "status": true, # "time": "155s" # }, # "chef_node_name": "chef name", # "bootstrap": { # "status": true, # "log": "\nWaiting for SSH...\n" # "return_code": 0 # }, # "delete": { # "status": true, # "time": "2s" # "log": { # "chef_node": "Deleted node[chef name]", # "chef_client": "Deleted client[chef name]", # "server": "Server with id '132958f0-61c5-4665-8cc3-66e1bacd285b' terminated" # } # }, # } # ], # "project": { # "deploy_envs": [ # { # "flavor": "flavor", # "identifier": "prod", # "image": "image id", # "run_list": [ # "role[prod]" # ], # "subnets": [ # "private" # ], # "expires": null, # "provider": "openstack", # "groups": [ # "default" # ], # "users": [ # "root" # ] # } # ], # "name": "prject_1" # }, # "message": "Test project 'project_1' and environment 'prod'" # } app.post_with_headers "/project/test/:id/:env", :headers => [:accept, :content_type] do |project, deploy_env| check_privileges("project", "r") json Devops::API2_0::Handler::Project.new(request).test_project(project, deploy_env) end puts "Project routes initialized" end end end end end