)]}'
{"tripleoclient/utils.py":[{"author":{"_account_id":12946,"name":"Udi Kalifon","email":"ukalifon@redhat.com","username":"ukalifon"},"change_message_id":"0293d132523a68c044908afefddf0af212c16f4b","unresolved":false,"context_lines":[{"line_number":87,"context_line":"    play \u003d os.path.join(workdir, playbook)"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    if os.path.exists(play):"},{"line_number":90,"context_line":"        cmd \u003d [\u0027ansible-playbook\u0027,"},{"line_number":91,"context_line":"               \u0027-i\u0027, inventory,"},{"line_number":92,"context_line":"               \u0027-c\u0027, connection, play"},{"line_number":93,"context_line":"               ]"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_baa8058b","line":90,"updated":"2018-07-17 06:13:18.000000000","message":"In cases where the stack name is not the default \"overcloud\", the cmd must be preceded by TRIPLEO_PLAN_NAME\u003d\u003c\u003cplan_name\u003e\u003e...\n\nFor example:\nTRIPLEO_PLAN_NAME\u003d\u003c\u003cplan_name\u003e\u003e ansible-playbook -i /usr/bin/tripleo-ansible-inventory /usr/share/openstack-tripleo-validations/validations/network-environment.yaml","commit_id":"cae34ba53e22b2eced69b1e5d302633da11b102c"},{"author":{"_account_id":28223,"name":"Cedric Jeanneret","display_name":"cjeanner (Tengu)","email":"cjeanner@redhat.com","username":"cjeanner"},"change_message_id":"d2096f9d17523cfcf9233feeda3cd1355c0c8965","unresolved":false,"context_lines":[{"line_number":87,"context_line":"    play \u003d os.path.join(workdir, playbook)"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    if os.path.exists(play):"},{"line_number":90,"context_line":"        cmd \u003d [\u0027ansible-playbook\u0027,"},{"line_number":91,"context_line":"               \u0027-i\u0027, inventory,"},{"line_number":92,"context_line":"               \u0027-c\u0027, connection, play"},{"line_number":93,"context_line":"               ]"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_da48618b","line":90,"in_reply_to":"5f7c97a3_baa8058b","updated":"2018-07-17 07:19:16.000000000","message":"We\u0027re talking about the (containerized) undercloud for now. It has a transient stack we can\u0027t \"manage\" (i.e. no specific name and the like).\n\nWhen we will come to the overcloud, hopefully we will get another good way to call ansible (maybe ansible-runner). This is a really quick thing in order to, at least, validate the disk space.\n\nThat said, if there\u0027s a mistral workflow, it will probably have all the required information. Will dig a bit in that direction while still testing the current way.","commit_id":"cae34ba53e22b2eced69b1e5d302633da11b102c"},{"author":{"_account_id":27427,"name":"David Peacock","email":"dpeacock@redhat.com","username":"davidjpeacock"},"change_message_id":"978cc982460d52b68ad295687caa6c873ba0b8e4","unresolved":false,"context_lines":[{"line_number":79,"context_line":"    :type output_callback: String"},{"line_number":80,"context_line":"    \"\"\""},{"line_number":81,"context_line":"    env \u003d None"},{"line_number":82,"context_line":"    _, tmp_config \u003d tempfile.mkstemp(prefix\u003dplaybook, suffix\u003d\u0027ansible.cfg\u0027)"},{"line_number":83,"context_line":"    with open(tmp_config, \u0027w+\u0027) as f:"},{"line_number":84,"context_line":"        f.write(\"[defaults]\\nstdout_callback \u003d %s\\n\" % output_callback)"},{"line_number":85,"context_line":"        if not retries:"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_7687e05c","line":82,"updated":"2018-07-17 12:45:26.000000000","message":"Is this the best place / default for the ansible config?","commit_id":"ac7e43dbd38949c9c11be3d8142b16c5fedef97a"},{"author":{"_account_id":28223,"name":"Cedric Jeanneret","display_name":"cjeanner (Tengu)","email":"cjeanner@redhat.com","username":"cjeanner"},"change_message_id":"9bff5be75d9a60e4a8f14c02317f8fb7708fda86","unresolved":false,"context_lines":[{"line_number":79,"context_line":"    :type output_callback: String"},{"line_number":80,"context_line":"    \"\"\""},{"line_number":81,"context_line":"    env \u003d None"},{"line_number":82,"context_line":"    _, tmp_config \u003d tempfile.mkstemp(prefix\u003dplaybook, suffix\u003d\u0027ansible.cfg\u0027)"},{"line_number":83,"context_line":"    with open(tmp_config, \u0027w+\u0027) as f:"},{"line_number":84,"context_line":"        f.write(\"[defaults]\\nstdout_callback \u003d %s\\n\" % output_callback)"},{"line_number":85,"context_line":"        if not retries:"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_16878c14","line":82,"in_reply_to":"5f7c97a3_7687e05c","updated":"2018-07-17 12:55:51.000000000","message":"I don\u0027t want to override any existing ansible configuration. I therefore pass this temporary file as an env var at line 89 and delete it once the run is over.","commit_id":"ac7e43dbd38949c9c11be3d8142b16c5fedef97a"},{"author":{"_account_id":20775,"name":"Carlos Camacho","email":"ccamacho@redhat.com","username":"ccamacho"},"change_message_id":"03b1ee9d4603f0e86689c6202736be287908c482","unresolved":false,"context_lines":[{"line_number":46,"context_line":"from six.moves.urllib import request"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"from tripleoclient import exceptions"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"def run_ansible_playbook(logger,"},{"line_number":52,"context_line":"                         workdir,"},{"line_number":53,"context_line":"                         playbook,"},{"line_number":54,"context_line":"                         inventory,"},{"line_number":55,"context_line":"                         retries\u003dTrue,"},{"line_number":56,"context_line":"                         connection\u003d\u0027smart\u0027,"},{"line_number":57,"context_line":"                         output_callback\u003d\u0027json\u0027):"},{"line_number":58,"context_line":"    \"\"\"Simple wrapper for ansible-playbook"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    :param logger: logger instance"},{"line_number":61,"context_line":"    :type logger: Logger"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    :param workdir: location of the playbook"},{"line_number":64,"context_line":"    :type workdir: String"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    :param playbook: playbook filename"},{"line_number":67,"context_line":"    :type playbook: String"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    :param inventory: either proper inventory file, or a coma-separated list"},{"line_number":70,"context_line":"    :type inventory: String"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    :param retries: do you want to get a retry_file?"},{"line_number":73,"context_line":"    :type retries: Boolean"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    :param connect: connection type (local, smart, etc)"},{"line_number":76,"context_line":"    :type connect: String"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    :param output_callback: Callback for output format. Defaults to \"json\""},{"line_number":79,"context_line":"    :type output_callback: String"},{"line_number":80,"context_line":"    \"\"\""},{"line_number":81,"context_line":"    env \u003d None"},{"line_number":82,"context_line":"    _, tmp_config \u003d tempfile.mkstemp(prefix\u003dplaybook, suffix\u003d\u0027ansible.cfg\u0027)"},{"line_number":83,"context_line":"    with open(tmp_config, \u0027w+\u0027) as f:"},{"line_number":84,"context_line":"        f.write(\"[defaults]\\nstdout_callback \u003d %s\\n\" % output_callback)"},{"line_number":85,"context_line":"        if not retries:"},{"line_number":86,"context_line":"            f.write(\"retry_files_enabled \u003d False\\n\")"},{"line_number":87,"context_line":"        f.close()"},{"line_number":88,"context_line":"    env \u003d os.environ.copy()"},{"line_number":89,"context_line":"    env[\u0027ANSIBLE_CONFIG\u0027] \u003d tmp_config"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    play \u003d os.path.join(workdir, playbook)"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    if os.path.exists(play):"},{"line_number":94,"context_line":"        cmd \u003d [\u0027ansible-playbook\u0027,"},{"line_number":95,"context_line":"               \u0027-i\u0027, inventory,"},{"line_number":96,"context_line":"               \u0027-c\u0027, connection, play"},{"line_number":97,"context_line":"               ]"},{"line_number":98,"context_line":"        proc \u003d run_command_and_log(logger, cmd, env\u003denv, retcode_only\u003dFalse)"},{"line_number":99,"context_line":"        proc.wait()"},{"line_number":100,"context_line":"        os.unlink(tmp_config)"},{"line_number":101,"context_line":"        if proc.returncode !\u003d 0:"},{"line_number":102,"context_line":"            raise RuntimeError(proc.stdout.read())"},{"line_number":103,"context_line":"    else:"},{"line_number":104,"context_line":"        os.unlink(tmp_config)"},{"line_number":105,"context_line":"        raise RuntimeError("},{"line_number":106,"context_line":"            _(\u0027No such playbook: %s\u0027) % play)"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"def bracket_ipv6(address):"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_595c5519","line":106,"range":{"start_line":49,"start_character":0,"end_line":106,"end_character":45},"updated":"2018-07-17 13:19:42.000000000","message":"Isn\u0027t this duplicated?\n\nhttps://github.com/openstack/tripleo-common/blob/master/tripleo_common/actions/ansible.py#L172","commit_id":"ac7e43dbd38949c9c11be3d8142b16c5fedef97a"},{"author":{"_account_id":20775,"name":"Carlos Camacho","email":"ccamacho@redhat.com","username":"ccamacho"},"change_message_id":"7c7f19aef1870d7b51714ae3878d8c0f938f9de0","unresolved":false,"context_lines":[{"line_number":46,"context_line":"from six.moves.urllib import request"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"from tripleoclient import exceptions"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"def run_ansible_playbook(logger,"},{"line_number":52,"context_line":"                         workdir,"},{"line_number":53,"context_line":"                         playbook,"},{"line_number":54,"context_line":"                         inventory,"},{"line_number":55,"context_line":"                         retries\u003dTrue,"},{"line_number":56,"context_line":"                         connection\u003d\u0027smart\u0027,"},{"line_number":57,"context_line":"                         output_callback\u003d\u0027json\u0027):"},{"line_number":58,"context_line":"    \"\"\"Simple wrapper for ansible-playbook"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    :param logger: logger instance"},{"line_number":61,"context_line":"    :type logger: Logger"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    :param workdir: location of the playbook"},{"line_number":64,"context_line":"    :type workdir: String"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    :param playbook: playbook filename"},{"line_number":67,"context_line":"    :type playbook: String"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    :param inventory: either proper inventory file, or a coma-separated list"},{"line_number":70,"context_line":"    :type inventory: String"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    :param retries: do you want to get a retry_file?"},{"line_number":73,"context_line":"    :type retries: Boolean"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    :param connect: connection type (local, smart, etc)"},{"line_number":76,"context_line":"    :type connect: String"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    :param output_callback: Callback for output format. Defaults to \"json\""},{"line_number":79,"context_line":"    :type output_callback: String"},{"line_number":80,"context_line":"    \"\"\""},{"line_number":81,"context_line":"    env \u003d None"},{"line_number":82,"context_line":"    _, tmp_config \u003d tempfile.mkstemp(prefix\u003dplaybook, suffix\u003d\u0027ansible.cfg\u0027)"},{"line_number":83,"context_line":"    with open(tmp_config, \u0027w+\u0027) as f:"},{"line_number":84,"context_line":"        f.write(\"[defaults]\\nstdout_callback \u003d %s\\n\" % output_callback)"},{"line_number":85,"context_line":"        if not retries:"},{"line_number":86,"context_line":"            f.write(\"retry_files_enabled \u003d False\\n\")"},{"line_number":87,"context_line":"        f.close()"},{"line_number":88,"context_line":"    env \u003d os.environ.copy()"},{"line_number":89,"context_line":"    env[\u0027ANSIBLE_CONFIG\u0027] \u003d tmp_config"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    play \u003d os.path.join(workdir, playbook)"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    if os.path.exists(play):"},{"line_number":94,"context_line":"        cmd \u003d [\u0027ansible-playbook\u0027,"},{"line_number":95,"context_line":"               \u0027-i\u0027, inventory,"},{"line_number":96,"context_line":"               \u0027-c\u0027, connection, play"},{"line_number":97,"context_line":"               ]"},{"line_number":98,"context_line":"        proc \u003d run_command_and_log(logger, cmd, env\u003denv, retcode_only\u003dFalse)"},{"line_number":99,"context_line":"        proc.wait()"},{"line_number":100,"context_line":"        os.unlink(tmp_config)"},{"line_number":101,"context_line":"        if proc.returncode !\u003d 0:"},{"line_number":102,"context_line":"            raise RuntimeError(proc.stdout.read())"},{"line_number":103,"context_line":"    else:"},{"line_number":104,"context_line":"        os.unlink(tmp_config)"},{"line_number":105,"context_line":"        raise RuntimeError("},{"line_number":106,"context_line":"            _(\u0027No such playbook: %s\u0027) % play)"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"def bracket_ipv6(address):"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_fc118f5d","line":106,"range":{"start_line":49,"start_character":0,"end_line":106,"end_character":45},"in_reply_to":"5f7c97a3_3c78678d","updated":"2018-07-17 14:24:44.000000000","message":"My general opinion is that too many interfaces to do the same shouldn\u0027t be OK, my bet should be to do it here as it is right now and then refactor/de-duplicate/move the bits in tripleo-common that does not depends on Mistral here.","commit_id":"ac7e43dbd38949c9c11be3d8142b16c5fedef97a"},{"author":{"_account_id":28223,"name":"Cedric Jeanneret","display_name":"cjeanner (Tengu)","email":"cjeanner@redhat.com","username":"cjeanner"},"change_message_id":"0d39be4cae09fcc90379231a3119411cee874634","unresolved":false,"context_lines":[{"line_number":46,"context_line":"from six.moves.urllib import request"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"from tripleoclient import exceptions"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"def run_ansible_playbook(logger,"},{"line_number":52,"context_line":"                         workdir,"},{"line_number":53,"context_line":"                         playbook,"},{"line_number":54,"context_line":"                         inventory,"},{"line_number":55,"context_line":"                         retries\u003dTrue,"},{"line_number":56,"context_line":"                         connection\u003d\u0027smart\u0027,"},{"line_number":57,"context_line":"                         output_callback\u003d\u0027json\u0027):"},{"line_number":58,"context_line":"    \"\"\"Simple wrapper for ansible-playbook"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    :param logger: logger instance"},{"line_number":61,"context_line":"    :type logger: Logger"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    :param workdir: location of the playbook"},{"line_number":64,"context_line":"    :type workdir: String"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    :param playbook: playbook filename"},{"line_number":67,"context_line":"    :type playbook: String"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    :param inventory: either proper inventory file, or a coma-separated list"},{"line_number":70,"context_line":"    :type inventory: String"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    :param retries: do you want to get a retry_file?"},{"line_number":73,"context_line":"    :type retries: Boolean"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    :param connect: connection type (local, smart, etc)"},{"line_number":76,"context_line":"    :type connect: String"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    :param output_callback: Callback for output format. Defaults to \"json\""},{"line_number":79,"context_line":"    :type output_callback: String"},{"line_number":80,"context_line":"    \"\"\""},{"line_number":81,"context_line":"    env \u003d None"},{"line_number":82,"context_line":"    _, tmp_config \u003d tempfile.mkstemp(prefix\u003dplaybook, suffix\u003d\u0027ansible.cfg\u0027)"},{"line_number":83,"context_line":"    with open(tmp_config, \u0027w+\u0027) as f:"},{"line_number":84,"context_line":"        f.write(\"[defaults]\\nstdout_callback \u003d %s\\n\" % output_callback)"},{"line_number":85,"context_line":"        if not retries:"},{"line_number":86,"context_line":"            f.write(\"retry_files_enabled \u003d False\\n\")"},{"line_number":87,"context_line":"        f.close()"},{"line_number":88,"context_line":"    env \u003d os.environ.copy()"},{"line_number":89,"context_line":"    env[\u0027ANSIBLE_CONFIG\u0027] \u003d tmp_config"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    play \u003d os.path.join(workdir, playbook)"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    if os.path.exists(play):"},{"line_number":94,"context_line":"        cmd \u003d [\u0027ansible-playbook\u0027,"},{"line_number":95,"context_line":"               \u0027-i\u0027, inventory,"},{"line_number":96,"context_line":"               \u0027-c\u0027, connection, play"},{"line_number":97,"context_line":"               ]"},{"line_number":98,"context_line":"        proc \u003d run_command_and_log(logger, cmd, env\u003denv, retcode_only\u003dFalse)"},{"line_number":99,"context_line":"        proc.wait()"},{"line_number":100,"context_line":"        os.unlink(tmp_config)"},{"line_number":101,"context_line":"        if proc.returncode !\u003d 0:"},{"line_number":102,"context_line":"            raise RuntimeError(proc.stdout.read())"},{"line_number":103,"context_line":"    else:"},{"line_number":104,"context_line":"        os.unlink(tmp_config)"},{"line_number":105,"context_line":"        raise RuntimeError("},{"line_number":106,"context_line":"            _(\u0027No such playbook: %s\u0027) % play)"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"def bracket_ipv6(address):"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_3c78678d","line":106,"range":{"start_line":49,"start_character":0,"end_line":106,"end_character":45},"in_reply_to":"5f7c97a3_595c5519","updated":"2018-07-17 13:56:20.000000000","message":"well, more or less, not really, maybe. At least it\u0027s more like https://github.com/openstack/tripleo-common/blob/master/tripleo_common/actions/ansible.py#L420\n\nFact is, I tried to use that, but it\u0027s not really documented -.-\u0027.\nAnd it seems to be a bit overkill, doing far too many things, like apparently overriding the ansible.cfg of the user, which is probably not a good idea.","commit_id":"ac7e43dbd38949c9c11be3d8142b16c5fedef97a"}],"tripleoclient/v1/undercloud_preflight.py":[{"author":{"_account_id":27427,"name":"David Peacock","email":"dpeacock@redhat.com","username":"davidjpeacock"},"change_message_id":"978cc982460d52b68ad295687caa6c873ba0b8e4","unresolved":false,"context_lines":[{"line_number":490,"context_line":"        # Other validations"},{"line_number":491,"context_line":"        _check_hostname()"},{"line_number":492,"context_line":"        _check_memory()"},{"line_number":493,"context_line":"        check_diskspace(upgrade)"},{"line_number":494,"context_line":"        _check_sysctl()"},{"line_number":495,"context_line":"        _validate_passwords_file()"},{"line_number":496,"context_line":"        # Heat templates validations"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_96ab9cd5","line":493,"updated":"2018-07-17 12:45:26.000000000","message":"_check_diskspace for consistency?","commit_id":"ac7e43dbd38949c9c11be3d8142b16c5fedef97a"},{"author":{"_account_id":28223,"name":"Cedric Jeanneret","display_name":"cjeanner (Tengu)","email":"cjeanner@redhat.com","username":"cjeanner"},"change_message_id":"9bff5be75d9a60e4a8f14c02317f8fb7708fda86","unresolved":false,"context_lines":[{"line_number":490,"context_line":"        # Other validations"},{"line_number":491,"context_line":"        _check_hostname()"},{"line_number":492,"context_line":"        _check_memory()"},{"line_number":493,"context_line":"        check_diskspace(upgrade)"},{"line_number":494,"context_line":"        _check_sysctl()"},{"line_number":495,"context_line":"        _validate_passwords_file()"},{"line_number":496,"context_line":"        # Heat templates validations"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_36a3a8b3","line":493,"in_reply_to":"5f7c97a3_96ab9cd5","updated":"2018-07-17 12:55:51.000000000","message":"Well, after a discussion with Emilien, we might want to allow checks being called directly. So a next patch will involve the \"unprivate check methods\". I can of course follow the current trend and rename that one later.","commit_id":"ac7e43dbd38949c9c11be3d8142b16c5fedef97a"}]}
