375 lines
12 KiB
Ruby
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
|
|
|