Merge branch 'staging' into bug_fix_tues
commit
c5c5c0e53f
|
@ -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)
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue