def assert_valid_iscsi_portal(portal): if not isinstance(portal, util.string_types): raise ValueError("iSCSI portal (%s) is not a string" % portal) m = re.match(ISCSI_PORTAL_REGEX, portal) if m is None: raise ValueError("iSCSI portal (%s) is not in the format " "(HOST:PORT)" % portal) host = m.group('host') if host.startswith('[') and host.endswith(']'): host = host[1:-1] if not util.is_valid_ipv6_address(host): raise ValueError("Invalid IPv6 address (%s) in iSCSI portal (%s)" % (host, portal)) try: port = int(m.group('port')) except ValueError: raise ValueError("iSCSI portal (%s) port (%s) is not an integer" % (portal, m.group('port'))) return host, port
def __init__(self, rfc4173): auth_m = None _rfc4173 = rfc4173 if not rfc4173.startswith('iscsi:'): raise ValueError('iSCSI specification (%s) did not start with ' 'iscsi:. iSCSI disks must be specified as ' 'iscsi:[user:password[:initiatoruser:'******'initiatorpassword]@]' 'host:proto:port:lun:targetname' % _rfc4173) rfc4173 = rfc4173[6:] if '@' in rfc4173: if rfc4173.count('@') != 1: raise ValueError('Only one @ symbol allowed in iSCSI disk ' 'specification (%s). iSCSI disks must be ' 'specified as' 'iscsi:[user:password[:initiatoruser:'******'initiatorpassword]@]' 'host:proto:port:lun:targetname' % _rfc4173) auth, target = rfc4173.split('@') auth_m = RFC4173_AUTH_REGEX.match(auth) if auth_m is None: raise ValueError('Invalid authentication specified for iSCSI ' 'disk (%s). iSCSI disks must be specified as ' 'iscsi:[user:password[:initiatoruser:'******'initiatorpassword]@]' 'host:proto:port:lun:targetname' % _rfc4173) else: target = rfc4173 target_m = RFC4173_TARGET_REGEX.match(target) if target_m is None: raise ValueError('Invalid target specified for iSCSI disk (%s). ' 'iSCSI disks must be specified as ' 'iscsi:[user:password[:initiatoruser:'******'initiatorpassword]@]' 'host:proto:port:lun:targetname' % _rfc4173) if target_m.group('proto') and target_m.group('proto') != '6': LOG.warn('Specified protocol for iSCSI (%s) is unsupported, ' 'assuming 6 (TCP)', target_m.group('proto')) if not target_m.group('host') or not target_m.group('targetname'): raise ValueError('Both host and targetname must be specified for ' 'iSCSI disks') if auth_m: self.user = auth_m.group('user') self.password = auth_m.group('password') self.iuser = auth_m.group('initiatoruser') self.ipassword = auth_m.group('initiatorpassword') else: self.user = None self.password = None self.iuser = None self.ipassword = None self.host = target_m.group('host') self.proto = '6' self.lun = int(target_m.group('lun')) if target_m.group('lun') else 0 self.target = target_m.group('targetname') try: self.port = int(target_m.group('port')) if target_m.group('port') \ else 3260 except ValueError: raise ValueError('Specified iSCSI port (%s) is not an integer' % target_m.group('port')) portal = '%s:%s' % (self.host, self.port) if self.host.startswith('[') and self.host.endswith(']'): self.host = self.host[1:-1] if not util.is_valid_ipv6_address(self.host): raise ValueError('Specified iSCSI IPv6 address (%s) is not ' 'valid' % self.host) portal = '[%s]:%s' % (self.host, self.port) assert_valid_iscsi_portal(portal) self.portal = portal
def test_is_valid_ipv6_address(self): self.assertFalse(util.is_valid_ipv6_address('192.168')) self.assertFalse(util.is_valid_ipv6_address('69.89.31.226')) self.assertFalse(util.is_valid_ipv6_address('254.254.254.254')) self.assertTrue(util.is_valid_ipv6_address('2001:db8::1')) self.assertTrue(util.is_valid_ipv6_address('::1')) self.assertTrue( util.is_valid_ipv6_address( '1200:0000:AB00:1234:0000:2552:7777:1313')) self.assertFalse( util.is_valid_ipv6_address('1200::AB00:1234::2552:7777:1313')) self.assertTrue( util.is_valid_ipv6_address('21DA:D3:0:2F3B:2AA:FF:FE28:9C5A')) self.assertFalse( util.is_valid_ipv6_address( '1200:0000:AB00:1234:O000:2552:7777:1313')) self.assertTrue( util.is_valid_ipv6_address('2002:4559:1FE2::4559:1FE2')) self.assertTrue( util.is_valid_ipv6_address('2002:4559:1fe2:0:0:0:4559:1fe2')) self.assertTrue( util.is_valid_ipv6_address( '2002:4559:1FE2:0000:0000:0000:4559:1FE2'))