Ravn::Tactical::ServiceV1::

Nodes module

:nocov:

Public Class Methods

included( app )

Add nodes-related routes to the given app.

   # File lib/ravn/tactical/service_v1/nodes.rb
20 def self::included( app )
21     super
22 
23     self.log.info "Mounting node endpoints."
24     self.mount( app )
25 end
mount( app )

Mount node endpoints in the given app.

   # File lib/ravn/tactical/service_v1/nodes.rb
29 def self::mount( app )
30     app.hash_branch( :v1, 'node' ) do |r|
31 
32         # GET /api/v1/node
33         r.is do
34             r.get( &self.method(:get_local_node) )
35         end
36 
37         # PUT /api/v1/node/control
38         r.on( 'control' ) do
39             r.put { self.make_control_node }
40         end
41 
42     end
43 
44     app.hash_branch( :v1, 'nodes' ) do |r|
45 
46         # GET /api/v1/nodes
47         # POST /api/v1/nodes
48         r.is do
49             r.get( &self.method(:get_nodes) )
50             r.post { self.register_node }
51         end
52 
53         # GET /api/v1/nodes/callsigns
54         r.on( 'callsigns' ) do
55             r.get { self.get_callsigns }
56         end
57 
58         # GET /api/v1/nodes/«id»
59         # POST /api/v1/nodes/«id»
60         # DELETE /api/v1/nodes/«id»
61         r.on( Integer ) do |id|
62             r.get { self.get_node( id ) }
63             r.post { self.update_node( id ) }
64             r.delete { self.delete_node( id ) }
65         end
66     end
67 end

Public Instance Methods

delete_node( id )

Mark the node associated with the given device_id as deleted.

    # File lib/ravn/tactical/service_v1/nodes.rb
181 def delete_node( id )
182     self.log.info "Marking node %d as deleted" % [ id ]
183 
184     node = Ravn::Tactical::Node.undeleted[ id ] or return nil
185     node.soft_delete
186 
187     return 204
188 end
get_callsigns()

Fetch a collection of existing callsigns

    # File lib/ravn/tactical/service_v1/nodes.rb
 95 def get_callsigns
 96     self.log.info "Fetching all current callsigns"
 97     callsigns = Ravn::Tactical::Node.undeleted.select_order_map( :callsign )
 98 
 99     return callsigns
100 end
get_local_node()

Fetch information about this node.

   # File lib/ravn/tactical/service_v1/nodes.rb
75 def get_local_node
76     self.log.info "Fetching local node info"
77     node = Ravn::Tactical::Node.for_localhost
78     return present( node, local_node: true )
79 end
get_node( id )

Fetch a single node by ID.

    # File lib/ravn/tactical/service_v1/nodes.rb
147 def get_node( id )
148     self.log.info "Fetching node 0x%s" % [ id ]
149 
150     node = Ravn::Tactical::Node.undeleted[ id ]
151 
152     if node
153         discovered = Ravn::Tactical::Discovery.nodes[ node.device_id ]
154         node.merge_discovery_data( discovered ) if discovered
155     else
156         return nil
157     end
158 
159     return present( node )
160 end
get_nodes()

Fetch compute pack nodes.

    # File lib/ravn/tactical/service_v1/nodes.rb
104 def get_nodes
105     self.log.info "Fetching all known nodes"
106     registered_nodes = Ravn::Tactical::Node.undeleted.as_hash( :device_id )
107     discovered_nodes = Ravn::Tactical::Discovery.nodes
108 
109     # Combine discovered and registered nodes
110     nodes = registered_nodes.merge( discovered_nodes ) do |device_id, registered, discovered|
111         registered.merge_discovery_data( discovered )
112         registered
113     end
114 
115     current_mission = Ravn::Tactical::Mission.current
116 
117     return present_collection( nodes.values, current_mission: current_mission )
118 end
make_control_node()

Make this node a control node.

   # File lib/ravn/tactical/service_v1/nodes.rb
83 def make_control_node
84     self.log.info "Making this node a control"
85     node = Ravn::Tactical.make_control_node
86     return present( node, local_node: true )
87 end
register_node()

Register a new compute pack that has been discovered.

    # File lib/ravn/tactical/service_v1/nodes.rb
122 def register_node
123     params = typecast_params.convert!( symbolize: true ) do |tp|
124         tp.nonempty_str!( 'device_id' )
125     end
126     id = params[ :device_id ]
127 
128     self.log.info "Attempting to register node 0x%s." % [ id ]
129 
130     node = Ravn::Tactical::Discovery.nodes[ id ] or return 404
131     if Ravn::Tactical::Node.first( device_id: id )
132         request.halt( 409, {error: "Node #{id} is already registered."} )
133     end
134 
135     new_node = Ravn::Tactical::Kit.add_node( node )
136 
137     response.status = 201
138     response['Location'] = url( new_node )
139 
140     return present( new_node )
141 rescue Ravn::Tactical::BackendError => err
142     raise( err, "failed to add node" )
143 end
update_node( id )

Update an existing node with the request’s parameters.

    # File lib/ravn/tactical/service_v1/nodes.rb
164 def update_node( id )
165     self.log.info "Updating node %d" % [ id ]
166 
167     node = Ravn::Tactical::Node.undeleted[ id ] or return nil
168 
169     params = valid_node_parameters()
170     node.update( **params )
171 
172     return bad_request( "Invalid node config." ) unless node.valid?
173 
174     node.save_changes
175 
176     return present( node )
177 end
valid_node_parameters()

Validate the current request body against parameters for Mission objects. See the the typecast_params plugin for details.

Refs: - roda.jeremyevans.net/rdoc/classes/Roda/RodaPlugins/TypecastParams.html

    # File lib/ravn/tactical/service_v1/nodes.rb
196 def valid_node_parameters
197     typecast_params.convert!( symbolize: true ) do |tp|
198         tp.nonempty_str!( 'callsign' )
199     end
200 end