def test_add(self):
        r1 = IPv4Range('1.2.3.4', '1.2.3.5')
        r2 = IPv4Range('1.2.3.6', '1.2.3.9')

        for r in (r1 + r2, r2 + r1):
            self.assertEqual(str(r.fromIp), '1.2.3.4')
            self.assertEqual(str(r.toIp), '1.2.3.9')
    def test_len(self):
        '''Test IPv4Range length calculation'''
        r = IPv4Range('10.100.0.0', '10.100.0.100')
        self.assertEquals(len(r), 101)

        r = IPv4Range('10.100.1.100', '10.100.2.99')
        self.assertEquals(len(r), 256)

        r = IPv4Range('127.0.0.1', '127.0.0.1')
        self.assertEquals(len(r), 1)

        r = IPv4Range('1.2.3.4', '1.2.3.5')
        self.assertEqual(len(r), 2)
    def test_instanciation_fromto(self):
        '''Test IPv4Range instanciation using from and to addresses'''
        from_, to = '192.168.1.0', '192.168.1.10'

        r = IPv4Range(from_, to)
        self.assertEquals(str(r.fromIp), from_)
        self.assertEquals(str(r.toIp), to)

        r = IPv4Range(fromIp=from_, toIp=to)
        self.assertEquals(str(r.fromIp), from_)
        self.assertEquals(str(r.toIp), to)

        fromo = IPv4Address(from_)
        too = IPv4Address(to)

        r = IPv4Range(fromo, too)
        self.assertEquals(str(r.fromIp), from_)
        self.assertEquals(str(r.toIp), to)

        r = IPv4Range(fromIp=fromo, toIp=too)
        self.assertEquals(str(r.fromIp), from_)
        self.assertEquals(str(r.toIp), to)
    def test_add_exc(self):
        r1 = IPv4Range('1.2.3.4', '1.2.3.5')
        r2 = IPv4Range('1.2.3.7', '1.2.3.9')

        def addRanges():
            return r1 + "not a range"

        self.assertRaises(TypeError, addRanges)

        def addRanges():
            return r1 + r2

        self.assertRaises(ValueError, addRanges)

        def addRanges():
            return r2 + r1

        self.assertRaises(ValueError, addRanges)

        def addRanges():
            return r1 + r1

        self.assertRaises(ValueError, addRanges)
    def test_contains(self):
        '''Test whether the contains method works fine'''
        r = IPv4Range('10.100.0.10', '10.100.200.45')

        self.assert_('10.100.0.10' in r)
        self.assert_('10.100.200.45' in r)
        self.assert_('10.100.0.11' in r)
        self.assert_('10.100.200.44' in r)
        self.assert_('10.100.100.100' in r)

        self.assert_('10.100.0.9' not in r)
        self.assert_('10.100.200.46' not in r)
        self.assert_('192.168.10.100' not in r)

        self.assert_('0.0.0.0' not in r)
 def _askIpaddress(question,
                   startip=None,
                   endip=None,
                   network=None,
                   netmask=None):
     if startip and endip:
         return self.askString('%s(Range %s - %s)' %
                               (question, startip, endip),
                               regex=IPREGEX)
     if network and netmask:
         iprange = IPv4Range(netIp=network, netMask=netmask)
         return self.askString(
             '%s(Range %s - %s)' %
             (question, str(iprange.fromIp), str(iprange.toIp)),
             regex=IPREGEX)
 def test_netip_netmask_calculations(self):
     '''Test whether fromIp and toIp are calculated correctly when netIp and 
     netMask are provided'''
     ipr = IPv4Range(netIp='10.100.0.0', netMask='255.255.0.0')
     self.assertEqual(str(ipr.fromIp), '10.100.0.0')
     self.assertEqual(str(ipr.toIp), '10.100.255.255')
    def askIpaddressInRange(self,
                            question,
                            startip=None,
                            endip=None,
                            network=None,
                            netmask=None,
                            retry=-1):
        """
        Ask the user to enter a valid ipaddress
        
        Provide either startip and endip or network and netmask.
        
        @param question: The question that should be asked to the user
        @type question: string
        @param startip: Start ip of the available ip range to enter the ipaddress in
        @type startip: string
        @param endip: End ip of the available ip range to enter the ipaddress in
        @type endip: string
        @param network: Base IP address when using netmask-based range definition
        @type network: string
        @param netmask: Netmask to use in combination with C{network}
        @type netmask: string
        @return: Ip address
        @rtype: string

        """
        def _askIpaddress(question,
                          startip=None,
                          endip=None,
                          network=None,
                          netmask=None):
            if startip and endip:
                return self.askString('%s(Range %s - %s)' %
                                      (question, startip, endip),
                                      regex=IPREGEX)
            if network and netmask:
                iprange = IPv4Range(netIp=network, netMask=netmask)
                return self.askString(
                    '%s(Range %s - %s)' %
                    (question, str(iprange.fromIp), str(iprange.toIp)),
                    regex=IPREGEX)

        if (startip or endip) and (network or netmask):
            raise ValueError(
                "Provide either startip and endip or networkip and netmask")
        if (startip or endip) and not (startip and endip):
            raise ValueError(
                "Provide either startip and endip or networkip and netmask")
        if (network or netmask) and not (network and netmask):
            raise ValueError(
                "Provide either startip and endip or network and netmask")
        if (network and netmask) and (IPv4Address(
                int(IPv4Address(network)) & int(IPv4Address(netmask))) !=
                                      network):
            raise ValueError("Provided network and netmask don't match")

        retryCount = retry
        while retryCount != 0:
            ipaddress = _askIpaddress(question, startip, endip, network,
                                      netmask)
            iprange = IPv4Range(fromIp=startip,
                                toIp=endip,
                                netIp=network,
                                netMask=netmask)
            if ipaddress in IPv4Range(fromIp=startip,
                                      toIp=endip,
                                      netIp=network,
                                      netMask=netmask):
                return ipaddress
            self.echo("The provided ipaddress not in range, please try again")
            retryCount = retryCount - 1