From 6174f5f7820a6b908ed9dfd78b5a77afdbd05bd4 Mon Sep 17 00:00:00 2001 From: "Jeremy J. Miller" Date: Fri, 31 Mar 2017 13:51:22 -0400 Subject: [PATCH] http head for /nodes/xxx endpoint Signed-off-by: Jeremy J. Miller --- oc-chef-pedant/lib/pedant/request.rb | 4 ++++ oc-chef-pedant/lib/pedant/rspec/node_util.rb | 6 ++++++ .../spec/api/nodes/complete_endpoint_spec.rb | 19 +++++++++++++++++++ .../oc_chef_wm/src/chef_wm_named_node.erl | 12 +++++++++--- .../apps/oc_chef_wm/src/oc_chef_action.erl | 2 ++ .../apps/oc_chef_wm/src/oc_chef_wm_base.erl | 2 ++ 6 files changed, 42 insertions(+), 3 deletions(-) diff --git a/oc-chef-pedant/lib/pedant/request.rb b/oc-chef-pedant/lib/pedant/request.rb index ff2839c49d..3ed838a1bb 100644 --- a/oc-chef-pedant/lib/pedant/request.rb +++ b/oc-chef-pedant/lib/pedant/request.rb @@ -173,6 +173,10 @@ def get(url, requestor, opts={}, &validator) authenticated_request :GET, url, requestor, opts, &validator end + def head(url, requestor, opts={}, &validator) + authenticated_request :HEAD, url, requestor, opts, &validator + end + def put(url, requestor, opts={}, &validator) authenticated_request :PUT, url, requestor, opts, &validator end diff --git a/oc-chef-pedant/lib/pedant/rspec/node_util.rb b/oc-chef-pedant/lib/pedant/rspec/node_util.rb index dda0b36287..1cf8336580 100644 --- a/oc-chef-pedant/lib/pedant/rspec/node_util.rb +++ b/oc-chef-pedant/lib/pedant/rspec/node_util.rb @@ -202,6 +202,12 @@ def validates_run_list } end + let(:head_success_response) do + { + :status => 200 + } + end + let(:fetch_node_list_empty_response) do { :status => 200, diff --git a/oc-chef-pedant/spec/api/nodes/complete_endpoint_spec.rb b/oc-chef-pedant/spec/api/nodes/complete_endpoint_spec.rb index 43bc619a54..ab96896d80 100644 --- a/oc-chef-pedant/spec/api/nodes/complete_endpoint_spec.rb +++ b/oc-chef-pedant/spec/api/nodes/complete_endpoint_spec.rb @@ -85,6 +85,25 @@ end end # GET /nodes/ + context 'HEAD /nodes/' do + let(:request_method) { :HEAD } + let(:request_url) { api_url("/nodes/#{node_name}") } + + context 'for a nonexistent node' do + let(:node_name){nonexistent_node_name} + it 'returns a 404', :smoke do + should look_like http_404_response + end + end + + context 'for an existing node' do + include_context 'with temporary testing node' + it 'returns a 200', :smoke do + should look_like head_success_response + end + end + end # HEAD /nodes/ + context 'GET /environments//nodes' do let(:request_method) { :GET } let(:request_url) { api_url("/environments/#{environment_name}/nodes") } diff --git a/src/oc_erchef/apps/oc_chef_wm/src/chef_wm_named_node.erl b/src/oc_erchef/apps/oc_chef_wm/src/chef_wm_named_node.erl index d03b3fcfcd..2319921a62 100644 --- a/src/oc_erchef/apps/oc_chef_wm/src/chef_wm_named_node.erl +++ b/src/oc_erchef/apps/oc_chef_wm/src/chef_wm_named_node.erl @@ -57,9 +57,10 @@ request_type() -> "nodes". allowed_methods(Req, State) -> - {['GET', 'PUT', 'DELETE'], Req, State}. + {['HEAD', 'GET', 'PUT', 'DELETE'], Req, State}. validate_request(Method, Req, State) when Method == 'GET'; + Method == 'HEAD'; Method == 'DELETE' -> {Req, State}; validate_request('PUT', Req, #base_state{resource_state = NodeState} = State) -> @@ -87,8 +88,13 @@ auth_info(Req, #base_state{chef_db_context = DbContext, end. to_json(Req, #base_state{resource_state = NodeState} = State) -> - #node_state{chef_node = Node} = NodeState, - {chef_db_compression:decompress(Node#chef_node.serialized_object), Req, State}. + case wrq:method(Req) of + 'HEAD' -> + {<<>>, Req, State}; + _ -> + #node_state{chef_node = Node} = NodeState, + {chef_db_compression:decompress(Node#chef_node.serialized_object), Req, State} + end. from_json(Req, #base_state{resource_state = #node_state{chef_node = Node, node_data = NodeData}} = State) -> diff --git a/src/oc_erchef/apps/oc_chef_wm/src/oc_chef_action.erl b/src/oc_erchef/apps/oc_chef_wm/src/oc_chef_action.erl index 7ca61281f7..dd74683619 100644 --- a/src/oc_erchef/apps/oc_chef_wm/src/oc_chef_action.erl +++ b/src/oc_erchef/apps/oc_chef_wm/src/oc_chef_action.erl @@ -73,6 +73,8 @@ log_action(Req, #base_state{resource_state = ResourceState, case wrq:method(Req) of 'GET' -> ok; + 'HEAD' -> + ok; _ElseMethod -> %% POST, PUT, DELETE case ResourceMod of oc_chef_wm_authenticate_user -> %% POST to authenticate_user should not be an action. diff --git a/src/oc_erchef/apps/oc_chef_wm/src/oc_chef_wm_base.erl b/src/oc_erchef/apps/oc_chef_wm/src/oc_chef_wm_base.erl index 028e97a760..8f73ac6527 100644 --- a/src/oc_erchef/apps/oc_chef_wm/src/oc_chef_wm_base.erl +++ b/src/oc_erchef/apps/oc_chef_wm/src/oc_chef_wm_base.erl @@ -539,6 +539,8 @@ http_method_to_authz_perm(#wm_reqdata{}=Req) -> http_method_to_authz_perm(wrq:method(Req)); http_method_to_authz_perm('DELETE') -> delete; +http_method_to_authz_perm('HEAD') -> + read; http_method_to_authz_perm('GET') -> read; http_method_to_authz_perm('POST') ->