[ARVADOS] created: 17e5ea9ab8ed16f9a3d3d8cd1e2f93298634e99f
git at public.curoverse.com
git at public.curoverse.com
Thu Jun 5 12:30:03 EDT 2014
at 17e5ea9ab8ed16f9a3d3d8cd1e2f93298634e99f (commit)
commit 17e5ea9ab8ed16f9a3d3d8cd1e2f93298634e99f
Author: Brett Smith <brett at curoverse.com>
Date: Thu Jun 5 11:38:46 2014 -0400
2880: API server saves node statistics from pings.
Crunch will use this information when scheduling Jobs, to satisfy
specified runtime constraints. Getting this data into the pings is
the responsibility of the node's ping script.
diff --git a/services/api/app/controllers/arvados/v1/nodes_controller.rb b/services/api/app/controllers/arvados/v1/nodes_controller.rb
index 3fbf5fc..5bfeff0 100644
--- a/services/api/app/controllers/arvados/v1/nodes_controller.rb
+++ b/services/api/app/controllers/arvados/v1/nodes_controller.rb
@@ -20,9 +20,15 @@ class Arvados::V1::NodesController < ApplicationController
if !@object
return render_not_found
end
- @object.ping({ ip: params[:local_ipv4] || request.env['REMOTE_ADDR'],
- ping_secret: params[:ping_secret],
- ec2_instance_id: params[:instance_id] })
+ ping_data = {
+ ip: params[:local_ipv4] || request.env['REMOTE_ADDR'],
+ ec2_instance_id: params[:instance_id]
+ }
+ [:ping_secret, :total_cpu_cores, :total_ram_mb, :total_scratch_mb]
+ .each do |key|
+ ping_data[key] = params[key] if params[key]
+ end
+ @object.ping(ping_data)
if @object.info['ping_secret'] == params[:ping_secret]
render json: @object.as_api_response(:superuser)
else
diff --git a/services/api/app/models/node.rb b/services/api/app/models/node.rb
index 2ca05f6..71d4dea 100644
--- a/services/api/app/models/node.rb
+++ b/services/api/app/models/node.rb
@@ -115,6 +115,15 @@ class Node < ArvadosModel
end
end
+ # Record other basic stats
+ ['total_cpu_cores', 'total_ram_mb', 'total_scratch_mb'].each do |key|
+ if value = (o[key] or o[key.to_sym])
+ self.info[key] = value
+ else
+ self.info.delete(key)
+ end
+ end
+
save!
end
diff --git a/services/api/test/fixtures/nodes.yml b/services/api/test/fixtures/nodes.yml
index 398bdf5..92e78da 100644
--- a/services/api/test/fixtures/nodes.yml
+++ b/services/api/test/fixtures/nodes.yml
@@ -32,3 +32,4 @@ idle:
info:
:ping_secret: "69udawxvn3zzj45hs8bumvndricrha4lcpi23pd69e44soanc0"
:slurm_state: "idle"
+ total_cpu_cores: 16
diff --git a/services/api/test/functional/arvados/v1/nodes_controller_test.rb b/services/api/test/functional/arvados/v1/nodes_controller_test.rb
index e096a04..06695aa 100644
--- a/services/api/test/functional/arvados/v1/nodes_controller_test.rb
+++ b/services/api/test/functional/arvados/v1/nodes_controller_test.rb
@@ -75,4 +75,20 @@ class Arvados::V1::NodesControllerTest < ActionController::TestCase
assert_not_nil json_response['info']['ping_secret']
end
+ test "ping adds node stats to info" do
+ node = nodes(:idle)
+ post :ping, {
+ id: node.uuid,
+ ping_secret: node.info['ping_secret'],
+ total_cpu_cores: 32,
+ total_ram_mb: 1024,
+ total_scratch_mb: 2048
+ }
+ assert_response :success
+ info = JSON.parse(@response.body)['info']
+ assert_equal(node.info['ping_secret'], info['ping_secret'])
+ assert_equal(32, info['total_cpu_cores'].to_i)
+ assert_equal(1024, info['total_ram_mb'].to_i)
+ assert_equal(2048, info['total_scratch_mb'].to_i)
+ end
end
diff --git a/services/api/test/unit/node_test.rb b/services/api/test/unit/node_test.rb
index ccc3765..5a9a057 100644
--- a/services/api/test/unit/node_test.rb
+++ b/services/api/test/unit/node_test.rb
@@ -1,7 +1,23 @@
require 'test_helper'
class NodeTest < ActiveSupport::TestCase
- # test "the truth" do
- # assert true
- # end
+ def ping_node(node_name, ping_data)
+ set_user_from_auth :admin
+ node = nodes(node_name)
+ node.ping({ping_secret: node.info['ping_secret'],
+ ip: node.ip_address}.merge(ping_data))
+ node
+ end
+
+ test "pinging a node can add and update stats" do
+ node = ping_node(:idle, {total_cpu_cores: '12', total_ram_mb: '512'})
+ assert_equal(12, node.info['total_cpu_cores'].to_i)
+ assert_equal(512, node.info['total_ram_mb'].to_i)
+ end
+
+ test "stats disappear if not in a ping" do
+ node = ping_node(:idle, {total_ram_mb: '256'})
+ refute_includes(node.info, 'total_cpu_cores')
+ assert_equal(256, node.info['total_ram_mb'].to_i)
+ end
end
-----------------------------------------------------------------------
hooks/post-receive
--
More information about the arvados-commits
mailing list