fluke/devops-service/routes/v2.0/project.rb
2014-12-22 14:22:04 +03:00

375 lines
12 KiB
Ruby

module Devops
module Version2_0
module Routes
module ProjectRoutes
def self.registered(app)
app.before "/project/:id/user" do
check_headers :accept, :content_type
check_privileges("project", "w")
body = create_object_from_json_body
@users = check_array(body["users"], "Parameter 'users' must be a not empty array of strings")
@deploy_env = check_string(body["deploy_env"], "Parameter 'deploy_env' must be a not empty string", true)
@project = settings.mongo.project(params[:id])
end
app.after %r{\A/project(/[\w]+(/(user|deploy))?)?\z} do
statistic
end
app.after "/project/:id/:env/run_list" do
statistic
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.before "/projects" do
check_headers :accept
check_privileges("project", "r")
end
app.get "/projects", &Devops::Version2_0::Handler::Project.get_projects
# 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"
# }
app.before "/project/:project" do
if request.get?
check_headers :accept
check_privileges("project", "r")
elsif request.put? or request.delete?
check_headers
check_privileges("project", "w")
else
return [404, "Route not found"]
end
end
app.get "/project/:project", &Devops::Version2_0::Handler::Project.get_project
# 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.before "/project/:project/servers" do
check_headers :accept
check_privileges("project", "r")
end
app.get "/project/:project/servers", &Devops::Version2_0::Handler::Project.get_project_servers
# 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.before "/project" do
check_headers :accept, :content_type
check_privileges("project", "w")
end
app.post "/project", &Devops::Version2_0::Handler::Project.create_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
app.put "/project/:id", &Devops::Version2_0::Handler::Project.update_project
# 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
app.put "/project/:id/user", &Devops::Version2_0::Handler::Project.update_project_users
# 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
app.delete "/project/:id/user", &Devops::Version2_0::Handler::Project.delete_project_users
# Set run_list to project environment
#
# * *Request*
# - method : PUT
# - headers :
# - Accept: application/json
# - Content-Type: application/json
# - body :
# [
# "role[role_1]",
# "recipe[recipe_1]"
# ]
#
# * *Returns* :
# 200 - Updated
app.before "/project/:id/:env/run_list" do
check_headers :accept, :content_type
check_privileges("project", "w")
end
app.put "/project/:id/:env/run_list", &Devops::Version2_0::Handler::Project.set_project_env_run_list
# 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
app.delete "/project/:id", &Devops::Version2_0::Handler::Project.delete_project
# Run chef-client on reserved project servers
#
# * *Request*
# - method : POST
# - headers :
# - 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.before "/project/:id/deploy" do
check_headers :content_type
check_privileges("project", "x")
end
app.post "/project/:id/deploy", &Devops::Version2_0::Handler::Project.deploy_project
# 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.before "/project/test/:id/:env" do
check_headers :accept, :content_type
check_privileges("project", "r")
end
app.post "/project/test/:id/:env", &Devops::Version2_0::Handler::Project.test_project
puts "Project routes initialized"
end
end
end
end
end