<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:

def addLink(self, node1, node2, capacity, delay):
        '''
        Add a bidirectional link between node1 and node2 with the given
        capacity and delay to the topology.
        '''
        for n in (node1, node2):
            if not self.__nxgraph.has_node(n):
                raise Exception("No node {} exists for building a link".format(n))
        macs = [None,None]
        if self.__auto_macs:
            for i in range(len(macs)):
                macstr = '{:012x}'.format(self.__ifnum)
                self.__ifnum += 1
                macaddr = ':'.join([ macstr[j:(j+2)] for j in range(0,len(macstr),2)])
                macs[i] = macaddr
        node1if = self.__nxgraph.node[node1]['nodeobj'].addInterface(ethaddr=macs[0])
        node2if = self.__nxgraph.node[node2]['nodeobj'].addInterface(ethaddr=macs[1])
        self.__nxgraph.add_edge(node1, node2)
        self.__nxgraph[node1][node2][node1] = node1if
        self.__nxgraph[node1][node2][node2] = node2if
        self.setLinkCharacteristics(node1, node2, capacity, delay)