Skip to content

Commit

Permalink
Diagnostic Dumps - RC 1 (#889)
Browse files Browse the repository at this point in the history
Add API side diagnostic reporting.
  • Loading branch information
RickCarlino committed Jun 18, 2018
1 parent d96b9bd commit 110d7ac
Show file tree
Hide file tree
Showing 49 changed files with 563 additions and 88 deletions.
2 changes: 1 addition & 1 deletion .travis.yml
@@ -1,6 +1,6 @@
language: node_js
node_js:
- 8.9.4
- 8.11.3
cache:
yarn: true
directories:
Expand Down
28 changes: 28 additions & 0 deletions app/controllers/api/diagnostic_dumps_controller.rb
@@ -0,0 +1,28 @@
module Api
class DiagnosticDumpsController < Api::AbstractController

def index
render json: diagnostic_dumps
end

def create
Rollbar.info("Device #{current_device.id} created a diagnostic")
mutate DiagnosticDumps::Create.run(raw_json, device: current_device)
end

def destroy
diagnostic_dump.destroy!
render json: ""
end

private

def diagnostic_dumps
current_device.diagnostic_dumps
end

def diagnostic_dump
@diagnostic_dump ||= diagnostic_dumps.find(params[:id])
end
end
end
3 changes: 2 additions & 1 deletion app/models/celery_script_settings_bag.rb
Expand Up @@ -18,7 +18,7 @@ module CeleryScriptSettingsBag
install_farmware update_farmware take_photo zero
install_first_party_farmware remove_farmware
find_home register_gpio unregister_gpio
set_servo_angle change_ownership)
set_servo_angle change_ownership dump_info)
ALLOWED_PACKAGES = %w(farmbot_os arduino_firmware)
ALLOWED_CHAGES = %w(add remove update)
RESOURCE_NAME = %w(images plants regimens peripherals
Expand Down Expand Up @@ -227,6 +227,7 @@ module CeleryScriptSettingsBag
.node(:parameter_declaration, [:label, :data_type], [])
.node(:set_servo_angle, [:pin_number, :pin_value], [])
.node(:change_ownership, [], [:pair])
.node(:dump_info, [], [])
.node(:install_first_party_farmware, [])

ANY_ARG_NAME = Corpus.as_json[:args].pluck("name").map(&:to_s)
Expand Down
35 changes: 18 additions & 17 deletions app/models/device.rb
Expand Up @@ -12,24 +12,25 @@ class Device < ApplicationRecord
"Resuming log storage."
CACHE_KEY = "devices.%s"

has_many :device_configs, dependent: :destroy
has_many :farm_events, dependent: :destroy
has_many :device_configs, dependent: :destroy
has_many :farm_events, dependent: :destroy
has_many :farmware_installations, dependent: :destroy
has_many :images, dependent: :destroy
has_many :logs, dependent: :destroy
has_many :peripherals, dependent: :destroy
has_many :pin_bindings, dependent: :destroy
has_many :plant_templates, dependent: :destroy
has_many :points, dependent: :destroy
has_many :regimens, dependent: :destroy
has_many :saved_gardens, dependent: :destroy
has_many :sensor_readings, dependent: :destroy
has_many :sensors, dependent: :destroy
has_many :sequences, dependent: :destroy
has_many :token_issuances, dependent: :destroy
has_many :tools, dependent: :destroy
has_many :webcam_feeds, dependent: :destroy
has_one :fbos_config, dependent: :destroy
has_many :images, dependent: :destroy
has_many :logs, dependent: :destroy
has_many :peripherals, dependent: :destroy
has_many :pin_bindings, dependent: :destroy
has_many :plant_templates, dependent: :destroy
has_many :points, dependent: :destroy
has_many :regimens, dependent: :destroy
has_many :saved_gardens, dependent: :destroy
has_many :sensor_readings, dependent: :destroy
has_many :sensors, dependent: :destroy
has_many :sequences, dependent: :destroy
has_many :token_issuances, dependent: :destroy
has_many :tools, dependent: :destroy
has_many :webcam_feeds, dependent: :destroy
has_many :diagnostic_dumps, dependent: :destroy
has_one :fbos_config, dependent: :destroy
has_many :in_use_tools
has_many :in_use_points

Expand Down
3 changes: 3 additions & 0 deletions app/models/diagnostic_dump.rb
@@ -0,0 +1,3 @@
class DiagnosticDump < ApplicationRecord
belongs_to :device
end
25 changes: 25 additions & 0 deletions app/mutations/diagnostic_dumps/create.rb
@@ -0,0 +1,25 @@
module DiagnosticDumps
class Create < Mutations::Command
required do
model :device, class: Device
string :fbos_version
string :fbos_commit
string :firmware_commit
string :network_interface
string :fbos_dmesg_dump
string :firmware_state
end

def execute
DiagnosticDump
.create!(device: device,
ticket_identifier: rand(36**5).to_s(36),
fbos_version: fbos_version,
fbos_commit: fbos_commit,
firmware_commit: firmware_commit,
network_interface: network_interface,
fbos_dmesg_dump: fbos_dmesg_dump,
firmware_state: firmware_state,)
end
end
end
5 changes: 5 additions & 0 deletions app/serializers/diagnostic_dump_serializer.rb
@@ -0,0 +1,5 @@
class DiagnosticDumpSerializer < ActiveModel::Serializer
attributes :id, :device_id, :ticket_identifier, :fbos_commit, :fbos_version,
:firmware_commit, :firmware_state, :network_interface,
:fbos_dmesg_dump, :created_at, :updated_at
end
2 changes: 1 addition & 1 deletion auto_upgrade.rb
Expand Up @@ -43,7 +43,7 @@ def attempt(dep, operation, args)
.map{|y| y.split }
.map{|y| "#{y[0]}@#{y[3]}"}
.sort

.reject { |x| x.include?("router") }
# puts "Making sure that type checks pass WITHOUT any upgrades"
tc_ok = type_check

Expand Down
1 change: 1 addition & 0 deletions config/routes.rb
Expand Up @@ -2,6 +2,7 @@
namespace :api, defaults: {format: :json}, constraints: { format: "json" } do
# Standard API Resources:
{
diagnostic_dumps: [:create, :destroy, :index],
farm_events: [:create, :destroy, :index, :update],
farmware_installations: [:create, :destroy, :index],
images: [:create, :destroy, :index, :show],
Expand Down
16 changes: 16 additions & 0 deletions db/migrate/20180615153318_create_diagnostic_dumps.rb
@@ -0,0 +1,16 @@
class CreateDiagnosticDumps < ActiveRecord::Migration[5.2]
def change
create_table :diagnostic_dumps do |t|
t.references :device, foreign_key: true, null: false
t.string :ticket_identifier, null: false, unique: true
t.string :fbos_commit, null: false
t.string :fbos_version, null: false
t.string :firmware_commit, null: false
t.string :firmware_state, null: false
t.string :network_interface, null: false
t.text :fbos_dmesg_dump, null: false
t.timestamps

end
end
end
17 changes: 16 additions & 1 deletion db/schema.rb
Expand Up @@ -10,7 +10,7 @@
#
# It's strongly recommended that you check this file into your version control system.

ActiveRecord::Schema.define(version: 2018_06_09_144559) do
ActiveRecord::Schema.define(version: 2018_06_15_153318) do

# These are extensions that must be enabled in order to support this database
enable_extension "hstore"
Expand Down Expand Up @@ -53,6 +53,20 @@
t.index ["timezone"], name: "index_devices_on_timezone"
end

create_table "diagnostic_dumps", force: :cascade do |t|
t.bigint "device_id", null: false
t.string "ticket_identifier", null: false
t.string "fbos_commit", null: false
t.string "fbos_version", null: false
t.string "firmware_commit", null: false
t.string "firmware_state", null: false
t.string "network_interface", null: false
t.text "fbos_dmesg_dump", null: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["device_id"], name: "index_diagnostic_dumps_on_device_id"
end

create_table "edge_nodes", force: :cascade do |t|
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
Expand Down Expand Up @@ -478,6 +492,7 @@
end

add_foreign_key "device_configs", "devices"
add_foreign_key "diagnostic_dumps", "devices"
add_foreign_key "edge_nodes", "sequences"
add_foreign_key "farmware_installations", "devices"
add_foreign_key "peripherals", "devices"
Expand Down
2 changes: 1 addition & 1 deletion latest_corpus.rb
Expand Up @@ -83,7 +83,7 @@ def to_ts
end
end

HASH = JSON.load(open("http://localhost:3000/api/corpuses/3")).deep_symbolize_keys
HASH = JSON.load(open("http://localhost:3000/api/corpus")).deep_symbolize_keys
ARGS = {}
HASH[:args].map{ |x| CSArg.new(x) }.each{|x| ARGS[x.name] = x}
NODES = HASH[:nodes].map { |x| CSNode.new(x) }
Expand Down
20 changes: 10 additions & 10 deletions package.json
Expand Up @@ -34,11 +34,11 @@
"@types/fastclick": "^1.0.28",
"@types/history": "^4.6.1",
"@types/i18next": "^8.4.2",
"@types/jest": "23.0.2",
"@types/jest": "23.1.0",
"@types/lodash": "4.14.109",
"@types/markdown-it": "^0.0.4",
"@types/moxios": "^0.4.5",
"@types/node": "10.3.2",
"@types/node": "10.3.3",
"@types/react": "16.3.14",
"@types/react-color": "2.13.5",
"@types/react-dom": "16.0.5",
Expand All @@ -51,11 +51,11 @@
"css-loader": "0.28.11",
"enzyme": "^3.1.0",
"enzyme-adapter-react-16": "^1.1.0",
"farmbot": "6.0.0-rc2",
"farmbot": "6.0.1",
"farmbot-toastr": "^1.0.3",
"fastclick": "^1.0.6",
"file-loader": "1.1.11",
"i18next": "11.3.2",
"i18next": "11.3.3",
"imports-loader": "0.8.0",
"jest": "23.1.0",
"json-loader": "0.5.7",
Expand All @@ -67,14 +67,14 @@
"node-sass": "4.9.0",
"optimize-css-assets-webpack-plugin": "4.0.2",
"raf": "^3.4.0",
"react": "16.4",
"react": "16.4.1",
"react-addons-css-transition-group": "^15.6.2",
"react-addons-test-utils": "^15.6.2",
"react-color": "2.14.1",
"react-dom": "16.4",
"react-dom": "16.4.1",
"react-redux": "^5.0.6",
"react-router": "^3",
"react-test-renderer": "16.4.0",
"react-test-renderer": "16.4.1",
"react-transition-group": "^2.3.1",
"redux": "^3.7.2",
"redux-immutable-state-invariant": "^2.1.0",
Expand All @@ -87,7 +87,7 @@
"ts-lint": "^4.5.1",
"ts-loader": "^4.4.1",
"tslint": "5.10.0",
"typescript": "2.9.1",
"typescript": "2.9.2",
"url-loader": "1.0.1",
"webpack": "4.12.0",
"webpack-uglify-js-plugin": "1.1.9",
Expand All @@ -96,8 +96,8 @@
"yarn": "^1.6.0"
},
"devDependencies": {
"jscpd": "0.6.19",
"webpack-cli": "3.0.4",
"jscpd": "0.6.21",
"webpack-cli": "3.0.8",
"webpack-notifier": "^1.5.0"
},
"jest": {
Expand Down
@@ -0,0 +1,52 @@
require 'spec_helper'

describe Api::DiagnosticDumpsController do
let(:device) { FactoryBot.create(:device) }
let(:user) { FactoryBot.create(:user, device: device) }

include Devise::Test::ControllerHelpers

it 'lists all diagnostics' do
sign_in user
DiagnosticDump.destroy_all
device_config = FactoryBot.create_list(:diagnostic_dump, 3, device: device)
get :index
expect(json.length).to eq(3)
expect(json.pluck(:device_id).uniq).to eq([user.device.id])
end

it 'creates a dump' do
sign_in user
DiagnosticDump.destroy_all
b4 = DiagnosticDump.count
input = {
fbos_version: "123_fbos_version",
fbos_commit: "123_fbos_commit",
firmware_commit: "123_firmware_commit",
network_interface: "123_network_interface",
fbos_dmesg_dump: "123_fbos_dmesg_dump",
firmware_state: "123_firmware_state",
}
post :create, body: input.to_json
expect(response.status).to eq(200)
expect(DiagnosticDump.count).to be > b4
expect(DiagnosticDump.last.device).to eq(device)
expect(json[:fbos_version]).to eq("123_fbos_version")
expect(json[:fbos_commit]).to eq("123_fbos_commit")
expect(json[:firmware_commit]).to eq("123_firmware_commit")
expect(json[:network_interface]).to eq("123_network_interface")
expect(json[:fbos_dmesg_dump]).to eq("123_fbos_dmesg_dump")
expect(json[:firmware_state]).to eq("123_firmware_state")
expect(json[:ticket_identifier].length).to eq(5)
end

it 'deletes' do
sign_in user
# DiagnosticDump.destroy_all
device_config = FactoryBot.create(:diagnostic_dump, device: device)
id = device_config.id
delete :destroy, params: { id: device_config.id }
expect(response.status).to be(200)
expect(DiagnosticDump.exists?(id)).to be false
end
end
12 changes: 12 additions & 0 deletions spec/factories/diagnostic_dumps.rb
@@ -0,0 +1,12 @@
FactoryBot.define do
factory :diagnostic_dump do
device
fbos_version "123_fbos_version"
fbos_commit "123_fbos_commit"
firmware_commit "123_firmware_commit"
network_interface "123_network_interface"
fbos_dmesg_dump "123_fbos_dmesg_dump"
firmware_state "123_firmware_state"
ticket_identifier { rand(36**5).to_s(36) }
end
end
3 changes: 2 additions & 1 deletion webpack/__test_support__/control_panel_state.ts
Expand Up @@ -7,6 +7,7 @@ export const panelState = (): ControlPanelState => {
encoders_and_endstops: false,
danger_zone: false,
power_and_reset: false,
pin_guard: false
pin_guard: false,
diagnostic_dumps: false
};
};
1 change: 1 addition & 0 deletions webpack/__test_support__/fake_state/bot.ts
Expand Up @@ -10,6 +10,7 @@ export let bot: Everything["bot"] = {
"danger_zone": false,
"power_and_reset": false,
"pin_guard": false,
"diagnostic_dumps": false
},
"hardware": {
"gpio_registry": {},
Expand Down
20 changes: 19 additions & 1 deletion webpack/__test_support__/fake_state/resources.ts
Expand Up @@ -8,7 +8,8 @@ import {
TaggedSensor,
TaggedFirmwareConfig,
TaggedPinBinding,
TaggedLog
TaggedLog,
TaggedDiagnosticDump
} from "../../resources/tagged_resources";
import { ExecutableType } from "../../farm_designer/interfaces";
import { fakeResource } from "../fake_resource";
Expand Down Expand Up @@ -117,6 +118,23 @@ export function fakePlant(): TaggedPlantPointer {
});
}

export function fakeDiagnosticDump(): TaggedDiagnosticDump {
const string = "----PLACEHOLDER DIAG STUFF ---";
return fakeResource("DiagnosticDump", {
id: idCounter++,
device_id: 123,
ticket_identifier: string,
fbos_commit: string,
fbos_version: string,
firmware_commit: string,
firmware_state: string,
network_interface: string,
fbos_dmesg_dump: string,
created_at: string,
updated_at: string,
});
}

export function fakePoint(): TaggedGenericPointer {
return fakeResource("Point", {
id: idCounter++,
Expand Down

0 comments on commit 110d7ac

Please sign in to comment.