require "json" module Devops module Version2_0 module Routes module ServerRoutes def self.registered(app) app.before %r{\A/server/[\w]+/(pause|unpouse|reserve|unreserve)\z} do check_headers :accept, :content_type check_privileges("server", "w") body = create_object_from_json_body(Hash, true) @key = (body.nil? ? nil : body["key"]) end app.after %r{\A/server(/[\w]+)?\z | \A/server/(add|bootstrap)\z | \A/server/[\w]+/(un)?pause\z} do statistic end # Get devops servers list # # * *Request* # - method : GET # - headers : # - Accept: application/json # - params : # - fields - show server fields, available values: project, deploy_env, provider, remote_user, private_ip, public_ip, created_at, created_by, static, key, reserved_by # # * *Returns* : # [ # { # "id": "instance id", # "chef_node_name": "chef name" # } # ] app.before "/servers" do check_headers :accept check_privileges("server", "r") end app.get "/servers", &Devops::Version2_0::Handler::Server.get_servers # Get chef nodes list # # * *Request* # - method : GET # - headers : # - Accept: application/json # # * *Returns* : # [ # { # "chef_node_name": "chef name" # } # ] app.before "/servers/chef" do check_headers :accept check_privileges("server", "r") end app.get "/servers/chef", &Devops::Version2_0::Handler::Server.get_chef_servers # Get provider servers list # # * *Request* # - method : GET # - headers : # - Accept: application/json # # * *Returns* : # -ec2 # [ # { # "state": "running", # "name": "name", # "image": "ami-83e4bcea", # "flavor": "m1.small", # "keypair": "ssh key", # "instance_id": "i-8441bfd4", # "dns_name": "ec2-204-236-199-49.compute-1.amazonaws.com", # "zone": "us-east-1d", # "private_ip": "10.215.217.210", # "public_ip": "204.236.199.49", # "launched_at": "2014-04-25 07:56:33 UTC" # } # ] # -openstack # [ # { # "state": "ACTIVE", # "name": "name", # "image": "image id", # "flavor": null, # "keypair": "ssh key", # "instance_id": "instance id", # "private_ip": "172.17.0.1" # } # ] app.before "/servers/:provider" do check_headers :accept check_privileges("server", "r") end app.get "/servers/:provider", &Devops::Version2_0::Handler::Server.get_provider_servers # Get server info by :name # # * *Request* # - method : GET # - headers : # - Accept: application/json # - parameters: # key=instance -> search server by instance_id rather then chef_node_name # # * *Returns* : # [ # { # "chef_node_name": "chef name" # } # ] app.before "/server/:name" do if request.get? check_headers :accept check_privileges("server", "r") elsif request.delete? check_headers check_privileges("server", "w") end end app.get "/server/:name", &Devops::Version2_0::Handler::Server.get_server # Delete devops server # # * *Request* # - method : DELETE # - headers : # - Accept: application/json # - Content-Type: application/json # - body : # { # "key": "instance", -> search server by instance_id rather then chef_node_name # } # # * *Returns* : # 200 - Deleted app.delete "/server/:id", &Devops::Version2_0::Handler::Server.delete_server # Create devops server # # * *Request* # - method : POST # - headers : # - Accept: application/json # - Content-Type: application/json # - body : # { # "project": "project name", -> mandatory parameter # "deploy_env": "env", -> mandatory parameter # "name": "server_name", -> if null, name will be generated # "without_bootstrap": null, -> do not install chef on instance if true # "force": null, -> do not delete server on error # "groups": [], -> specify special security groups, overrides value from project env # "key": "ssh key", -> specify ssh key for server, overrides value from project env # "trace": true -> return output in stream # } # # * *Returns* : text stream app.before "/server" do check_headers :content_type check_privileges("server", "w") end app.post "/server", &Devops::Version2_0::Handler::Server.create_server # Pause devops server by name # # * *Request* # - method : POST # - headers : # - Accept: application/json # - Content-Type: application/json # - body : # { # "key": "instance", -> search server by instance_id rather then chef_node_name # } # # * *Returns* : # 200 - Paused app.post "/server/:node_name/pause", &Devops::Version2_0::Handler::Server.pause_server # Unpause devops server by name # # * *Request* # - method : POST # - headers : # - Accept: application/json # - Content-Type: application/json # - body : # { # "key": "instance", -> search server by instance_id rather then chef_node_name # } # # * *Returns* : # 200 - Unpaused app.post "/server/:node_name/unpause", &Devops::Version2_0::Handler::Server.unpause_server # Reserve devops server # # * *Request* # - method : POST # - headers : # - Accept: application/json # - Content-Type: application/json # - body : # { # "key": "instance", -> search server by instance_id rather then chef_node_name # } # # * *Returns* : # 200 - Reserved app.post "/server/:node_name/reserve", &Devops::Version2_0::Handler::Server.reserve_server # Unreserve devops server # # * *Request* # - method : POST # - headers : # - Accept: application/json # - Content-Type: application/json # - body : # { # "key": "instance", -> search server by instance_id rather then chef_node_name # } # # * *Returns* : # 200 - Unreserved app.post "/server/:node_name/unreserve", &Devops::Version2_0::Handler::Server.unreserve_server # Bootstrap devops server # # * *Request* # - method : POST # - headers : # - Accept: application/json # - Content-Type: application/json # - body : # { # "instance_id": "instance id", -> mandatory parameter # "name": "server_name", -> if null, name will be generated # "run_list": [], -> specify list of roles and recipes # "bootstrap_template": "template" -> specify ssh key for server, overrides value from project env # } # # * *Returns* : text stream app.before "/server/bootstrap" do check_headers check_privileges("server", "w") end app.post "/server/bootstrap", &Devops::Version2_0::Handler::Server.bootstrap_server # Add external server to devops # # * *Request* # - method : POST # - headers : # - Accept: application/json # - Content-Type: application/json # - body : # { # "project": "project name", -> mandatory parameter # "deploy_env": "env", -> mandatory parameter # "key": "ssh key", -> mandatory parameter # "remote_user": "ssh user", -> mandatory parameter # "private_ip": "ip", -> mandatory parameter # "public_ip": "ip" # } # # * *Returns* : # 200 - Added app.before "/server/add" do check_headers check_privileges("server", "w") end app.post "/server/add", &Devops::Version2_0::Handler::Server.add_server puts "Server routes initialized" end end end end end