)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":14985,"name":"Alex Schultz","email":"aschultz@next-development.com","username":"mwhahaha"},"change_message_id":"b04f3c3b09d9a1610ca8d8341cddf165a4aff56e","unresolved":false,"context_lines":[{"line_number":12,"context_line":"  If the host is not reachable, it\u0027ll raise an exception."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"* Use utils.get_ip to translate undercloud_admin_host and"},{"line_number":15,"context_line":"  undercloud_public_host to IP addresses."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Related-Bug: #1763776"},{"line_number":18,"context_line":"Change-Id: Ic008cc758493aa95e8aa237d23c2f66c0a930509"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"ffb9cba7_dfb298e6","line":15,"updated":"2019-04-25 23:46:00.000000000","message":"So shouldn\u0027t we just use these hosts but the local_ip is actually what we bind to? Just a thought","commit_id":"1f33bcab1ea69a60381f4ab205513fc07bf7de51"},{"author":{"_account_id":3153,"name":"Emilien Macchi","email":"emilien@redhat.com","username":"emilienm"},"change_message_id":"e4b831fb5c905d1dbf8ed4f777fec7abad3e0c27","unresolved":false,"context_lines":[{"line_number":12,"context_line":"  If the host is not reachable, it\u0027ll raise an exception."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"* Use utils.get_ip to translate undercloud_admin_host and"},{"line_number":15,"context_line":"  undercloud_public_host to IP addresses."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Related-Bug: #1763776"},{"line_number":18,"context_line":"Change-Id: Ic008cc758493aa95e8aa237d23c2f66c0a930509"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"ffb9cba7_5fc6a84a","line":15,"in_reply_to":"ffb9cba7_dfb298e6","updated":"2019-04-25 23:49:51.000000000","message":"yeah, good idea. I\u0027ll try it.","commit_id":"1f33bcab1ea69a60381f4ab205513fc07bf7de51"}],"tripleoclient/tests/test_utils.py":[{"author":{"_account_id":6926,"name":"Bogdan Dobrelya","email":"bdobreli@redhat.com","username":"bogdando"},"change_message_id":"5f4f722b60bf68f26175dcd77acd6c700442c3c9","unresolved":false,"context_lines":[{"line_number":894,"context_line":"        self.assertEqual(True, result)"},{"line_number":895,"context_line":""},{"line_number":896,"context_line":"    def test_with_valid_ipv6(self):"},{"line_number":897,"context_line":"        result \u003d utils.is_valid_ip(\u0027::1\u0027)"},{"line_number":898,"context_line":"        self.assertEqual(True, result)"},{"line_number":899,"context_line":""},{"line_number":900,"context_line":"    def test_with_invalid_ip(self):"}],"source_content_type":"text/x-python","patch_set":16,"id":"ffb9cba7_c8cdab85","line":897,"updated":"2019-05-02 07:47:41.000000000","message":"the commit msg states We raise if the IP is a loopback","commit_id":"b601ab649a995f9a048e077c19318c4a4c426a6b"},{"author":{"_account_id":3153,"name":"Emilien Macchi","email":"emilien@redhat.com","username":"emilienm"},"change_message_id":"f8e1cc292f22ffb5caf166209cbe23cd05642506","unresolved":false,"context_lines":[{"line_number":894,"context_line":"        self.assertEqual(True, result)"},{"line_number":895,"context_line":""},{"line_number":896,"context_line":"    def test_with_valid_ipv6(self):"},{"line_number":897,"context_line":"        result \u003d utils.is_valid_ip(\u0027::1\u0027)"},{"line_number":898,"context_line":"        self.assertEqual(True, result)"},{"line_number":899,"context_line":""},{"line_number":900,"context_line":"    def test_with_invalid_ip(self):"}],"source_content_type":"text/x-python","patch_set":16,"id":"dfbec78f_91b53bf1","line":897,"in_reply_to":"ffb9cba7_c8cdab85","updated":"2019-05-05 21:33:39.000000000","message":"yes but not in this function :-)","commit_id":"b601ab649a995f9a048e077c19318c4a4c426a6b"},{"author":{"_account_id":6926,"name":"Bogdan Dobrelya","email":"bdobreli@redhat.com","username":"bogdando"},"change_message_id":"a336a25600a7d66d561e349132553a54a0c07ce8","unresolved":false,"context_lines":[{"line_number":897,"context_line":"        result \u003d utils.is_valid_ip(\u0027::1\u0027)"},{"line_number":898,"context_line":"        self.assertEqual(True, result)"},{"line_number":899,"context_line":""},{"line_number":900,"context_line":"    def test_with_invalid_ip(self):"},{"line_number":901,"context_line":"        result \u003d utils.is_valid_ip(\u0027192.168.1%bad\u0027)"},{"line_number":902,"context_line":"        self.assertEqual(False, result)"},{"line_number":903,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"ffb9cba7_e8b42ff4","line":900,"updated":"2019-05-02 07:46:30.000000000","message":"let\u0027s also test for invalid fe80:: ?","commit_id":"b601ab649a995f9a048e077c19318c4a4c426a6b"},{"author":{"_account_id":3153,"name":"Emilien Macchi","email":"emilien@redhat.com","username":"emilienm"},"change_message_id":"f8e1cc292f22ffb5caf166209cbe23cd05642506","unresolved":false,"context_lines":[{"line_number":897,"context_line":"        result \u003d utils.is_valid_ip(\u0027::1\u0027)"},{"line_number":898,"context_line":"        self.assertEqual(True, result)"},{"line_number":899,"context_line":""},{"line_number":900,"context_line":"    def test_with_invalid_ip(self):"},{"line_number":901,"context_line":"        result \u003d utils.is_valid_ip(\u0027192.168.1%bad\u0027)"},{"line_number":902,"context_line":"        self.assertEqual(False, result)"},{"line_number":903,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"dfbec78f_b1babfdb","line":900,"in_reply_to":"ffb9cba7_c8928b57","updated":"2019-05-05 21:33:39.000000000","message":"I don\u0027t see much value of testing that much, the module itselfs is unit tested to find out if a valid IP is given or not.","commit_id":"b601ab649a995f9a048e077c19318c4a4c426a6b"},{"author":{"_account_id":6926,"name":"Bogdan Dobrelya","email":"bdobreli@redhat.com","username":"bogdando"},"change_message_id":"b8f3f2370fc3cba97f3f0ae2930bb40deb212a01","unresolved":false,"context_lines":[{"line_number":897,"context_line":"        result \u003d utils.is_valid_ip(\u0027::1\u0027)"},{"line_number":898,"context_line":"        self.assertEqual(True, result)"},{"line_number":899,"context_line":""},{"line_number":900,"context_line":"    def test_with_invalid_ip(self):"},{"line_number":901,"context_line":"        result \u003d utils.is_valid_ip(\u0027192.168.1%bad\u0027)"},{"line_number":902,"context_line":"        self.assertEqual(False, result)"},{"line_number":903,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"ffb9cba7_c8928b57","line":900,"in_reply_to":"ffb9cba7_e8b42ff4","updated":"2019-05-02 07:50:54.000000000","message":"to clarify, the valid version of it should be with an interface prefix, e.g.:\n\nfe80::x:x:x:x%eth1","commit_id":"b601ab649a995f9a048e077c19318c4a4c426a6b"},{"author":{"_account_id":6926,"name":"Bogdan Dobrelya","email":"bdobreli@redhat.com","username":"bogdando"},"change_message_id":"eb965efba81ff3ba3bfede3ee962df3629247c80","unresolved":false,"context_lines":[{"line_number":929,"context_line":""},{"line_number":930,"context_line":"    def test_with_fqdn_and_loopback(self):"},{"line_number":931,"context_line":"        with mock.patch.object(utils, \u0027get_host_ips\u0027) as mock_gethostips:"},{"line_number":932,"context_line":"            mock_gethostips.return_value \u003d [\u0027127.0.0.1\u0027]"},{"line_number":933,"context_line":"            self.assertRaises(exceptions.LookupError,"},{"line_number":934,"context_line":"                              utils.get_single_ip, \u0027myhost.domain\u0027)"},{"line_number":935,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"ffb9cba7_e8a98f8f","line":932,"updated":"2019-05-02 07:49:11.000000000","message":"please also test raising for ::1","commit_id":"b601ab649a995f9a048e077c19318c4a4c426a6b"}],"tripleoclient/utils.py":[{"author":{"_account_id":3153,"name":"Emilien Macchi","email":"emilien@redhat.com","username":"emilienm"},"change_message_id":"6510a217c2af6aeef10462d75156326149344247","unresolved":false,"context_lines":[{"line_number":163,"context_line":"            # socket.getaddrinfo returns a list of 5-tuples with the following"},{"line_number":164,"context_line":"            # structure: (family, socktype, proto, canonname, sockaddr)"},{"line_number":165,"context_line":"            # We return the first sockaddr (IP) found."},{"line_number":166,"context_line":"            host \u003d socket.getaddrinfo(host, None)[0][-1][0]"},{"line_number":167,"context_line":"        except socket.gaierror:"},{"line_number":168,"context_line":"            raise exceptions.NotFound(\u0027Coult not resolve %s host.\u0027 % host)"},{"line_number":169,"context_line":"    return host"}],"source_content_type":"text/x-python","patch_set":8,"id":"ffb9cba7_431c6377","line":166,"range":{"start_line":166,"start_character":11,"end_line":166,"end_character":59},"updated":"2019-04-29 17:20:31.000000000","message":"I can probably improve it with some functional programing. Will look this week if I can improve it otherwise I can do it later.","commit_id":"7d3adada53b68b3dacea6e7f46145b7d6a9272df"},{"author":{"_account_id":3153,"name":"Emilien Macchi","email":"emilien@redhat.com","username":"emilienm"},"change_message_id":"88e2ed7c6816c23a01f48bf5d4faa7c456d68bf7","unresolved":false,"context_lines":[{"line_number":163,"context_line":"            # socket.getaddrinfo returns a list of 5-tuples with the following"},{"line_number":164,"context_line":"            # structure: (family, socktype, proto, canonname, sockaddr)"},{"line_number":165,"context_line":"            # We return the first sockaddr (IP) found."},{"line_number":166,"context_line":"            host \u003d socket.getaddrinfo(host, None)[0][-1][0]"},{"line_number":167,"context_line":"        except socket.gaierror:"},{"line_number":168,"context_line":"            raise exceptions.NotFound(\u0027Coult not resolve %s host.\u0027 % host)"},{"line_number":169,"context_line":"    return host"}],"source_content_type":"text/x-python","patch_set":8,"id":"ffb9cba7_f47bcf77","line":166,"range":{"start_line":166,"start_character":11,"end_line":166,"end_character":59},"in_reply_to":"ffb9cba7_431c6377","updated":"2019-04-29 20:17:34.000000000","message":"quick demo of this code:\n\nPython 3.7.3 (default, Mar 27 2019, 13:41:07) \n[GCC 8.3.1 20190223 (Red Hat 8.3.1-2)] on linux\nType \"help\", \"copyright\", \"credits\" or \"license\" for more information.\n\u003e\u003e\u003e import socket\n\u003e\u003e\u003e host \u003d socket.getaddrinfo(\u0027thin\u0027, None)[0][-1][0]\n\u003e\u003e\u003e host\n\u0027fe80::16f9:6097:947f:6ddb\u0027\n\u003e\u003e\u003e \nthin ~ ip a\n1: lo: \u003cLOOPBACK,UP,LOWER_UP\u003e mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000\n    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00\n    inet 127.0.0.1/8 scope host lo\n       valid_lft forever preferred_lft forever\n    inet6 ::1/128 scope host \n       valid_lft forever preferred_lft forever\n2: enp0s31f6: \u003cNO-CARRIER,BROADCAST,MULTICAST,UP\u003e mtu 1500 qdisc fq_codel state DOWN group default qlen 1000\n    link/ether c8:5b:76:37:97:33 brd ff:ff:ff:ff:ff:ff\n3: wlp4s0: \u003cBROADCAST,MULTICAST,UP,LOWER_UP\u003e mtu 1500 qdisc mq state UP group default qlen 1000\n    link/ether e4:a4:71:4d:aa:c6 brd ff:ff:ff:ff:ff:ff\n    inet X.X.X.X/16 brd 10.36.255.255 scope global dynamic noprefixroute wlp4s0\n       valid_lft 7565sec preferred_lft 7565sec\n    inet6 fe80::16f9:6097:947f:6ddb/64 scope link noprefixroute \n       valid_lft forever preferred_lft forever\n4: virbr0: \u003cNO-CARRIER,BROADCAST,MULTICAST,UP\u003e mtu 1500 qdisc noqueue state DOWN group default qlen 1000\n    link/ether 52:54:00:e8:ac:0c brd ff:ff:ff:ff:ff:ff\n    inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0\n       valid_lft forever preferred_lft forever\n5: virbr0-nic: \u003cBROADCAST,MULTICAST\u003e mtu 1500 qdisc fq_codel master virbr0 state DOWN group default qlen 1000\n    link/ether 52:54:00:e8:ac:0c brd ff:ff:ff:ff:ff:ff\n6: virbr1: \u003cNO-CARRIER,BROADCAST,MULTICAST,UP\u003e mtu 1500 qdisc noqueue state DOWN group default qlen 1000\n    link/ether 52:54:00:27:82:15 brd ff:ff:ff:ff:ff:ff\n    inet 192.168.42.1/24 brd 192.168.42.255 scope global virbr1\n       valid_lft forever preferred_lft forever\n7: virbr1-nic: \u003cBROADCAST,MULTICAST\u003e mtu 1500 qdisc fq_codel master virbr1 state DOWN group default qlen 1000\n    link/ether 52:54:00:27:82:15 brd ff:ff:ff:ff:ff:ff\nthin ~ ping thin\nPING thin(thin (fe80::16f9:6097:947f:6ddb%wlp4s0)) 56 data bytes\n64 bytes from thin (fe80::16f9:6097:947f:6ddb%wlp4s0): icmp_seq\u003d1 ttl\u003d64 time\u003d0.086 ms\n^C\n--- thin ping statistics ---\n1 packets transmitted, 1 received, 0% packet loss, time 0ms\nrtt min/avg/max/mdev \u003d 0.086/0.086/0.086/0.000 ms","commit_id":"7d3adada53b68b3dacea6e7f46145b7d6a9272df"},{"author":{"_account_id":28223,"name":"Cedric Jeanneret","display_name":"cjeanner (Tengu)","email":"cjeanner@redhat.com","username":"cjeanner"},"change_message_id":"61ba0807888a4173bc51f49887026f9a890fb188","unresolved":false,"context_lines":[{"line_number":157,"context_line":"    \"\"\"Return True if the IP is either v4 or v6"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"    Return False if invalid."},{"line_number":160,"context_line":"    \"\"\""},{"line_number":161,"context_line":"    if netaddr.valid_ipv4(ip) or netaddr.valid_ipv6(ip):"},{"line_number":162,"context_line":"        return True"},{"line_number":163,"context_line":"    return False"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"def get_ip(host):"}],"source_content_type":"text/x-python","patch_set":11,"id":"ffb9cba7_38a4e7a5","line":163,"range":{"start_line":160,"start_character":0,"end_line":163,"end_character":16},"updated":"2019-05-01 07:56:34.000000000","message":"return (netaddr.valid_ipv4(ip) or netaddr.valid_ipv6(ip))","commit_id":"cc77b055d2b6e117e50596811fcd8fa6cc4e17c1"},{"author":{"_account_id":3153,"name":"Emilien Macchi","email":"emilien@redhat.com","username":"emilienm"},"change_message_id":"6f8aba94c31c4a71d29b36ea463e34301d9ad753","unresolved":false,"context_lines":[{"line_number":157,"context_line":"    \"\"\"Return True if the IP is either v4 or v6"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"    Return False if invalid."},{"line_number":160,"context_line":"    \"\"\""},{"line_number":161,"context_line":"    if netaddr.valid_ipv4(ip) or netaddr.valid_ipv6(ip):"},{"line_number":162,"context_line":"        return True"},{"line_number":163,"context_line":"    return False"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"def get_ip(host):"}],"source_content_type":"text/x-python","patch_set":11,"id":"ffb9cba7_93861413","line":163,"range":{"start_line":160,"start_character":0,"end_line":163,"end_character":16},"in_reply_to":"ffb9cba7_38a4e7a5","updated":"2019-05-01 12:06:10.000000000","message":"Done","commit_id":"cc77b055d2b6e117e50596811fcd8fa6cc4e17c1"},{"author":{"_account_id":3153,"name":"Emilien Macchi","email":"emilien@redhat.com","username":"emilienm"},"change_message_id":"dd6a98a24441e85ac8ec2def649fc1ec69d81994","unresolved":false,"context_lines":[{"line_number":171,"context_line":"        # First try IPv4 then IPv6. If result is invalid, we raise."},{"line_number":172,"context_line":"        try:"},{"line_number":173,"context_line":"            # socket.gethostbyname is only working with IPv4"},{"line_number":174,"context_line":"            ip \u003d socket.gethostbyname(host)"},{"line_number":175,"context_line":"        except socket.gaierror:"},{"line_number":176,"context_line":"            # socket.getaddrinfo returns a list of 5-tuples with the"},{"line_number":177,"context_line":"            # following structure:"}],"source_content_type":"text/x-python","patch_set":12,"id":"ffb9cba7_537c1c1e","line":174,"range":{"start_line":174,"start_character":12,"end_line":174,"end_character":43},"updated":"2019-05-01 12:07:40.000000000","message":"testing this code in CI and it fails here:\nhttp://logs.openstack.org/98/656398/3/check/tripleo-ci-centos-7-undercloud-containers/59a014a/logs/undercloud/var/log/extra/podman/containers/keepalived/stdout.log.txt.gz\n\nBecause it looked up the FQDN to localhost and binding of keepalived fails. We really don\u0027t want to bind on localhost anyway, we need to address that, in a loop probably.","commit_id":"76ab35e59386d9cab2695bacda0c6b299a370296"},{"author":{"_account_id":3153,"name":"Emilien Macchi","email":"emilien@redhat.com","username":"emilienm"},"change_message_id":"9abed1cda3f4a5570eaa532cefd774d7335f6f8e","unresolved":false,"context_lines":[{"line_number":199,"context_line":"                    break"},{"line_number":200,"context_line":"        # Make sure the returned value is an actual IP address"},{"line_number":201,"context_line":"        finally:"},{"line_number":202,"context_line":"            if not is_valid_ip(ip):"},{"line_number":203,"context_line":"                raise exceptions.NotFound(\u0027Invalid IP was resolved from %s: \u0027"},{"line_number":204,"context_line":"                                          \u0027%s\u0027 % (host, ip))"},{"line_number":205,"context_line":"    return ip"}],"source_content_type":"text/x-python","patch_set":13,"id":"ffb9cba7_1e454b43","line":202,"updated":"2019-05-01 13:34:54.000000000","message":"here we need to test if ip \u003d\u003d host then we raise, because it means no IP (that is not a loopback) was found.","commit_id":"cbfcf44b7fe518504a47966300b09e9ffabfc257"}]}
