08-11-2023 01:50 AM - edited 08-11-2023 01:56 AM
Hi,
I found one problem in acitoolkit acibaseobject currently working on cable plan application, and noticed that target node is not same format as node in for loop. List self._parent.get_children(Node) have nodes names rather then nodes numbers so each time it throws None and nothing appears not sure how to change this list to include list o nodes number, will you be so kind and help me to change list to be nodes number representation?
Below part of code:
 def get_node1(self):
        """Returns the Node object that corresponds to the first
        node of the link.  The Node must be a child of
        the Pod that this link is a member of, i.e. it
        must already have been read from the APIC.  This can
        most easily be done by populating the entire
        physical heirarchy from the Pod down.
 
        :returns: Node object at first end of link
        """
        return self._get_node(1)
def get_node2(self):
    """Returns the Node object that corresponds to the
    second node of the link.  The Node must be a child of
    the Pod that this link is a member of, i.e. it must
    already have been read from the APIC.  This can
    most easily be done by populating the entire physical
    heirarchy from the Pod down.
    :returns: Node object at second end of link
    """
    return self._get_node(2)
def _get_node(self, node_number):
    """Common implementation of get_node1() and get_node2()"""
    if not self._parent:
        raise TypeError("Parent pod must be specified in order to get node")
    target_node = {1: self.node1, 2: self.node2}[node_number]
    matching_nodes = (
        node for node in self._parent.get_children(Node)
        if node == target_node
    )
    return next(matching_nodes, None)`
Solved! Go to Solution.
08-11-2023 06:27 AM - edited 08-11-2023 07:10 AM
Hi you should get the node ID's by calling get_node(), try this for your "matching_nodes":
matching_nodes = (node.get_node() for node in self._parent.get_children(Node) if node.get_node() == target_node)
The following works for me:
from acitoolkit.acitoolkit import Session
from acitoolkit.aciphysobject import Pod, Node
url = "xxx"
login = "admin"
password = "xxx"
session = Session(url, login, password)
session.login()
pods = Pod.get(session)
for pod in pods:
    pod.populate_children(deep=False)
    node_generator = (node.get_node() for node in pod.get_children(Node))
    for x in node_generator:
        print(x)
""" OUTPUT:
101
201
1
102
"""
08-11-2023 06:27 AM - edited 08-11-2023 07:10 AM
Hi you should get the node ID's by calling get_node(), try this for your "matching_nodes":
matching_nodes = (node.get_node() for node in self._parent.get_children(Node) if node.get_node() == target_node)
The following works for me:
from acitoolkit.acitoolkit import Session
from acitoolkit.aciphysobject import Pod, Node
url = "xxx"
login = "admin"
password = "xxx"
session = Session(url, login, password)
session.login()
pods = Pod.get(session)
for pod in pods:
    pod.populate_children(deep=False)
    node_generator = (node.get_node() for node in pod.get_children(Node))
    for x in node_generator:
        print(x)
""" OUTPUT:
101
201
1
102
"""
08-12-2023 12:31 AM - edited 08-12-2023 12:32 AM
Hi Marcel,
thank you very much for yours help, indeed it started working after one amendment added get_node() to if - node.get_node() as yours first response (seems right now you also added it).
After that I am struggle next problem related with getFabricSt, wondering how to call it to get proper data, anyway i am also nto sure what this returns ? State of what ? Any ideas ?
AttributeError: 'str' object has no attribute 'getFabricSt'
def _build_apic(self, pod):
        """This will build the cable plan using the configuration of the pod.
 
        :param pod: Pod
 
        :returns: None
        """
        nodes = pod.get_children(ACI.Node)
        for node in nodes:
            if node.getFabricSt() == 'active':
                if node.get_role() == 'spine':
                    self.add_switch(CpSwitch(node.get_name(), node.get_chassis_type(), spine=True))
                if node.get_role() == 'leaf':
                    self.add_switch(CpSwitch(node.get_name(), node.get_chassis_type()))
        links = pod.get_children(ACI.Link)
        for link in links:
            # node1_id = ACI.Link._get_target_node(link, 1)
            # print(node1_id)
            switch1 = link.get_node1()
            switch2 = link.get_node2()
            if switch1 and switch2:
                if link.get_node1().getFabricSt() == 'active' and link.get_node2().getFabricSt() == 'active':
                    if link.get_node1().get_role() != 'controller' and link.get_node2().get_role() != 'controller':
                        source_chassis = self._get_switch_from_apic_link(link, 1)
                        dest_chassis = self._get_switch_from_apic_link(link, 2)
                        source_interface = link.get_port1()
                        dest_interface = link.get_port2()
                        source_port = '{0:s}{1:s}/{2:s}'.format(source_interface.interface_type,
                                                                source_interface.module, source_interface.port)
                        dest_port = '{0:s}{1:s}/{2:s}'.format(dest_interface.interface_type,
                                                              dest_interface.module,
                                                              dest_interface.port)
 
                        self.add_link(
                            CpLink(source_chassis=source_chassis, source_port=source_port, dest_chassis=dest_chassis,
                                   dest_port=dest_port))
 
08-12-2023 01:24 AM
I think I found the problem it is triggered now by node name not number, will try to fix it.
08-12-2023 02:10 AM - edited 08-12-2023 02:12 AM
Good to hear, if you stuck again, let me know.
Regarding the other question: getFabricSt() returns the state of the node in question (active, inactive, decommissioned, disabled, discovering...etc) - it's the same state as you see in the UI under Fabric > Inventory > Fabric Membership.
08-12-2023 02:22 AM
For sure will do 
def _get_node(self, node_number):
    """Common implementation of get_node1() and get_node2()"""
    if not self._parent:
        raise TypeError("Parent pod must be specified in order to get node")
    target_node = {1: self.node1, 2: self.node2}[node_number]
    matching_nodes = (
        node for node in self._parent.get_children(Node)
        if node.get_node() == target_node
    )
    return next(matching_nodes, None)`Generally easiest way in my case was replacing
 if node == target_node  to  if node.get_node() == target_noderather rewriting whole functions.
08-12-2023 02:39 AM
Seems have next one, self.other in cableplan it is getting None and it is crashing here again, generally it seems it prompt switches names, but why i gets None ?
return self.name == other.name
AttributeError: 'NoneType' object has no attribute 'name'
def __eq__(self, other):
        print(other)
        return self.name == other.name
08-12-2023 02:52 AM - edited 08-12-2023 02:53 AM
Fixed, finally program started working 
Solution:
def __eq__(self, other):
        print(other)
        return self.name == other
08-12-2023 03:05 AM
Can you post the complete script?
08-12-2023 03:09 AM
Never mind, I did not see your last post. Happy it works now.
08-12-2023 03:21 AM - edited 08-12-2023 04:41 AM
sorry for adding it few times... not sure what happened.
08-12-2023 03:17 AM - edited 08-12-2023 04:42 AM
same problem here
08-12-2023 04:39 AM
 
					
				
				
			
		
Discover and save your favorite ideas. Come back to expert answers, step-by-step guides, recent topics, and more.
New here? Get started with these tips. How to use Community New member guide