Skip to content
Snippets Groups Projects
Commit 007da2f5 authored by Erik Reid's avatar Erik Reid
Browse files

updated model

parent a4a3a094
No related branches found
No related tags found
No related merge requests found
...@@ -32,7 +32,7 @@ import logging ...@@ -32,7 +32,7 @@ import logging
from jsonschema import validate, ValidationError from jsonschema import validate, ValidationError
from resource_management.hardware.router \ from resource_management.hardware.router \
import load_line_cards, LINE_CARDS_LIST_SCHEMA import load_router_ports, LINE_CARDS_LIST_SCHEMA
from resource_management import db, config, environment from resource_management import db, config, environment
from resource_management.db import model from resource_management.db import model
...@@ -51,18 +51,29 @@ def _save_router_info(fqdn, fpcs): ...@@ -51,18 +51,29 @@ def _save_router_info(fqdn, fpcs):
line_card_record = model.LineCard( line_card_record = model.LineCard(
model=_line_card['model'], model=_line_card['model'],
position=_line_card["position"], slot=_line_card['slot'],
serial=_line_card['serial'],
description=_line_card['description'],
node=node) node=node)
session.add(line_card_record) session.add(line_card_record)
for port in _line_card['ports']: for port in _line_card['ports']:
port_record = model.Port( port_record = model.Port(
name=port['name'], pic=port['pic'],
speed=port["speed"], position=port['position'],
interface=port.get('interface', None),
cable=port.get('cable', None),
line_card=line_card_record) line_card=line_card_record)
session.add(port_record) session.add(port_record)
logger.info("Device {0} has been written to the database".format(fqdn)) for speed in port.get('speeds', []):
session.add(
model.PortSpeedCapability(
speed=speed,
port=port_record))
logger.info(f'saved router information: {fqdn}')
def _validate_config(_unused_ctx, _unused_param, file): def _validate_config(_unused_ctx, _unused_param, file):
...@@ -96,7 +107,7 @@ def cli(config, fqdn): ...@@ -96,7 +107,7 @@ def cli(config, fqdn):
- ... and perform the db queries - ... and perform the db queries
""" """
line_cards = list(load_line_cards(fqdn, config['ssh'])) line_cards = list(load_router_ports(fqdn, config['ssh']))
# sanity check, shouldn't fail ... otherwise die badly # sanity check, shouldn't fail ... otherwise die badly
validate(line_cards, LINE_CARDS_LIST_SCHEMA) validate(line_cards, LINE_CARDS_LIST_SCHEMA)
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
Resources Database Resources Database
========================= =========================
This database hold information about physical router resources This database holds information about router port resources
""" """
import logging import logging
...@@ -31,8 +31,10 @@ class Node(base_schema): ...@@ -31,8 +31,10 @@ class Node(base_schema):
class LineCard(base_schema): class LineCard(base_schema):
__tablename__ = 'line_cards' __tablename__ = 'line_cards'
id = Column('id', Integer, primary_key=True) id = Column('id', Integer, primary_key=True)
position = Column('position', Integer, nullable=False) slot = Column('slot', Integer, nullable=False)
model = Column('model', String, nullable=False) model = Column('model', String, nullable=False)
serial = Column('serial', String, nullable=False)
description = Column('description', String, nullable=False)
node_id = Column('node_id', Integer, ForeignKey('nodes.id')) node_id = Column('node_id', Integer, ForeignKey('nodes.id'))
node = relationship('Node', back_populates='line_cards') node = relationship('Node', back_populates='line_cards')
ports = relationship( ports = relationship(
...@@ -40,12 +42,27 @@ class LineCard(base_schema): ...@@ -40,12 +42,27 @@ class LineCard(base_schema):
back_populates='line_card', back_populates='line_card',
cascade="all, delete, delete-orphan") cascade="all, delete, delete-orphan")
class Port(base_schema): class Port(base_schema):
__tablename__ = 'ports' __tablename__ = 'ports'
id = Column('id', Integer, primary_key=True) id = Column('id', Integer, primary_key=True)
name = Column('name', String, nullable=False) pic = Column('pic', Integer, nullable=False)
speed = Column('speed', Integer, nullable=False) position = Column('position', Integer, nullable=False)
interface = Column('interface', Integer, nullable=True)
cable = Column('cable', Integer, nullable=True)
line_card_id = Column( line_card_id = Column(
'line_card_id', Integer, ForeignKey('line_cards.id')) 'line_card_id', Integer, ForeignKey('line_cards.id'))
line_card = relationship('LineCard', back_populates='ports') line_card = relationship('LineCard', back_populates='ports')
speed_capabilities = relationship(
'PortSpeedCapability',
back_populates='port',
cascade="all, delete, delete-orphan")
class PortSpeedCapability(base_schema):
__tablename__ = 'port_speed_capabilities'
id = Column('id', Integer, primary_key=True)
speed = Column('speed', String, nullable=False)
port_id = Column(
'port_id', Integer, ForeignKey('ports.id'))
port = relationship('Port', back_populates='speed_capabilities')
...@@ -3,34 +3,34 @@ from random import randint ...@@ -3,34 +3,34 @@ from random import randint
from resource_management.db import model from resource_management.db import model
from resource_management.db import session_scope from resource_management.db import session_scope
from resource_management.cli import _save_router_info from resource_management.cli import _save_router_info
from resource_management.hardware.router import load_line_cards from resource_management.hardware.router import load_router_ports
#
def test_model_sanity_check(resources_db, router_name): # def test_model_sanity_check(resources_db, router_name):
#
test_node = [randint(1, 50) for _ in range(randint(1, 50))] # test_node = [randint(1, 50) for _ in range(randint(1, 50))]
#
with session_scope() as session: # with session_scope() as session:
#
node = model.Node(fqdn=router_name) # node = model.Node(fqdn=router_name)
session.add(node) # session.add(node)
#
for position, num_ports in enumerate(test_node): # for position, num_ports in enumerate(test_node):
line_card = model.LineCard( # line_card = model.LineCard(
model=f'XYZ-{position}', position=position, node=node) # model=f'XYZ-{position}', position=position, node=node)
session.add(line_card) # session.add(line_card)
for idx in range(num_ports): # for idx in range(num_ports):
port = model.Port( # port = model.Port(
name=str(idx), line_card=line_card, speed=1000) # name=str(idx), line_card=line_card, speed=1000)
session.add(port) # session.add(port)
#
# new session - previous rows should have been committed # # new session - previous rows should have been committed
with session_scope() as session: # with session_scope() as session:
node = session.query(model.Node) \ # node = session.query(model.Node) \
.filter(model.Node.fqdn == router_name).one() # .filter(model.Node.fqdn == router_name).one()
assert len(node.line_cards) == len(test_node) # assert len(node.line_cards) == len(test_node)
for expected_num_ports, line_card in zip(test_node, node.line_cards): # for expected_num_ports, line_card in zip(test_node, node.line_cards):
assert expected_num_ports == len(line_card.ports) # assert expected_num_ports == len(line_card.ports)
def test_save_router_info(resources_db, router_name, mocked_router): def test_save_router_info(resources_db, router_name, mocked_router):
...@@ -40,23 +40,24 @@ def test_save_router_info(resources_db, router_name, mocked_router): ...@@ -40,23 +40,24 @@ def test_save_router_info(resources_db, router_name, mocked_router):
'private-key': 'no file' 'private-key': 'no file'
} }
fpcs = list(load_line_cards(hostname=router_name, ssh_config=ssh)) fpcs = list(load_router_ports(hostname=router_name, ssh_config=ssh))
_save_router_info(fqdn=router_name, fpcs=fpcs) _save_router_info(fqdn=router_name, fpcs=fpcs)
fpc_position_dict = {f['position']: f['ports'] for f in fpcs} fpc_slot_dict = {f['slot']: f['ports'] for f in fpcs}
with session_scope() as session: with session_scope() as session:
node = session.query(model.Node) \ node = session.query(model.Node) \
.filter(model.Node.fqdn == router_name).one() .filter(model.Node.fqdn == router_name).one()
expected_fpc_positions = set(fpc_position_dict.keys()) expected_fpc_slots = set(fpc_slot_dict.keys())
fpc_positions = {fpc.position for fpc in node.line_cards}
assert expected_fpc_positions == fpc_positions fpc_slots = {fpc.slot for fpc in node.line_cards}
assert expected_fpc_slots == fpc_slots
for fpc in node.line_cards: for fpc in node.line_cards:
expected_ports = { expected_ports = {
p['name'] for p in fpc_position_dict[fpc.position]} (p['pic'], p['position']) for p in fpc_slot_dict[fpc.slot]}
port_names = {p.name for p in fpc.ports} db_ports = {(p.pic, p.position) for p in fpc.ports}
assert expected_ports == port_names assert expected_ports == db_ports
# TODO: do this in a tmp container ... # TODO: do this in a tmp container ...
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment