fabric-testbed / InformationModel

FABRIC Information Model library
MIT License
7 stars 1 forks source link

Add maintenance_info property #155

Closed ibaldin closed 1 year ago

ibaldin commented 1 year ago

Addresses #153 by adding a maintenance_info property onto node-like objects; see test/slice_topology_test.py line 644 for how to use

Example of how to use it. maintenance_info propery is valid for NetworkNodes and CompositeNodes (within a Topology object):

        # maintenance mode - the object needs to be constructed prior to being assigned to the property
        # along with the state (MaintenanceState) you can specify datetime deadline and expected_end (presumed in UTC)
        minfo = MaintenanceInfo()
        minfo.add(name=n1.name, minfo=MaintenanceEntry(state=MaintenanceState.PreMaint, deadline=datetime.now(), expected_end=datetime.now() + timedelta(days=1))
        n1.maintenance_info = minfo

        self.assertEqual(n1.maintenance_info.get(n1.name).state, MaintenanceState.PreMaint)
        # check it is finalized
        self.assertEqual(n1.maintenance_info._lock, True)

        # try to modify after assignment
        with self.assertRaises(MaintenanceModeException):
            n1.maintenance_info.add(name='n3', minfo=MaintenanceEntry(state=MaintenanceState.PreMaint,
                                                                      deadline=datetime.datetime.now()))

if you are operating on slivers, you can do this:

        minfo = MaintenanceInfo()
        minfo.add('node1', minfo=MaintenanceEntry(state=MaintenanceState.Active))
        ns = NodeSliver()
        ns.set_properties(name='node1', type=NodeType.Server,
                          management_ip='192.168.1.1',
                          maintenance_info=minfo)
        with self.assertRaises(ValueError) as ve:
            ns.set_property('management_ip', '192.168.1.x')

        self.assertEqual(ns.get_maintenance_info().get('node1').state, MaintenanceState.Active)

maintenance_info property on NetworkNodes and CompositeNodes carries a dictionary keyed by node name so it looks like this:

class MaintenanceEntry:
    state: MaintenanceState
    deadline: datetime = None # when it starts
    expected_end: datetime = None # how long it may be

minfo = MaintenanceInfo()
minfo.add(name='node1', minfo=MaintenanceEntry(state=MaintenanceState.PreMaint, deadline=datetime.now(), expected_end=datetime.now() + timedelta(days=1))
minfo.add(name='node2', minfo=MaintenanceEntry(state=MaintenanceState.PreMaint, deadline=datetime.now(), expected_end=datetime.now() + timedelta(days=1))
minfo.add(name='node3', minfo=MaintenanceEntry(state=MaintenanceState.PreMaint, deadline=datetime.now(), expected_end=datetime.now() + timedelta(days=1))
minfo.add(name='node4', minfo=MaintenanceEntry(state=MaintenanceState.PreMaint, deadline=datetime.now(), expected_end=datetime.now() + timedelta(days=1))

composite_node.maintenance_info = minfo

In PyPi as fabric_fim==1.4.0rc5