7479ab47e0
Labels must start with an alphanumeric character, may contain alphanumeric characters or hyphens, but must not end with a hyphen. We enforce those rules, but allow underscores wherever hyphens are accepted, and allow alphanumeric ranges anywhere. We relax the definition of "alphanumeric" to include Unicode characters even though such inventory hostnames cannot be used in practice unless an ansible_ssh_host is set for each of them. We still don't enforce length restrictions—the fact that we have to accept ranges makes it more complex, and it doesn't seem especially worthwhile.
69 lines
2.3 KiB
Python
69 lines
2.3 KiB
Python
# -*- coding: utf-8 -*-
|
|
|
|
import unittest
|
|
|
|
from ansible.parsing.utils.addresses import parse_address
|
|
|
|
class TestParseAddress(unittest.TestCase):
|
|
|
|
tests = {
|
|
# IPv4 addresses
|
|
'192.0.2.3': ['192.0.2.3', None],
|
|
'192.0.2.3:23': ['192.0.2.3', 23],
|
|
|
|
# IPv6 addresses
|
|
'::': ['::', None],
|
|
'::1': ['::1', None],
|
|
'[::1]:442': ['::1', 442],
|
|
'abcd:ef98:7654:3210:abcd:ef98:7654:3210': ['abcd:ef98:7654:3210:abcd:ef98:7654:3210', None],
|
|
'[abcd:ef98:7654:3210:abcd:ef98:7654:3210]:42': ['abcd:ef98:7654:3210:abcd:ef98:7654:3210', 42],
|
|
|
|
# Hostnames
|
|
'some-host': ['some-host', None],
|
|
'some-host:80': ['some-host', 80],
|
|
'some.host.com:492': ['some.host.com', 492],
|
|
'[some.host.com]:493': ['some.host.com', 493],
|
|
'a-b.3foo_bar.com:23': ['a-b.3foo_bar.com', 23],
|
|
u'fóöbär': [u'fóöbär', None],
|
|
u'fóöbär:32': [u'fóöbär', 32],
|
|
u'fóöbär.éxàmplê.com:632': [u'fóöbär.éxàmplê.com', 632],
|
|
|
|
# Various errors
|
|
'': [None, None],
|
|
'some..host': [None, None],
|
|
'some.': [None, None],
|
|
'[example.com]': [None, None],
|
|
'some-': [None, None],
|
|
'some-.foo.com': [None, None],
|
|
'some.-foo.com': [None, None],
|
|
}
|
|
|
|
range_tests = {
|
|
'192.0.2.[3:10]': ['192.0.2.[3:10]', None],
|
|
'192.0.2.[3:10]:23': ['192.0.2.[3:10]', 23],
|
|
'abcd:ef98::7654:[1:9]': ['abcd:ef98::7654:[1:9]', None],
|
|
'[abcd:ef98::7654:[6:32]]:2222': ['abcd:ef98::7654:[6:32]', 2222],
|
|
u'fóöb[a:c]r.éxàmplê.com:632': [u'fóöb[a:c]r.éxàmplê.com', 632],
|
|
'[a:b]foo.com': ['[a:b]foo.com', None],
|
|
'foo[a:b].com': ['foo[a:b].com', None],
|
|
'foo[a:b]:42': ['foo[a:b]', 42],
|
|
'foo[a-b]-.com': [None, None],
|
|
'foo[a-b]:32': [None, None],
|
|
'foo[x-y]': [None, None],
|
|
}
|
|
|
|
def test_without_ranges(self):
|
|
for t in self.tests:
|
|
test = self.tests[t]
|
|
|
|
(host, port) = parse_address(t)
|
|
assert host == test[0]
|
|
assert port == test[1]
|
|
|
|
def test_with_ranges(self):
|
|
for t in self.range_tests:
|
|
test = self.range_tests[t]
|
|
|
|
(host, port) = parse_address(t, allow_ranges=True)
|
|
assert host == test[0]
|
|
assert port == test[1]
|