cosmos/lib/cosmos/models/interface_status_model.rb
# encoding: ascii-8bit
# Copyright 2022 Ball Aerospace & Technologies Corp.
# All Rights Reserved.
#
# This program is free software; you can modify and/or redistribute it
# under the terms of the GNU Affero General Public License
# as published by the Free Software Foundation; version 3 with
# attribution addendums as found in the LICENSE.txt
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# This program may also be used under the terms of a commercial or
# enterprise edition license of COSMOS if purchased from the
# copyright holder
require 'cosmos/models/model'
module Cosmos
# Stores the status about an interface. This class also implements logic
# to handle status for a router since the functionality is identical
# (only difference is the Redis key used).
class InterfaceStatusModel < EphemeralModel
INTERFACES_PRIMARY_KEY = 'cosmos_interface_status'
ROUTERS_PRIMARY_KEY = 'cosmos_router_status'
attr_accessor :state
attr_accessor :clients
attr_accessor :txsize
attr_accessor :rxsize
attr_accessor :txbytes
attr_accessor :rxbytes
attr_accessor :txcnt
attr_accessor :rxcnt
# NOTE: The following three class methods are used by the ModelController
# and are reimplemented to enable various Model class methods to work
def self.get(name:, scope:)
super("#{scope}__#{_get_key}", name: name)
end
def self.names(scope:)
super("#{scope}__#{_get_key}")
end
def self.all(scope:)
super("#{scope}__#{_get_key}")
end
# END NOTE
# Helper method to return the correct type based on class name
def self._get_type
self.name.to_s.split("Model")[0].upcase.split("::")[-1]
end
# Helper method to return the correct primary key based on class name
def self._get_key
type = _get_type
case type
when 'INTERFACESTATUS'
INTERFACES_PRIMARY_KEY
when 'ROUTERSTATUS'
ROUTERS_PRIMARY_KEY
else
raise "Unknown type #{type} from class #{self.name}"
end
end
def initialize(
name:,
state:,
clients: 0,
txsize: 0,
rxsize: 0,
txbytes: 0,
rxbytes: 0,
txcnt: 0,
rxcnt: 0,
updated_at: nil,
plugin: nil,
scope:
)
if self.class._get_type == 'INTERFACESTATUS'
super("#{scope}__#{INTERFACES_PRIMARY_KEY}", name: name, updated_at: updated_at, plugin: plugin, scope: scope)
else
super("#{scope}__#{ROUTERS_PRIMARY_KEY}", name: name, updated_at: updated_at, plugin: plugin, scope: scope)
end
@state = state
@clients = clients
@txsize = txsize
@rxsize = rxsize
@txbytes = txbytes
@rxbytes = rxbytes
@txcnt = txcnt
@rxcnt = rxcnt
end
def as_json
{
'name' => @name,
'state' => @state,
'clients' => @clients,
'txsize' => @txsize,
'rxsize' => @rxsize,
'txbytes' => @txbytes,
'rxbytes' => @rxbytes,
'txcnt' => @txcnt,
'rxcnt' => @rxcnt,
'plugin' => @plugin,
'updated_at' => @updated_at
}
end
end
end