summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTyler Ball <tyler-ball@users.noreply.github.com>2015-08-19 14:00:35 -0600
committerTyler Ball <tyler-ball@users.noreply.github.com>2015-08-19 14:00:35 -0600
commit34ade96c42d32943b0881069dfaf2d7f27856593 (patch)
treeba5e6bf569c3d48de9a9c610816218fd4a7338f8
parent228d9ffa1b22c78b6756b4299f2b8e087cb1928d (diff)
parentacc44f8836fc5a762a7c6b685c16cd2892ba1456 (diff)
downloadchef-zero-34ade96c42d32943b0881069dfaf2d7f27856593.tar.gz
Merge pull request #155 from andrewjamesbrown/server-api-version
Server api version
-rw-r--r--lib/chef_zero.rb3
-rw-r--r--lib/chef_zero/endpoints/server_api_version_endpoint.rb14
-rw-r--r--lib/chef_zero/rest_base.rb36
-rw-r--r--lib/chef_zero/rest_request.rb4
-rw-r--r--lib/chef_zero/server.rb3
-rw-r--r--spec/run_oc_pedant.rb1
6 files changed, 56 insertions, 5 deletions
diff --git a/lib/chef_zero.rb b/lib/chef_zero.rb
index 354ab07..94633d4 100644
--- a/lib/chef_zero.rb
+++ b/lib/chef_zero.rb
@@ -1,6 +1,9 @@
module ChefZero
require 'chef_zero/log'
+ MIN_API_VERSION = 0
+ MAX_API_VERSION = 1
+
CERTIFICATE = "-----BEGIN CERTIFICATE-----\nMIIDMzCCApygAwIBAgIBATANBgkqhkiG9w0BAQUFADCBnjELMAkGA1UEBhMCVVMx\nEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFjAUBgNVBAoM\nDU9wc2NvZGUsIEluYy4xHDAaBgNVBAsME0NlcnRpZmljYXRlIFNlcnZpY2UxMjAw\nBgNVBAMMKW9wc2NvZGUuY29tL2VtYWlsQWRkcmVzcz1hdXRoQG9wc2NvZGUuY29t\nMB4XDTEyMTEyMTAwMzQyMVoXDTIyMTExOTAwMzQyMVowgZsxEDAOBgNVBAcTB1Nl\nYXR0bGUxEzARBgNVBAgTCldhc2hpbmd0b24xCzAJBgNVBAYTAlVTMRwwGgYDVQQL\nExNDZXJ0aWZpY2F0ZSBTZXJ2aWNlMRYwFAYDVQQKEw1PcHNjb2RlLCBJbmMuMS8w\nLQYDVQQDFCZVUkk6aHR0cDovL29wc2NvZGUuY29tL0dVSURTL3VzZXJfZ3VpZDCC\nASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANLDmPbR71bS2esZlZh/HfC6\n0azXFjl2677wq2ovk9xrUb0Ui4ZLC66TqQ9C/RBzOjXU4TRf3hgPTqvlCgHusl0d\nIcLCrsSl6kPEhJpYWWfRoroIAwf82A9yLQekhqXZEXu5EKkwoUMqyF6m0ZCasaE1\ny8niQxdLAsk3ady/CGQlFqHTPKFfU5UASR2LRtYC1MCIvJHDFRKAp9kPJbQo9P37\nZ8IU7cDudkZFgNLmDixlWsh7C0ghX8fgAlj1P6FgsFufygam973k79GhIP54dELB\nc0S6E8ekkRSOXU9jX/IoiXuFglBvFihAdhvED58bMXzj2AwXUyeAlxItnvs+NVUC\nAwEAATANBgkqhkiG9w0BAQUFAAOBgQBkFZRbMoywK3hb0/X7MXmPYa7nlfnd5UXq\nr2n32ettzZNmEPaI2d1j+//nL5qqhOlrWPS88eKEPnBOX/jZpUWOuAAddnrvFzgw\nrp/C2H7oMT+29F+5ezeViLKbzoFYb4yECHBoi66IFXNae13yj7taMboBeUmE664G\nTB/MZpRr8g==\n-----END CERTIFICATE-----\n"
PUBLIC_KEY = "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0sOY9tHvVtLZ6xmVmH8d\n8LrRrNcWOXbrvvCrai+T3GtRvRSLhksLrpOpD0L9EHM6NdThNF/eGA9Oq+UKAe6y\nXR0hwsKuxKXqQ8SEmlhZZ9GiuggDB/zYD3ItB6SGpdkRe7kQqTChQyrIXqbRkJqx\noTXLyeJDF0sCyTdp3L8IZCUWodM8oV9TlQBJHYtG1gLUwIi8kcMVEoCn2Q8ltCj0\n/ftnwhTtwO52RkWA0uYOLGVayHsLSCFfx+ACWPU/oWCwW5/KBqb3veTv0aEg/nh0\nQsFzRLoTx6SRFI5dT2Nf8iiJe4WCUG8WKEB2G8QPnxsxfOPYDBdTJ4CXEi2e+z41\nVQIDAQAB\n-----END PUBLIC KEY-----\n"
PRIVATE_KEY = "-----BEGIN RSA PRIVATE KEY-----\nMIIEpAIBAAKCAQEA0sOY9tHvVtLZ6xmVmH8d8LrRrNcWOXbrvvCrai+T3GtRvRSL\nhksLrpOpD0L9EHM6NdThNF/eGA9Oq+UKAe6yXR0hwsKuxKXqQ8SEmlhZZ9GiuggD\nB/zYD3ItB6SGpdkRe7kQqTChQyrIXqbRkJqxoTXLyeJDF0sCyTdp3L8IZCUWodM8\noV9TlQBJHYtG1gLUwIi8kcMVEoCn2Q8ltCj0/ftnwhTtwO52RkWA0uYOLGVayHsL\nSCFfx+ACWPU/oWCwW5/KBqb3veTv0aEg/nh0QsFzRLoTx6SRFI5dT2Nf8iiJe4WC\nUG8WKEB2G8QPnxsxfOPYDBdTJ4CXEi2e+z41VQIDAQABAoIBAALhqbW2KQ+G0nPk\nZacwFbi01SkHx8YBWjfCEpXhEKRy0ytCnKW5YO+CFU2gHNWcva7+uhV9OgwaKXkw\nKHLeUJH1VADVqI4Htqw2g5mYm6BPvWnNsjzpuAp+BR+VoEGkNhj67r9hatMAQr0I\nitTvSH5rvd2EumYXIHKfz1K1SegUk1u1EL1RcMzRmZe4gDb6eNBs9Sg4im4ybTG6\npPIytA8vBQVWhjuAR2Tm+wZHiy0Az6Vu7c2mS07FSX6FO4E8SxWf8idaK9ijMGSq\nFvIS04mrY6XCPUPUC4qm1qNnhDPpOr7CpI2OO98SqGanStS5NFlSFXeXPpM280/u\nfZUA0AECgYEA+x7QUnffDrt7LK2cX6wbvn4mRnFxet7bJjrfWIHf+Rm0URikaNma\nh0/wNKpKBwIH+eHK/LslgzcplrqPytGGHLOG97Gyo5tGAzyLHUWBmsNkRksY2sPL\nuHq6pYWJNkqhnWGnIbmqCr0EWih82x/y4qxbJYpYqXMrit0wVf7yAgkCgYEA1twI\ngFaXqesetTPoEHSQSgC8S4D5/NkdriUXCYb06REcvo9IpFMuiOkVUYNN5d3MDNTP\nIdBicfmvfNELvBtXDomEUD8ls1UuoTIXRNGZ0VsZXu7OErXCK0JKNNyqRmOwcvYL\nJRqLfnlei5Ndo1lu286yL74c5rdTLs/nI2p4e+0CgYB079ZmcLeILrmfBoFI8+Y/\ngJLmPrFvXBOE6+lRV7kqUFPtZ6I3yQzyccETZTDvrnx0WjaiFavUPH27WMjY01S2\nTMtO0Iq1MPsbSrglO1as8MvjB9ldFcvp7gy4Q0Sv6XT0yqJ/S+vo8Df0m+H4UBpU\nf5o6EwBSd/UQxwtZIE0lsQKBgQCswfjX8Eg8KL/lJNpIOOE3j4XXE9ptksmJl2sB\njxDnQYoiMqVO808saHVquC/vTrpd6tKtNpehWwjeTFuqITWLi8jmmQ+gNTKsC9Gn\n1Pxf2Gb67PqnEpwQGln+TRtgQ5HBrdHiQIi+5am+gnw89pDrjjO5rZwhanAo6KPJ\n1zcPNQKBgQDxFu8v4frDmRNCVaZS4f1B6wTrcMrnibIDlnzrK9GG6Hz1U7dDv8s8\nNf4UmeMzDXjlPWZVOvS5+9HKJPdPj7/onv8B2m18+lcgTTDJBkza7R1mjL1Cje/Z\nKcVGsryKN6cjE7yCDasnA7R2rVBV/7NWeJV77bmzT5O//rW4yIfUIg==\n-----END RSA PRIVATE KEY-----\n"
diff --git a/lib/chef_zero/endpoints/server_api_version_endpoint.rb b/lib/chef_zero/endpoints/server_api_version_endpoint.rb
new file mode 100644
index 0000000..631f105
--- /dev/null
+++ b/lib/chef_zero/endpoints/server_api_version_endpoint.rb
@@ -0,0 +1,14 @@
+require 'chef_zero/rest_base'
+
+module ChefZero
+ module Endpoints
+ # /server_api_version
+ class ServerAPIVersionEndpoint < RestBase
+ API_VERSION = 1
+ def get(request)
+ json_response(200, {"min_api_version"=>MIN_API_VERSION, "max_api_version"=>MAX_API_VERSION},
+ request.api_version, API_VERSION)
+ end
+ end
+ end
+end
diff --git a/lib/chef_zero/rest_base.rb b/lib/chef_zero/rest_base.rb
index 48d423a..715d705 100644
--- a/lib/chef_zero/rest_base.rb
+++ b/lib/chef_zero/rest_base.rb
@@ -15,7 +15,29 @@ module ChefZero
server.data_store
end
+ def check_api_version(request)
+ version = request.api_version
+ return nil if version.nil? # Not present in headers
+
+ if version.to_i.to_s != version.to_s # Version is not an Integer
+ return json_response(406, { "username" => request.requestor }, -1, -1)
+ elsif version.to_i > MAX_API_VERSION or version.to_i < MIN_API_VERSION
+ response = {
+ "error" => "invalid-x-ops-server-api-version",
+ "message" => "Specified version #{version} not supported",
+ "min_api_version" => MIN_API_VERSION,
+ "max_api_version" => MAX_API_VERSION
+ }
+ return json_response(406, response, version, -1)
+ else
+ return nil
+ end
+ end
+
def call(request)
+ response = check_api_version(request)
+ return response unless response.nil?
+
method = request.method.downcase.to_sym
if !self.respond_to?(method)
accept_methods = [:get, :put, :post, :delete].select { |m| self.respond_to?(m) }
@@ -177,16 +199,22 @@ module ChefZero
json_response(response_code, {"error" => [error]})
end
- def json_response(response_code, json)
- already_json_response(response_code, FFI_Yajl::Encoder.encode(json, :pretty => true))
+ def json_response(response_code, json, request_version=0, response_version=0)
+ already_json_response(response_code, FFI_Yajl::Encoder.encode(json, :pretty => true), request_version, response_version)
end
def text_response(response_code, text)
[response_code, {"Content-Type" => "text/plain"}, text]
end
- def already_json_response(response_code, json_text)
- [response_code, {"Content-Type" => "application/json"}, json_text]
+ def already_json_response(response_code, json_text, request_version=0, response_version=0)
+ header = { "min_version" => MIN_API_VERSION.to_s, "max_version" => MAX_API_VERSION.to_s,
+ "request_version" => request_version.to_s,
+ "response_version" => response_version.to_s }
+ [ response_code,
+ { "Content-Type" => "application/json",
+ "X-Ops-Server-API-Version" => FFI_Yajl::Encoder.encode(header) },
+ json_text ]
end
# To be called from inside rest endpoints
diff --git a/lib/chef_zero/rest_request.rb b/lib/chef_zero/rest_request.rb
index e79af7f..6b37c18 100644
--- a/lib/chef_zero/rest_request.rb
+++ b/lib/chef_zero/rest_request.rb
@@ -18,6 +18,10 @@ module ChefZero
@base_uri = value
end
+ def api_version
+ @env['HTTP_X_OPS_SERVER_API_VERSION'] || 0
+ end
+
def requestor
@env['HTTP_X_OPS_USERID']
end
diff --git a/lib/chef_zero/server.rb b/lib/chef_zero/server.rb
index 672f795..016f299 100644
--- a/lib/chef_zero/server.rb
+++ b/lib/chef_zero/server.rb
@@ -86,6 +86,7 @@ require 'chef_zero/endpoints/user_organizations_endpoint'
require 'chef_zero/endpoints/file_store_file_endpoint'
require 'chef_zero/endpoints/not_found_endpoint'
require 'chef_zero/endpoints/version_endpoint'
+require 'chef_zero/endpoints/server_api_version_endpoint'
module ChefZero
class Server
@@ -102,6 +103,7 @@ module ChefZero
GLOBAL_ENDPOINTS = [
'/license',
'/version',
+ '/server_api_version'
]
def initialize(options = {})
@@ -553,6 +555,7 @@ module ChefZero
[ "/organizations/*/search", SearchesEndpoint.new(self) ],
[ "/organizations/*/search/*", SearchEndpoint.new(self) ],
[ "/version", VersionEndpoint.new(self) ],
+ [ "/server_api_version", ServerAPIVersionEndpoint.new(self) ],
# Internal
[ "/organizations/*/file_store/**", FileStoreFileEndpoint.new(self) ]
diff --git a/spec/run_oc_pedant.rb b/spec/run_oc_pedant.rb
index c0ba702..d2d1c84 100644
--- a/spec/run_oc_pedant.rb
+++ b/spec/run_oc_pedant.rb
@@ -47,7 +47,6 @@ begin
# Chef 12 features not yet 100% supported by Chef Zero
'--skip-policies',
- '--skip-server-api-version',
'--skip-cookbook-artifacts',
'--skip-containers',
'--skip-api-v1'