Merge branch 'staging' into bug_fix_tues

pull/1125/head
Rick Carlino 2019-03-05 18:32:45 -06:00
commit c5c5c0e53f
4 changed files with 33 additions and 15 deletions

View File

@ -57,6 +57,8 @@ class NervesHub
# So it needs to be written to a path.
NERVES_HUB_CA_HACK = "/tmp/nerves_hub_ca.#{Rails.env}.pem"
NERVES_HUB_ERROR = "NervesHub request failed: %s: %s"
COLON = ":"
BAD_TAG = "A device sent a malformed tag"
# HEADERS for HTTP requests to NervesHub
HEADERS = {"Content-Type" => "application/json"}
@ -75,10 +77,10 @@ class NervesHub
return unless dev
# ["application:prod", "channel:stable"]
# Becomes: {"application"=>"prod", "channel"=>"stable"}
# NEVER DUPLICATE TAG PREFIXES (thing before ":"). Must be unique!
tag_map = dev.fetch(:tags).map { |x| x.split(":") }.to_h
# NEVER DUPLICATE TAG PREFIXES (thing before COLON). Must be unique!
tag_map = dev.fetch(:tags).map { |x| x.split(COLON) }.to_h
tag_map[CHANNEL] = channel
next_tags = tag_map.to_a.map { |x| x.join(":") }
next_tags = tag_map.to_a.map { |x| x.join(COLON) }
update(serial_number, next_tags)
end
@ -88,6 +90,13 @@ class NervesHub
def self.create_or_update(serial_number, tags)
# Hash | nil
current_nerves_hub_device = device(serial_number)
# It's really hard to debug malformed tags; Catch them here:
if tags.detect{|x| !x.include?(COLON) }
report_problem(error: BAD_TAG, serial_number: serial_number, tags: tags)
return
end
if current_nerves_hub_device
update(serial_number, tags)
else
@ -127,13 +136,6 @@ class NervesHub
JSON(resp.body)["data"].deep_symbolize_keys
end
# # Delete a device from NervesHub
# def self.delete_device(serial_number)
# resp = conn.delete("#{devices_path}/#{serial_number}")
# bad_http(resp.code, resp.body) if resp.code != "204"
# resp.body
# end
# Creates a device certificate that is able to access NervesHub.
# This creates a CSR on behalf of the device.
def self.sign_device(serial_number)

View File

@ -9,7 +9,7 @@ describe Api::DeviceCertsController do
it 'creates a cert' do
# So many locals: ========================================================
ser = "456"
tags = ["FOO", "BAR"]
tags = ["FOO:BAR", "BAR:BAZ"]
conn = double("Create a cert", :ca_file= => nil,
:cert_store => nil,
:cert_store= => nil,

View File

@ -87,16 +87,16 @@ describe NervesHub do
xpect_args = "/orgs/farmbot/devices/X"
resp = StubResp.new("404", { "data" => { } }.to_json)
expect(NervesHub.conn).to receive(:get).with(xpect_args).and_return(resp)
tags = [ "A:B", "C:D" ]
xpect_args2 = [ "/orgs/farmbot/devices",
{ "description": "farmbot-X",
"identifier": "X",
"tags": [ "Y", "Z" ] }.to_json,
"tags": tags }.to_json,
NervesHub::HEADERS ]
data = {fake: "Farmbot"}
resp2 = StubResp.new("201", { "data" => data }.to_json)
expect(NervesHub.conn).to receive(:post).with(*xpect_args2).and_return(resp2)
expect(NervesHub.create_or_update("X", ["Y", "Z"])).to eq(data)
expect(NervesHub.create_or_update("X", tags)).to eq(data)
end
it "sometimes performs the NERVES_HUB_CA_HACK" do
@ -107,4 +107,20 @@ describe NervesHub do
expect(File.read(NervesHub::NERVES_HUB_CA_HACK)).to eq(pem)
end
end
it "detects malformed tags" do
tags = ["wrong", "also_wrong", "ok:tag"].shuffle
serial_number = "0xCAFEF00D"
expected = { error: NervesHub::BAD_TAG,
serial_number: serial_number,
tags: tags, }
resp = StubResp.new("200", {
"data" => { hello: :world, identifier: "?" }
}.to_json)
do_it = \
receive(:get).with("/orgs/farmbot/devices/#{serial_number}").and_return(resp)
expect(NervesHub.conn).to do_it
expect(NervesHub).to receive(:report_problem).with(expected)
NervesHub.create_or_update(serial_number, tags)
end
end

View File

@ -3,7 +3,7 @@ require "spec_helper"
describe DeviceCerts::Create do
let(:device) { FactoryBot.create(:device) }
ser = "123"
tags = ["x"]
tags = ["x:y"]
it "creates a cert" do
run_jobs_now do