Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
R
Resource Manager
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package registry
Container registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
This is an archived project. Repository and other project resources are read-only.
Show more breadcrumbs
GÉANT Orchestration and Automation Team
GAP
Resource Manager
Commits
007da2f5
Commit
007da2f5
authored
2 years ago
by
Erik Reid
Browse files
Options
Downloads
Patches
Plain Diff
updated model
parent
a4a3a094
No related branches found
No related tags found
No related merge requests found
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
resource_management/cli.py
+17
-6
17 additions, 6 deletions
resource_management/cli.py
resource_management/db/model.py
+22
-5
22 additions, 5 deletions
resource_management/db/model.py
test/test_db_model.py
+36
-35
36 additions, 35 deletions
test/test_db_model.py
with
75 additions
and
46 deletions
resource_management/cli.py
+
17
−
6
View file @
007da2f5
...
@@ -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_card
s
,
LINE_CARDS_LIST_SCHEMA
import
load_
router_port
s
,
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_card
s
(
fqdn
,
config
[
'
ssh
'
]))
line_cards
=
list
(
load_
router_port
s
(
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
)
...
...
This diff is collapsed.
Click to expand it.
resource_management/db/model.py
+
22
−
5
View file @
007da2f5
...
@@ -2,7 +2,7 @@
...
@@ -2,7 +2,7 @@
Resources Database
Resources Database
=========================
=========================
This database hold information about
physical
router resources
This database hold
s
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
'
)
This diff is collapsed.
Click to expand it.
test/test_db_model.py
+
36
−
35
View file @
007da2f5
...
@@ -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_card
s
from
resource_management.hardware.router
import
load_
router_port
s
#
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_card
s
(
hostname
=
router_name
,
ssh_config
=
ssh
))
fpcs
=
list
(
load_
router_port
s
(
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
_name
s
=
{
p
.
name
for
p
in
fpc
.
ports
}
db_
ports
=
{
(
p
.
pic
,
p
.
position
)
for
p
in
fpc
.
ports
}
assert
expected_ports
==
port
_name
s
assert
expected_ports
==
db_
ports
# TODO: do this in a tmp container ...
# TODO: do this in a tmp container ...
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment