)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1a469cbd0959b85fb2dd0f748362157c0b81aec3","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Sean Mooney \u003cwork@seanmooney.info\u003e"},{"line_number":5,"context_line":"CommitDate: 2019-07-08 18:35:11 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"libvirt: make config drives sticky bug 1835822"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This change reorders the call in"},{"line_number":10,"context_line":"_update_instance_after_spawn so that we call"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"7faddb67_29672c50","line":7,"range":{"start_line":7,"start_character":0,"end_line":7,"end_character":7},"updated":"2019-07-08 18:48:12.000000000","message":"This isn\u0027t a libvirt specific fix so you can remove this.","commit_id":"2b3eb2716276842e4873c09cdcbc0dec193a0ac7"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"c683e4224f283ed6215ae087d6bd73700ddf5f20","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Sean Mooney \u003cwork@seanmooney.info\u003e"},{"line_number":5,"context_line":"CommitDate: 2019-07-08 18:35:11 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"libvirt: make config drives sticky bug 1835822"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This change reorders the call in"},{"line_number":10,"context_line":"_update_instance_after_spawn so that we call"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"7faddb67_69e1a49a","line":7,"range":{"start_line":7,"start_character":0,"end_line":7,"end_character":7},"in_reply_to":"7faddb67_29672c50","updated":"2019-07-08 18:51:44.000000000","message":"your right its in the compute manager.\nwill do.","commit_id":"2b3eb2716276842e4873c09cdcbc0dec193a0ac7"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1a469cbd0959b85fb2dd0f748362157c0b81aec3","unresolved":false,"context_lines":[{"line_number":12,"context_line":"instance.launched_at. This ensures that if the vm"},{"line_number":13,"context_line":"is booted with a config drive because the host had"},{"line_number":14,"context_line":"force_config_drive\u003dtrue the instance will keep its"},{"line_number":15,"context_line":"cofig drive across reboots."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"This change fixes a regression introduced as part"},{"line_number":18,"context_line":"of fixing bug #1827492 which addressed failing"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"7faddb67_89550053","line":15,"range":{"start_line":15,"start_character":0,"end_line":15,"end_character":5},"updated":"2019-07-08 18:48:12.000000000","message":"config","commit_id":"2b3eb2716276842e4873c09cdcbc0dec193a0ac7"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b7e4b187f2664a3f35cbf5bd5079475068bc340e","unresolved":false,"context_lines":[{"line_number":17,"context_line":"This change fixes a regression introduced as part"},{"line_number":18,"context_line":"of fixing bug #1827492 which addressed failing"},{"line_number":19,"context_line":"to boot vms after changing force_config_drive\u003dfalse"},{"line_number":20,"context_line":"to force_config_drive\u003dtrue."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"Change-Id: I9194423f5f95e9799bd891548e24756131d65e76"},{"line_number":23,"context_line":"Related-Bug: #1827492"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"7faddb67_24ecd58d","line":20,"updated":"2019-07-31 15:33:50.000000000","message":"Would be good to explain the regression since I have to reload this context into my head. Change I0558ece92f8657c2f6294e07965c619eb7c8dfcf was the fix for the bug and changed the logic in configdrive.update_instance to use the instance.launched_at field with the CONF.force_config_drive option, meaning if the instance wasn\u0027t created with the user explicitly requesting a config drive, and the image doesn\u0027t require a config drive, and finally the config option is True and the instance is launching for the first time (really during build, rebuild/evacuate and unshelve). Once the server has been initially built, instance.launched_at will not be None. So the logic in configdrive.update_instance is saying the instance requires config drive if CONF.force_config_drive is True and the instance is being built for the first time, but after that it doesn\u0027t require a config drive based on the CONF.force_config_drive value.\n\nThe issue in bug 1827492 was that a VM was created on a host where CONF.force_config_drive\u003dFalse initially, and then config on that host was changed to CONF.force_config_drive\u003dTrue, and then the VM was rebooted and failed because the virt driver calls configdrive.required_by (which configdrive.update_instance also calls) and was returning True because CONF.force_config_drive\u003dTrue but there was no config drive for the VM so the reboot failed.\n\nYour bug 1835822 is the opposite case; the VM was created when CONF.force_config_drive\u003dTrue so configdrive.update_instance set instance.config_drive\u003dTrue when _update_instance_after_spawn called it, then the host changed to CONF.force_config_drive\u003dFalse and on reboot...what? I\u0027m not clear on that from the commit message. If initially instance.config_drive is set to True won\u0027t it \"stick\" across the host config changes because configdrive.required_by looks at instance.config_drive which would be True?\n\nLooking at your bug report and the logic today in _update_instance_after_spawn:\n\n    instance.launched_at \u003d timeutils.utcnow()\n    configdrive.update_instance(instance)\n\nAnd configdrive.required_by:\n\n    return (instance.config_drive or\n            (CONF.force_config_drive and not instance.launched_at) or\n            image_prop \u003d\u003d fields.ConfigDrivePolicy.MANDATORY\n            )\n\nIf at initial server build CONF.force_config_drive\u003dTrue, required_by would still return False (ignoring the user and image specified config drive) because instance.launched_at is not None, so instance.config_drive will be False even though it was built on a host with CONF.force_config_drive\u003dTrue, correct? And that\u0027s the regression.\n\nThis part of your bug report is confusing to me:\n\n\"this results in a vm that is spawned on a host with force_config_drive\u003dTrue initally spawning\nwith a config drive but loosing it after a hard reboot.\"\n\nThat seems the opposite of what I said above. Is that part of the bug report incorrect?","commit_id":"b8cb8ff8ec59a1477b16be94c5e366c9fcaa503e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2ef0487a03e6715b0b3426f9be6630d98c040427","unresolved":false,"context_lines":[{"line_number":17,"context_line":"This change fixes a regression introduced as part"},{"line_number":18,"context_line":"of fixing bug #1827492 which addressed failing"},{"line_number":19,"context_line":"to boot vms after changing force_config_drive\u003dfalse"},{"line_number":20,"context_line":"to force_config_drive\u003dtrue."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"Change-Id: I9194423f5f95e9799bd891548e24756131d65e76"},{"line_number":23,"context_line":"Related-Bug: #1827492"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"7faddb67_da103c51","line":20,"in_reply_to":"7faddb67_24ecd58d","updated":"2019-07-31 15:39:43.000000000","message":"\u003e This part of your bug report is confusing to me:\n \u003e \n \u003e \"this results in a vm that is spawned on a host with\n \u003e force_config_drive\u003dTrue initally spawning\n \u003e with a config drive but loosing it after a hard reboot.\"\n \u003e \n \u003e That seems the opposite of what I said above. Is that part of the\n \u003e bug report incorrect?\n\nI think I get this now. If the configdrive.required_by returns True on initial create because CONF.force_config_drive\u003dTrue and instance.launched_at\u003dNone, then the created instance has a config drive. But on reboot when the libvirt driver calls configdrive.required_by, it returns False regardless of CONF.force_config_drive\u003dTrue because instance.launched_at is not None, so the instance is rebooted without a config drive in the guest.\n\nI still think that\u0027s essentially moot though because it\u0027s asserting that when CONF.force_config_drive\u003dTrue on initial created, the instance will be created with a config drive, but that\u0027s not true because instance.launched_at (today, before your fix) will not be None when configdrive.required_by is called, right?","commit_id":"b8cb8ff8ec59a1477b16be94c5e366c9fcaa503e"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"16b380fc87465b643950af5f34a486c5b58f5e40","unresolved":false,"context_lines":[{"line_number":17,"context_line":"This change fixes a regression introduced as part"},{"line_number":18,"context_line":"of fixing bug #1827492 which addressed failing"},{"line_number":19,"context_line":"to boot vms after changing force_config_drive\u003dfalse"},{"line_number":20,"context_line":"to force_config_drive\u003dtrue."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"Change-Id: I9194423f5f95e9799bd891548e24756131d65e76"},{"line_number":23,"context_line":"Related-Bug: #1827492"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"7faddb67_fad095f9","line":20,"in_reply_to":"7faddb67_da103c51","updated":"2019-07-31 18:52:57.000000000","message":"today yes but that is precisely the behaviour that was changed by https://review.opendev.org/#/c/659703.\n\nhttps://review.opendev.org/#/c/659703. which tries to fix\nhttps://bugs.launchpad.net/nova/+bug/1827492\n\nalter the behavior so that the config drive would not be present after the vm was rebooted.\n\nprior to that change if a vm was  boot with\nCONF.force_config_drive\u003dTrue \n\nthen if  CONF.force_config_drive\u003dFalse was set and the agent restarted new vm would not have config driver but old vm would keep there config drive.\n\nthis behavior change was intoduce by this line \n\nhttps://review.opendev.org/#/c/659703/8/nova/virt/configdrive.py@169\n\nrequired_by is called after setting instance.launched_at\n\ntherefor bool(instance.launched_at) is always True\nand \n(CONF.force_config_drive and not instance.launched_at) \nis always false.\n(CONF.force_config_drive and not instance.launched_at) \u003d\u003e\n(CONF.force_config_drive and not True) \u003d\u003e (CONF.force_config_drive and False) \u003d\u003e False\n\n\nthe current code flow is\n\ninstance.launched_at \u003d timeutils.utcnow()\nconfigdrive.update_instance(instance)\n\nthis patch swap the order\n\nconfigdrive.update_instance(instance)\ninstance.launched_at \u003d timeutils.utcnow()\n\nso the first time the instance is booted instance.launched_at is unset when required_by is invoked \n\n\n(CONF.force_config_drive and not instance.launched_at) \u003d\u003e\n(CONF.force_config_drive and not False) \u003d\u003e (CONF.force_config_drive and True) \u003d\u003e CONF.force_config_drive \n\n\nand on the second after a reboot\ninstance.config_drive has been set so \n\n(instance.config_drive or\n            (CONF.force_config_drive and not instance.launched_at) or\n            image_prop \u003d\u003d fields.ConfigDrivePolicy.MANDATORY\n            )\n\nso the value set in the instance take precedence.\n\nwith the current code as modifed by https://review.opendev.org/#/c/659703/8/nova/virt/configdrive.py@169\nthe only time instance.config_drive  was ever true was if it was set in teh api or in the image property.\nthe config value was never saved which is not the behavior we had before https://review.opendev.org/#/c/659703/8/nova/virt/configdrive.py@169","commit_id":"b8cb8ff8ec59a1477b16be94c5e366c9fcaa503e"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"90e9b0622a581730ee6db16a9b51e419c1aaccd5","unresolved":false,"context_lines":[{"line_number":17,"context_line":"This change fixes a regression introduced as part"},{"line_number":18,"context_line":"of fixing bug #1827492 which addressed failing"},{"line_number":19,"context_line":"to boot vms after changing force_config_drive\u003dfalse"},{"line_number":20,"context_line":"to force_config_drive\u003dtrue."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"Change-Id: I9194423f5f95e9799bd891548e24756131d65e76"},{"line_number":23,"context_line":"Related-Bug: #1827492"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"7faddb67_9aef16b0","line":20,"in_reply_to":"7faddb67_dd003305","updated":"2019-08-01 09:58:13.000000000","message":"yep","commit_id":"b8cb8ff8ec59a1477b16be94c5e366c9fcaa503e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"dd504ff1a3e9c5550c4dc34e8d47f76dd615447d","unresolved":false,"context_lines":[{"line_number":17,"context_line":"This change fixes a regression introduced as part"},{"line_number":18,"context_line":"of fixing bug #1827492 which addressed failing"},{"line_number":19,"context_line":"to boot vms after changing force_config_drive\u003dfalse"},{"line_number":20,"context_line":"to force_config_drive\u003dtrue."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"Change-Id: I9194423f5f95e9799bd891548e24756131d65e76"},{"line_number":23,"context_line":"Related-Bug: #1827492"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"7faddb67_dd003305","line":20,"in_reply_to":"7faddb67_fad095f9","updated":"2019-07-31 19:50:12.000000000","message":"Right, so in summary:\n\n\u003e If at initial server build CONF.force_config_drive\u003dTrue, required_by would still return False (ignoring the user and image specified config drive) because instance.launched_at is not None, so instance.config_drive will be False even though it was built on a host with CONF.force_config_drive\u003dTrue, correct? And that\u0027s the regression.","commit_id":"b8cb8ff8ec59a1477b16be94c5e366c9fcaa503e"}],"nova/compute/manager.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1a469cbd0959b85fb2dd0f748362157c0b81aec3","unresolved":false,"context_lines":[{"line_number":1713,"context_line":"        instance.vm_state \u003d vm_states.ACTIVE"},{"line_number":1714,"context_line":"        instance.task_state \u003d None"},{"line_number":1715,"context_line":"        # NOTE(sean-k-mooney): configdrive.update_instance checks"},{"line_number":1716,"context_line":"        # instance.launched_at too determin if it is the first or"},{"line_number":1717,"context_line":"        # subsequent boot of an instance. We need to call update_instance"},{"line_number":1718,"context_line":"        # first before setting instance.launched_at or the config drive will"},{"line_number":1719,"context_line":"        # be lost on a hard rebooting the instance when"}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_a9523c66","line":1716,"range":{"start_line":1716,"start_character":31,"end_line":1716,"end_character":43},"updated":"2019-07-08 18:48:12.000000000","message":"to determine","commit_id":"2b3eb2716276842e4873c09cdcbc0dec193a0ac7"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1a469cbd0959b85fb2dd0f748362157c0b81aec3","unresolved":false,"context_lines":[{"line_number":1716,"context_line":"        # instance.launched_at too determin if it is the first or"},{"line_number":1717,"context_line":"        # subsequent boot of an instance. We need to call update_instance"},{"line_number":1718,"context_line":"        # first before setting instance.launched_at or the config drive will"},{"line_number":1719,"context_line":"        # be lost on a hard rebooting the instance when"},{"line_number":1720,"context_line":"        # force_config_drive\u003dtrue. see bug #1835822."},{"line_number":1721,"context_line":"        configdrive.update_instance(instance)"},{"line_number":1722,"context_line":"        instance.launched_at \u003d timeutils.utcnow()"}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_494f08bd","line":1719,"range":{"start_line":1719,"start_character":28,"end_line":1719,"end_character":37},"updated":"2019-07-08 18:48:12.000000000","message":"reboot of","commit_id":"2b3eb2716276842e4873c09cdcbc0dec193a0ac7"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b7e4b187f2664a3f35cbf5bd5079475068bc340e","unresolved":false,"context_lines":[{"line_number":1714,"context_line":"        instance.task_state \u003d None"},{"line_number":1715,"context_line":"        # NOTE(sean-k-mooney): configdrive.update_instance checks"},{"line_number":1716,"context_line":"        # instance.launched_at to determine if it is the first or"},{"line_number":1717,"context_line":"        # subsequent boot of an instance. We need to call update_instance"},{"line_number":1718,"context_line":"        # first before setting instance.launched_at or the config drive will"},{"line_number":1719,"context_line":"        # be lost on a hard reboot of the instance when"},{"line_number":1720,"context_line":"        # force_config_drive\u003dtrue. see bug #1835822."}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_ff6c0ad1","line":1717,"range":{"start_line":1717,"start_character":21,"end_line":1717,"end_character":25},"updated":"2019-07-31 15:33:50.000000000","message":"nit: say \"spawn\" here since boot is generally used as a synonym for server create / initial build, but this method is called for other cases that driver.spawn is used, specifically unshelve and rebuild/evacuate.","commit_id":"b8cb8ff8ec59a1477b16be94c5e366c9fcaa503e"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"16b380fc87465b643950af5f34a486c5b58f5e40","unresolved":false,"context_lines":[{"line_number":1714,"context_line":"        instance.task_state \u003d None"},{"line_number":1715,"context_line":"        # NOTE(sean-k-mooney): configdrive.update_instance checks"},{"line_number":1716,"context_line":"        # instance.launched_at to determine if it is the first or"},{"line_number":1717,"context_line":"        # subsequent boot of an instance. We need to call update_instance"},{"line_number":1718,"context_line":"        # first before setting instance.launched_at or the config drive will"},{"line_number":1719,"context_line":"        # be lost on a hard reboot of the instance when"},{"line_number":1720,"context_line":"        # force_config_drive\u003dtrue. see bug #1835822."}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_baef7daf","line":1717,"range":{"start_line":1717,"start_character":21,"end_line":1717,"end_character":25},"in_reply_to":"7faddb67_ff6c0ad1","updated":"2019-07-31 18:52:57.000000000","message":"ok. althogh it is trying to determin if tis the inital server create/build or if its one of the other cases so i did want to imply inital server create by using boot but ill update it.","commit_id":"b8cb8ff8ec59a1477b16be94c5e366c9fcaa503e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b7e4b187f2664a3f35cbf5bd5079475068bc340e","unresolved":false,"context_lines":[{"line_number":1715,"context_line":"        # NOTE(sean-k-mooney): configdrive.update_instance checks"},{"line_number":1716,"context_line":"        # instance.launched_at to determine if it is the first or"},{"line_number":1717,"context_line":"        # subsequent boot of an instance. We need to call update_instance"},{"line_number":1718,"context_line":"        # first before setting instance.launched_at or the config drive will"},{"line_number":1719,"context_line":"        # be lost on a hard reboot of the instance when"},{"line_number":1720,"context_line":"        # force_config_drive\u003dtrue. see bug #1835822."},{"line_number":1721,"context_line":"        configdrive.update_instance(instance)"},{"line_number":1722,"context_line":"        instance.launched_at \u003d timeutils.utcnow()"},{"line_number":1723,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_7f601ad0","line":1720,"range":{"start_line":1718,"start_character":52,"end_line":1720,"end_character":34},"updated":"2019-07-31 15:33:50.000000000","message":"This is confusing/misleading. Reboot isn\u0027t calling this method, and I think you\u0027re maybe jumping a few steps between initial create and the reboot. I think the basic issue, as noted in the commit message, is that on initial build CONF.force_config_drive\u003dTrue will not be honored because instance.launched_at would already be set, so the instance initially built won\u0027t have a config drive, right? I\u0027m not sure why that matters for reboot.","commit_id":"b8cb8ff8ec59a1477b16be94c5e366c9fcaa503e"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"16b380fc87465b643950af5f34a486c5b58f5e40","unresolved":false,"context_lines":[{"line_number":1715,"context_line":"        # NOTE(sean-k-mooney): configdrive.update_instance checks"},{"line_number":1716,"context_line":"        # instance.launched_at to determine if it is the first or"},{"line_number":1717,"context_line":"        # subsequent boot of an instance. We need to call update_instance"},{"line_number":1718,"context_line":"        # first before setting instance.launched_at or the config drive will"},{"line_number":1719,"context_line":"        # be lost on a hard reboot of the instance when"},{"line_number":1720,"context_line":"        # force_config_drive\u003dtrue. see bug #1835822."},{"line_number":1721,"context_line":"        configdrive.update_instance(instance)"},{"line_number":1722,"context_line":"        instance.launched_at \u003d timeutils.utcnow()"},{"line_number":1723,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_da4839b4","line":1720,"range":{"start_line":1718,"start_character":52,"end_line":1720,"end_character":34},"in_reply_to":"7faddb67_7f601ad0","updated":"2019-07-31 18:52:57.000000000","message":"no\n\nwhen the instance  is initally build it will have a config drive. after a hard reboot with no change to the config it will nolonger have a config drive.\n\n\nthat is the regression that https://review.opendev.org/#/c/659703\n\n\ni explain this badly in my other reponce in the commit message but as you said with the ordering before this patch.\ninstance.launched_at is alwasys set.\n\nso bool(instance.launched_at) is alway true\nand \n(CONF.force_config_drive and not instance.launched_at) \u003d\u003e\n(CONF.force_config_drive and not True) \u003d\u003e\n(CONF.force_config_drive and False) \u003d\u003e False\n\nso that prevent configrive.update_instance(instance)\nform ever seting instance.config_drive to True based on the config.","commit_id":"b8cb8ff8ec59a1477b16be94c5e366c9fcaa503e"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"bc91b6f4a62a7005dc0088bf21e7d345b8889db8","unresolved":false,"context_lines":[{"line_number":1756,"context_line":"        # first before setting instance.launched_at or instance.config_drive"},{"line_number":1757,"context_line":"        # will never be set to true based on the value of force_config_drive."},{"line_number":1758,"context_line":"        # As a result the config drive will be lost on a hard reboot of the"},{"line_number":1759,"context_line":"        # instance even when force_config_drive\u003dtrue. see bug #1835822."},{"line_number":1760,"context_line":"        configdrive.update_instance(instance)"},{"line_number":1761,"context_line":"        instance.launched_at \u003d timeutils.utcnow()"},{"line_number":1762,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"3fa7e38b_9a69c4bf","line":1759,"updated":"2019-09-19 07:46:33.000000000","message":"That\u0027s a bit fat note for a specific configdrive issue, but okay.","commit_id":"641feb62a33e211a3ed1f9a2309ee16d827f5fe2"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"325af8c160fa13f9c3c3de4ac11be4da83226131","unresolved":false,"context_lines":[{"line_number":1756,"context_line":"        # first before setting instance.launched_at or instance.config_drive"},{"line_number":1757,"context_line":"        # will never be set to true based on the value of force_config_drive."},{"line_number":1758,"context_line":"        # As a result the config drive will be lost on a hard reboot of the"},{"line_number":1759,"context_line":"        # instance even when force_config_drive\u003dtrue. see bug #1835822."},{"line_number":1760,"context_line":"        configdrive.update_instance(instance)"},{"line_number":1761,"context_line":"        instance.launched_at \u003d timeutils.utcnow()"},{"line_number":1762,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"3fa7e38b_6bfafc42","line":1759,"in_reply_to":"3fa7e38b_9a69c4bf","updated":"2019-09-19 11:31:03.000000000","message":"originally i had not tests just the note so i had to explan why moving the line down one was important and why you should\nnot change it. the funtional tests will now prevent you from messing this up but its still good to explain.","commit_id":"641feb62a33e211a3ed1f9a2309ee16d827f5fe2"}],"nova/tests/functional/regressions/test_bug_1835822.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"3652a4b9fa856092ad4fd84a8af5c17137f8a39c","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# All Rights Reserved."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa7e38b_6b71c3e0","line":1,"updated":"2019-09-17 16:00:34.000000000","message":"You can remove this.","commit_id":"4031da0a8c80123f2da1e14dcc6ae51a7c690940"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"30be9e29d907a7e5139032360959a0d646ee5874","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# All Rights Reserved."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa7e38b_fd9d7666","line":1,"in_reply_to":"3fa7e38b_6b71c3e0","updated":"2019-09-17 16:16:55.000000000","message":"ya this is jsut copy paste.\n\ni dislike adding the copyright assertion but i need the license header due to the hacking checks.","commit_id":"4031da0a8c80123f2da1e14dcc6ae51a7c690940"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"3dcfa000e24cab3ce3447d55a61e042218504944","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# All Rights Reserved."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa7e38b_7340d508","line":1,"in_reply_to":"3fa7e38b_fd9d7666","updated":"2019-09-17 17:54:39.000000000","message":"The Apache license header is fine, it\u0027s the All Rights Reserved line that you don\u0027t need.","commit_id":"4031da0a8c80123f2da1e14dcc6ae51a7c690940"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"3652a4b9fa856092ad4fd84a8af5c17137f8a39c","unresolved":false,"context_lines":[{"line_number":23,"context_line":"class RegressionTest1835822("},{"line_number":24,"context_line":"    test.TestCase, integrated_helpers.InstanceHelperMixin):"},{"line_number":25,"context_line":"    # ---------------------------- setup ----------------------------"},{"line_number":26,"context_line":"    api_major_version \u003d \u0027v2.1\u0027"},{"line_number":27,"context_line":"    microversion \u003d \u0027latest\u0027"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    USE_NEUTRON \u003d True"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    def setUp(self):"},{"line_number":32,"context_line":"        super(RegressionTest1835822, self).setUp()"}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa7e38b_cb7f97a9","line":29,"range":{"start_line":26,"start_character":4,"end_line":29,"end_character":22},"updated":"2019-09-17 16:00:34.000000000","message":"These are never used.","commit_id":"4031da0a8c80123f2da1e14dcc6ae51a7c690940"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"3652a4b9fa856092ad4fd84a8af5c17137f8a39c","unresolved":false,"context_lines":[{"line_number":50,"context_line":"                          active_server[\u0027id\u0027], args)"},{"line_number":51,"context_line":"        active_server \u003d self._wait_for_state_change("},{"line_number":52,"context_line":"            self.api, active_server, \u0027ACTIVE\u0027)"},{"line_number":53,"context_line":"        self.assertEqual(\u0027ACTIVE\u0027, active_server[\u0027status\u0027])"},{"line_number":54,"context_line":"        return active_server"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    def _shelve_server(self, active_server):"}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa7e38b_6b4a2381","line":53,"updated":"2019-09-17 16:00:34.000000000","message":"This is redundant. If this is ever false then _wait_for_state_change is broken. I\u0027m guessing this was copied from when this was using ServersTestBase or whatever and _wait_for_state_change there is different (and dumb IMO) since it\u0027s waiting for the status to change *from* whatever you specify rather than waiting for a terminal status.","commit_id":"4031da0a8c80123f2da1e14dcc6ae51a7c690940"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"30be9e29d907a7e5139032360959a0d646ee5874","unresolved":false,"context_lines":[{"line_number":50,"context_line":"                          active_server[\u0027id\u0027], args)"},{"line_number":51,"context_line":"        active_server \u003d self._wait_for_state_change("},{"line_number":52,"context_line":"            self.api, active_server, \u0027ACTIVE\u0027)"},{"line_number":53,"context_line":"        self.assertEqual(\u0027ACTIVE\u0027, active_server[\u0027status\u0027])"},{"line_number":54,"context_line":"        return active_server"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    def _shelve_server(self, active_server):"}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa7e38b_bda05ea7","line":53,"in_reply_to":"3fa7e38b_6b4a2381","updated":"2019-09-17 16:16:55.000000000","message":"ya this is just form the previou version and i thnk coppine this function fo shelve and unshelve. ill remvoe this ant he ones below","commit_id":"4031da0a8c80123f2da1e14dcc6ae51a7c690940"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"3652a4b9fa856092ad4fd84a8af5c17137f8a39c","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        self.api.post_server_action(active_server[\u0027id\u0027], {\u0027shelve\u0027: {}})"},{"line_number":59,"context_line":"        shelved_server \u003d self._wait_for_state_change("},{"line_number":60,"context_line":"            self.api, active_server, \u0027SHELVED\u0027)"},{"line_number":61,"context_line":"        self.assertEqual(\u0027SHELVED\u0027, shelved_server[\u0027status\u0027])"},{"line_number":62,"context_line":"        return shelved_server"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    def _unshelve_server(self, shelved_server):"}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa7e38b_0b5fef41","line":61,"updated":"2019-09-17 16:00:34.000000000","message":"same","commit_id":"4031da0a8c80123f2da1e14dcc6ae51a7c690940"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"3652a4b9fa856092ad4fd84a8af5c17137f8a39c","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        self.api.post_server_action(shelved_server[\u0027id\u0027], {\u0027unshelve\u0027: {}})"},{"line_number":67,"context_line":"        active_server \u003d self._wait_for_state_change("},{"line_number":68,"context_line":"            self.api, shelved_server, \u0027ACTIVE\u0027)"},{"line_number":69,"context_line":"        self.assertEqual(\u0027ACTIVE\u0027, active_server[\u0027status\u0027])"},{"line_number":70,"context_line":"        return active_server"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    def _create_active_server(self, server_args\u003dNone):"}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa7e38b_6b3f83d6","line":69,"updated":"2019-09-17 16:00:34.000000000","message":"same","commit_id":"4031da0a8c80123f2da1e14dcc6ae51a7c690940"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"3652a4b9fa856092ad4fd84a8af5c17137f8a39c","unresolved":false,"context_lines":[{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    def _create_active_server(self, server_args\u003dNone):"},{"line_number":73,"context_line":"        basic_server \u003d {"},{"line_number":74,"context_line":"                \u0027flavorRef\u0027: \u00271\u0027,"},{"line_number":75,"context_line":"                \u0027name\u0027: \u0027test_fill_vifs_migration\u0027,"},{"line_number":76,"context_line":"                \u0027networks\u0027: [{"},{"line_number":77,"context_line":"                    \u0027uuid\u0027: nova_fixtures.NeutronFixture.network_1[\u0027id\u0027]"},{"line_number":78,"context_line":"                }],"},{"line_number":79,"context_line":"                \u0027imageRef\u0027: fake_image.get_valid_image_id()"},{"line_number":80,"context_line":"            }"},{"line_number":81,"context_line":"        if server_args:"},{"line_number":82,"context_line":"            basic_server.update(server_args)"},{"line_number":83,"context_line":"        server \u003d self.api.post_server({\u0027server\u0027: basic_server})"}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa7e38b_2b218bb5","line":80,"range":{"start_line":74,"start_character":0,"end_line":80,"end_character":13},"updated":"2019-09-17 16:00:34.000000000","message":"dedent one","commit_id":"4031da0a8c80123f2da1e14dcc6ae51a7c690940"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"3652a4b9fa856092ad4fd84a8af5c17137f8a39c","unresolved":false,"context_lines":[{"line_number":145,"context_line":""},{"line_number":146,"context_line":"    def test_create_server_config_drive_shelve_unshelve_conf_change(self):"},{"line_number":147,"context_line":"        \"\"\"Verify that we can create a server with or without a forced"},{"line_number":148,"context_line":"        config drive it does not change across a reboot."},{"line_number":149,"context_line":"        \"\"\""},{"line_number":150,"context_line":"        # NOTE(sean-k-mooney): we do not need to restart the compute"},{"line_number":151,"context_line":"        # service because of the way self.flags overrides the config"}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa7e38b_bd27feb6","line":148,"range":{"start_line":148,"start_character":49,"end_line":148,"end_character":55},"updated":"2019-09-17 16:00:34.000000000","message":"shelve/unshelve?","commit_id":"4031da0a8c80123f2da1e14dcc6ae51a7c690940"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"30be9e29d907a7e5139032360959a0d646ee5874","unresolved":false,"context_lines":[{"line_number":145,"context_line":""},{"line_number":146,"context_line":"    def test_create_server_config_drive_shelve_unshelve_conf_change(self):"},{"line_number":147,"context_line":"        \"\"\"Verify that we can create a server with or without a forced"},{"line_number":148,"context_line":"        config drive it does not change across a reboot."},{"line_number":149,"context_line":"        \"\"\""},{"line_number":150,"context_line":"        # NOTE(sean-k-mooney): we do not need to restart the compute"},{"line_number":151,"context_line":"        # service because of the way self.flags overrides the config"}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa7e38b_1d9bb272","line":148,"range":{"start_line":148,"start_character":49,"end_line":148,"end_character":55},"in_reply_to":"3fa7e38b_bd27feb6","updated":"2019-09-17 16:16:55.000000000","message":"yes","commit_id":"4031da0a8c80123f2da1e14dcc6ae51a7c690940"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"3652a4b9fa856092ad4fd84a8af5c17137f8a39c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"3fa7e38b_3d3b0ed2","line":173,"updated":"2019-09-17 16:00:34.000000000","message":"How about a test for rebuild? That also hits spawn on the same host.","commit_id":"4031da0a8c80123f2da1e14dcc6ae51a7c690940"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"30be9e29d907a7e5139032360959a0d646ee5874","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"3fa7e38b_7ddc2646","line":173,"in_reply_to":"3fa7e38b_3d3b0ed2","updated":"2019-09-17 16:16:55.000000000","message":"yes that is true. sure i might as well test all the common code paths now.","commit_id":"4031da0a8c80123f2da1e14dcc6ae51a7c690940"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7170512e202f2f7f5dc51e9c6f83fd0adebb6eba","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        # the image fake backend needed for image discovery"},{"line_number":37,"context_line":"        fake_image.stub_out_image_service(self)"},{"line_number":38,"context_line":"        self.addCleanup(fake_image.FakeImageService_reset)"},{"line_number":39,"context_line":"        self.image_ref_0 \u003d fake_image.FakeImageService().detail(None)[0][\u0027id\u0027]"},{"line_number":40,"context_line":"        self.image_ref_1 \u003d fake_image.FakeImageService().detail(None)[1][\u0027id\u0027]"},{"line_number":41,"context_line":"        self.flavor_ref_1 \u003d 1"},{"line_number":42,"context_line":"        self.flavor_ref_2 \u003d 2"}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_3321fd4e","line":39,"updated":"2019-09-17 18:05:02.000000000","message":"nit on naming, be consistent with the index suffix, e.g. _1 and _2 for the image to match the flavor.","commit_id":"4be240c4c7b514869e5fd8acafd76d7b1f7ffaba"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f1463a1718028b71ffe28885204fcc80244d8424","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        # the image fake backend needed for image discovery"},{"line_number":37,"context_line":"        fake_image.stub_out_image_service(self)"},{"line_number":38,"context_line":"        self.addCleanup(fake_image.FakeImageService_reset)"},{"line_number":39,"context_line":"        self.image_ref_0 \u003d fake_image.FakeImageService().detail(None)[0][\u0027id\u0027]"},{"line_number":40,"context_line":"        self.image_ref_1 \u003d fake_image.FakeImageService().detail(None)[1][\u0027id\u0027]"},{"line_number":41,"context_line":"        self.flavor_ref_1 \u003d 1"},{"line_number":42,"context_line":"        self.flavor_ref_2 \u003d 2"}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_328ec978","line":39,"in_reply_to":"3fa7e38b_3321fd4e","updated":"2019-09-18 12:55:30.000000000","message":"i was trying to match the index in the array but since im removeing the flavors i think i can leave these as they are since the flavor refs will not be a thing any more.","commit_id":"4be240c4c7b514869e5fd8acafd76d7b1f7ffaba"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7170512e202f2f7f5dc51e9c6f83fd0adebb6eba","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        # the image fake backend needed for image discovery"},{"line_number":37,"context_line":"        fake_image.stub_out_image_service(self)"},{"line_number":38,"context_line":"        self.addCleanup(fake_image.FakeImageService_reset)"},{"line_number":39,"context_line":"        self.image_ref_0 \u003d fake_image.FakeImageService().detail(None)[0][\u0027id\u0027]"},{"line_number":40,"context_line":"        self.image_ref_1 \u003d fake_image.FakeImageService().detail(None)[1][\u0027id\u0027]"},{"line_number":41,"context_line":"        self.flavor_ref_1 \u003d 1"},{"line_number":42,"context_line":"        self.flavor_ref_2 \u003d 2"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    # ---------------------------- helpers ----------------------------"},{"line_number":45,"context_line":"    def _create_active_server(self, server_args\u003dNone):"}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_b3040dc8","line":42,"range":{"start_line":39,"start_character":8,"end_line":42,"end_character":29},"updated":"2019-09-17 18:05:02.000000000","message":"Normally we\u0027d hit the actual API for this stuff rather than hard-code it.","commit_id":"4be240c4c7b514869e5fd8acafd76d7b1f7ffaba"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f1463a1718028b71ffe28885204fcc80244d8424","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        # the image fake backend needed for image discovery"},{"line_number":37,"context_line":"        fake_image.stub_out_image_service(self)"},{"line_number":38,"context_line":"        self.addCleanup(fake_image.FakeImageService_reset)"},{"line_number":39,"context_line":"        self.image_ref_0 \u003d fake_image.FakeImageService().detail(None)[0][\u0027id\u0027]"},{"line_number":40,"context_line":"        self.image_ref_1 \u003d fake_image.FakeImageService().detail(None)[1][\u0027id\u0027]"},{"line_number":41,"context_line":"        self.flavor_ref_1 \u003d 1"},{"line_number":42,"context_line":"        self.flavor_ref_2 \u003d 2"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    # ---------------------------- helpers ----------------------------"},{"line_number":45,"context_line":"    def _create_active_server(self, server_args\u003dNone):"}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_b2d07952","line":42,"range":{"start_line":39,"start_character":8,"end_line":42,"end_character":29},"in_reply_to":"3fa7e38b_b3040dc8","updated":"2019-09-18 12:55:30.000000000","message":"if im droping the resize test i can just remove the flavor\n\nthe flavor ref was prevciously hardcoded as it was in the regression test i based this on.\n\nill look into importing it form the fakes.","commit_id":"4be240c4c7b514869e5fd8acafd76d7b1f7ffaba"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7170512e202f2f7f5dc51e9c6f83fd0adebb6eba","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    def _create_active_server(self, server_args\u003dNone):"},{"line_number":46,"context_line":"        basic_server \u003d {"},{"line_number":47,"context_line":"            \u0027flavorRef\u0027: self.flavor_ref_1,"},{"line_number":48,"context_line":"            \u0027name\u0027: \u0027test_fill_vifs_migration\u0027,"},{"line_number":49,"context_line":"            \u0027networks\u0027: [{"},{"line_number":50,"context_line":"                \u0027uuid\u0027: nova_fixtures.NeutronFixture.network_1[\u0027id\u0027]"},{"line_number":51,"context_line":"            }],"}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_935eb1e4","line":48,"range":{"start_line":48,"start_character":21,"end_line":48,"end_character":45},"updated":"2019-09-17 18:05:02.000000000","message":"This doesn\u0027t make sense here.","commit_id":"4be240c4c7b514869e5fd8acafd76d7b1f7ffaba"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f1463a1718028b71ffe28885204fcc80244d8424","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    def _create_active_server(self, server_args\u003dNone):"},{"line_number":46,"context_line":"        basic_server \u003d {"},{"line_number":47,"context_line":"            \u0027flavorRef\u0027: self.flavor_ref_1,"},{"line_number":48,"context_line":"            \u0027name\u0027: \u0027test_fill_vifs_migration\u0027,"},{"line_number":49,"context_line":"            \u0027networks\u0027: [{"},{"line_number":50,"context_line":"                \u0027uuid\u0027: nova_fixtures.NeutronFixture.network_1[\u0027id\u0027]"},{"line_number":51,"context_line":"            }],"}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_12914d9a","line":48,"range":{"start_line":48,"start_character":21,"end_line":48,"end_character":45},"in_reply_to":"3fa7e38b_935eb1e4","updated":"2019-09-18 12:55:30.000000000","message":"ya i copied this block form one of the other regressions\ntest examples. can you guess which one :) ill fix this","commit_id":"4be240c4c7b514869e5fd8acafd76d7b1f7ffaba"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7170512e202f2f7f5dc51e9c6f83fd0adebb6eba","unresolved":false,"context_lines":[{"line_number":87,"context_line":"            self.api, active_server, \u0027ACTIVE\u0027)"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    def _shelve_server(self, active_server):"},{"line_number":90,"context_line":"        self.flags(shelved_offload_time\u003d-1)"},{"line_number":91,"context_line":"        self.api.post_server_action(active_server[\u0027id\u0027], {\u0027shelve\u0027: {}})"},{"line_number":92,"context_line":"        return self._wait_for_state_change("},{"line_number":93,"context_line":"            self.api, active_server, \u0027SHELVED\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_f30125b1","line":90,"updated":"2019-09-17 18:05:02.000000000","message":"You don\u0027t need to set this, it defaults to 0 which means shelve offload immediately.","commit_id":"4be240c4c7b514869e5fd8acafd76d7b1f7ffaba"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f1463a1718028b71ffe28885204fcc80244d8424","unresolved":false,"context_lines":[{"line_number":87,"context_line":"            self.api, active_server, \u0027ACTIVE\u0027)"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    def _shelve_server(self, active_server):"},{"line_number":90,"context_line":"        self.flags(shelved_offload_time\u003d-1)"},{"line_number":91,"context_line":"        self.api.post_server_action(active_server[\u0027id\u0027], {\u0027shelve\u0027: {}})"},{"line_number":92,"context_line":"        return self._wait_for_state_change("},{"line_number":93,"context_line":"            self.api, active_server, \u0027SHELVED\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_f28ef12c","line":90,"in_reply_to":"3fa7e38b_f30125b1","updated":"2019-09-18 12:55:30.000000000","message":"Done","commit_id":"4be240c4c7b514869e5fd8acafd76d7b1f7ffaba"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7170512e202f2f7f5dc51e9c6f83fd0adebb6eba","unresolved":false,"context_lines":[{"line_number":90,"context_line":"        self.flags(shelved_offload_time\u003d-1)"},{"line_number":91,"context_line":"        self.api.post_server_action(active_server[\u0027id\u0027], {\u0027shelve\u0027: {}})"},{"line_number":92,"context_line":"        return self._wait_for_state_change("},{"line_number":93,"context_line":"            self.api, active_server, \u0027SHELVED\u0027)"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    def _unshelve_server(self, shelved_server):"},{"line_number":96,"context_line":"        self.flags(shelved_offload_time\u003d-1)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_d332e9a7","line":93,"range":{"start_line":93,"start_character":38,"end_line":93,"end_character":45},"updated":"2019-09-17 18:05:02.000000000","message":"Hmm, this should be SHELVED_OFFLOADED.","commit_id":"4be240c4c7b514869e5fd8acafd76d7b1f7ffaba"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"4768c89df9a54bc70d937b36ccbc1e56d693cdbd","unresolved":false,"context_lines":[{"line_number":90,"context_line":"        self.flags(shelved_offload_time\u003d-1)"},{"line_number":91,"context_line":"        self.api.post_server_action(active_server[\u0027id\u0027], {\u0027shelve\u0027: {}})"},{"line_number":92,"context_line":"        return self._wait_for_state_change("},{"line_number":93,"context_line":"            self.api, active_server, \u0027SHELVED\u0027)"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    def _unshelve_server(self, shelved_server):"},{"line_number":96,"context_line":"        self.flags(shelved_offload_time\u003d-1)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_321ec9ba","line":93,"range":{"start_line":93,"start_character":38,"end_line":93,"end_character":45},"in_reply_to":"3fa7e38b_12aced8a","updated":"2019-09-18 13:03:41.000000000","message":"\u003e claims dont matter in this case but its a fair point.\n \u003e power on for the libvirt driver does a hard reboot which calls\n \u003e spawn but in generall that would not be the case so better to do\n \u003e this with shelved_offloaded\n\nWe don\u0027t use the libvirt driver in these tests nor does the start_instance compute method call driver.spawn, it calls power_on.","commit_id":"4be240c4c7b514869e5fd8acafd76d7b1f7ffaba"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f1463a1718028b71ffe28885204fcc80244d8424","unresolved":false,"context_lines":[{"line_number":90,"context_line":"        self.flags(shelved_offload_time\u003d-1)"},{"line_number":91,"context_line":"        self.api.post_server_action(active_server[\u0027id\u0027], {\u0027shelve\u0027: {}})"},{"line_number":92,"context_line":"        return self._wait_for_state_change("},{"line_number":93,"context_line":"            self.api, active_server, \u0027SHELVED\u0027)"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    def _unshelve_server(self, shelved_server):"},{"line_number":96,"context_line":"        self.flags(shelved_offload_time\u003d-1)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_9283fd04","line":93,"range":{"start_line":93,"start_character":38,"end_line":93,"end_character":45},"in_reply_to":"3fa7e38b_d332e9a7","updated":"2019-09-18 12:55:30.000000000","message":"Done","commit_id":"4be240c4c7b514869e5fd8acafd76d7b1f7ffaba"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"eacb7a9ed47bdc8a63ebbb37b9d6b2f536db0cc3","unresolved":false,"context_lines":[{"line_number":90,"context_line":"        self.flags(shelved_offload_time\u003d-1)"},{"line_number":91,"context_line":"        self.api.post_server_action(active_server[\u0027id\u0027], {\u0027shelve\u0027: {}})"},{"line_number":92,"context_line":"        return self._wait_for_state_change("},{"line_number":93,"context_line":"            self.api, active_server, \u0027SHELVED\u0027)"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    def _unshelve_server(self, shelved_server):"},{"line_number":96,"context_line":"        self.flags(shelved_offload_time\u003d-1)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_f376053f","line":93,"range":{"start_line":93,"start_character":38,"end_line":93,"end_character":45},"in_reply_to":"3fa7e38b_d332e9a7","updated":"2019-09-17 18:09:26.000000000","message":"Note that when you unshelve a SHELVED (but not offloaded) server conductor doesn\u0027t actually RPC cast to the unshelve_instance method on the compute which does the instance claim and driver.spawn, it just casts to start_instance which doesn\u0027t do the claim or spawn.","commit_id":"4be240c4c7b514869e5fd8acafd76d7b1f7ffaba"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f1463a1718028b71ffe28885204fcc80244d8424","unresolved":false,"context_lines":[{"line_number":90,"context_line":"        self.flags(shelved_offload_time\u003d-1)"},{"line_number":91,"context_line":"        self.api.post_server_action(active_server[\u0027id\u0027], {\u0027shelve\u0027: {}})"},{"line_number":92,"context_line":"        return self._wait_for_state_change("},{"line_number":93,"context_line":"            self.api, active_server, \u0027SHELVED\u0027)"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    def _unshelve_server(self, shelved_server):"},{"line_number":96,"context_line":"        self.flags(shelved_offload_time\u003d-1)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_12aced8a","line":93,"range":{"start_line":93,"start_character":38,"end_line":93,"end_character":45},"in_reply_to":"3fa7e38b_f376053f","updated":"2019-09-18 12:55:30.000000000","message":"claims dont matter in this case but its a fair point.\npower on for the libvirt driver does a hard reboot which calls spawn but in generall that would not be the case so better to do this with shelved_offloaded","commit_id":"4be240c4c7b514869e5fd8acafd76d7b1f7ffaba"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7170512e202f2f7f5dc51e9c6f83fd0adebb6eba","unresolved":false,"context_lines":[{"line_number":93,"context_line":"            self.api, active_server, \u0027SHELVED\u0027)"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    def _unshelve_server(self, shelved_server):"},{"line_number":96,"context_line":"        self.flags(shelved_offload_time\u003d-1)"},{"line_number":97,"context_line":"        self.api.post_server_action(shelved_server[\u0027id\u0027], {\u0027unshelve\u0027: {}})"},{"line_number":98,"context_line":"        return self._wait_for_state_change("},{"line_number":99,"context_line":"            self.api, shelved_server, \u0027ACTIVE\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_13ff21ab","line":96,"updated":"2019-09-17 18:05:02.000000000","message":"same","commit_id":"4be240c4c7b514869e5fd8acafd76d7b1f7ffaba"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f1463a1718028b71ffe28885204fcc80244d8424","unresolved":false,"context_lines":[{"line_number":93,"context_line":"            self.api, active_server, \u0027SHELVED\u0027)"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    def _unshelve_server(self, shelved_server):"},{"line_number":96,"context_line":"        self.flags(shelved_offload_time\u003d-1)"},{"line_number":97,"context_line":"        self.api.post_server_action(shelved_server[\u0027id\u0027], {\u0027unshelve\u0027: {}})"},{"line_number":98,"context_line":"        return self._wait_for_state_change("},{"line_number":99,"context_line":"            self.api, shelved_server, \u0027ACTIVE\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_527d851a","line":96,"in_reply_to":"3fa7e38b_13ff21ab","updated":"2019-09-18 12:55:30.000000000","message":"Done","commit_id":"4be240c4c7b514869e5fd8acafd76d7b1f7ffaba"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7170512e202f2f7f5dc51e9c6f83fd0adebb6eba","unresolved":false,"context_lines":[{"line_number":206,"context_line":"        without_config_drive \u003d self._unshelve_server(without_config_drive)"},{"line_number":207,"context_line":"        self.assertEqual(\u0027\u0027, without_config_drive[\u0027config_drive\u0027])"},{"line_number":208,"context_line":""},{"line_number":209,"context_line":"    def test_create_server_config_drive_resize_conf_change(self):"},{"line_number":210,"context_line":"        \"\"\"Verify that we can create a server with or without a forced"},{"line_number":211,"context_line":"        config drive it does not change across a resize."},{"line_number":212,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_730e95e6","line":209,"updated":"2019-09-17 18:05:02.000000000","message":"I don\u0027t think we really need a resize test for this do we?","commit_id":"4be240c4c7b514869e5fd8acafd76d7b1f7ffaba"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"4768c89df9a54bc70d937b36ccbc1e56d693cdbd","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        # the image fake backend needed for image discovery"},{"line_number":37,"context_line":"        fake_image.stub_out_image_service(self)"},{"line_number":38,"context_line":"        self.addCleanup(fake_image.FakeImageService_reset)"},{"line_number":39,"context_line":"        self.image_ref_0 \u003d fake_image.FakeImageService().detail(None)[0][\u0027id\u0027]"},{"line_number":40,"context_line":"        self.image_ref_1 \u003d fake_image.FakeImageService().detail(None)[1][\u0027id\u0027]"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    # ---------------------------- helpers ----------------------------"},{"line_number":43,"context_line":"    def _create_active_server(self, server_args\u003dNone):"}],"source_content_type":"text/x-python","patch_set":6,"id":"3fa7e38b_12762d08","line":40,"range":{"start_line":39,"start_character":8,"end_line":40,"end_character":78},"updated":"2019-09-18 13:03:41.000000000","message":"I\u0027d still prefer that we used the API to get the values, e.g.:\n\nimages \u003d self.api.get_images()\nself.image_ref_0 \u003d images[0][\u0027id\u0027]\nself.image_ref_1 \u003d images[1][\u0027id\u0027]\n\nThen we don\u0027t have to worry about the internal structure of that fake image service changing and breaking this test.","commit_id":"c08d7208e981b5f448c94dd5d0fc2fc38f0d12c7"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"303e1946e0978e654d39d6bfd1c50d62f516a2a9","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        # the image fake backend needed for image discovery"},{"line_number":37,"context_line":"        fake_image.stub_out_image_service(self)"},{"line_number":38,"context_line":"        self.addCleanup(fake_image.FakeImageService_reset)"},{"line_number":39,"context_line":"        self.image_ref_0 \u003d fake_image.FakeImageService().detail(None)[0][\u0027id\u0027]"},{"line_number":40,"context_line":"        self.image_ref_1 \u003d fake_image.FakeImageService().detail(None)[1][\u0027id\u0027]"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    # ---------------------------- helpers ----------------------------"},{"line_number":43,"context_line":"    def _create_active_server(self, server_args\u003dNone):"}],"source_content_type":"text/x-python","patch_set":6,"id":"3fa7e38b_923a1de5","line":40,"range":{"start_line":39,"start_character":8,"end_line":40,"end_character":78},"in_reply_to":"3fa7e38b_12762d08","updated":"2019-09-18 13:11:34.000000000","message":"Done","commit_id":"c08d7208e981b5f448c94dd5d0fc2fc38f0d12c7"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"4768c89df9a54bc70d937b36ccbc1e56d693cdbd","unresolved":false,"context_lines":[{"line_number":43,"context_line":"    def _create_active_server(self, server_args\u003dNone):"},{"line_number":44,"context_line":"        basic_server \u003d {"},{"line_number":45,"context_line":"            \u0027flavorRef\u0027: 1,"},{"line_number":46,"context_line":"            \u0027name\u0027: \u0027test_fill_vifs_migration\u0027,"},{"line_number":47,"context_line":"            \u0027networks\u0027: [{"},{"line_number":48,"context_line":"                \u0027uuid\u0027: nova_fixtures.NeutronFixture.network_1[\u0027id\u0027]"},{"line_number":49,"context_line":"            }],"}],"source_content_type":"text/x-python","patch_set":6,"id":"3fa7e38b_d2c65517","line":46,"range":{"start_line":46,"start_character":21,"end_line":46,"end_character":45},"updated":"2019-09-18 13:03:41.000000000","message":"You didn\u0027t change this. You could just call it RegressionTest1835822 I guess.","commit_id":"c08d7208e981b5f448c94dd5d0fc2fc38f0d12c7"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"303e1946e0978e654d39d6bfd1c50d62f516a2a9","unresolved":false,"context_lines":[{"line_number":43,"context_line":"    def _create_active_server(self, server_args\u003dNone):"},{"line_number":44,"context_line":"        basic_server \u003d {"},{"line_number":45,"context_line":"            \u0027flavorRef\u0027: 1,"},{"line_number":46,"context_line":"            \u0027name\u0027: \u0027test_fill_vifs_migration\u0027,"},{"line_number":47,"context_line":"            \u0027networks\u0027: [{"},{"line_number":48,"context_line":"                \u0027uuid\u0027: nova_fixtures.NeutronFixture.network_1[\u0027id\u0027]"},{"line_number":49,"context_line":"            }],"}],"source_content_type":"text/x-python","patch_set":6,"id":"3fa7e38b_5224a5c6","line":46,"range":{"start_line":46,"start_character":21,"end_line":46,"end_character":45},"in_reply_to":"3fa7e38b_d2c65517","updated":"2019-09-18 13:11:34.000000000","message":"Done","commit_id":"c08d7208e981b5f448c94dd5d0fc2fc38f0d12c7"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"fc16c4722d9afdc44d50ab4051038e7fe32e4e06","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"3fa7e38b_c31209b2","updated":"2019-09-18 14:47:52.000000000","message":"++ I ran through these tests with the fix reverted.","commit_id":"068b14afbe39b6e46ee316b4c9e9890a721daa6e"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"4a4ce880c90b6b36bfa1d0e963c3c45fe4d68264","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"class RegressionTest1835822("},{"line_number":22,"context_line":"        test.TestCase, integrated_helpers.InstanceHelperMixin):"},{"line_number":23,"context_line":"    # ---------------------------- setup ----------------------------"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    def setUp(self):"},{"line_number":26,"context_line":"        super(RegressionTest1835822, self).setUp()"}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_e8c284e9","line":23,"updated":"2019-09-18 15:03:46.000000000","message":"I\u0027m not a fan of such decoration but meh.","commit_id":"068b14afbe39b6e46ee316b4c9e9890a721daa6e"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"4a4ce880c90b6b36bfa1d0e963c3c45fe4d68264","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        args \u003d {\"reboot\": {\"type\": \"HARD\"}}"},{"line_number":60,"context_line":"        self.api.api_post(\u0027servers/%s/action\u0027 %"},{"line_number":61,"context_line":"                          active_server[\u0027id\u0027], args)"},{"line_number":62,"context_line":"        return self._wait_for_state_change("},{"line_number":63,"context_line":"            self.api, active_server, \u0027ACTIVE\u0027)"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def _rebuild_server(self, active_server):"}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_23c51d3d","line":62,"updated":"2019-09-18 15:03:46.000000000","message":"I think the status of the server will not change during reboot it will be ACTIVE before, during and after the reboot. So this call does not wait unit the reboot is finished.\n\nI think you should wait for the instance.reboot.end notification.","commit_id":"068b14afbe39b6e46ee316b4c9e9890a721daa6e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"dd557acd24651617b3ff15219538bb30c797a1c1","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        args \u003d {\"reboot\": {\"type\": \"HARD\"}}"},{"line_number":60,"context_line":"        self.api.api_post(\u0027servers/%s/action\u0027 %"},{"line_number":61,"context_line":"                          active_server[\u0027id\u0027], args)"},{"line_number":62,"context_line":"        return self._wait_for_state_change("},{"line_number":63,"context_line":"            self.api, active_server, \u0027ACTIVE\u0027)"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def _rebuild_server(self, active_server):"}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_fed79a22","line":62,"in_reply_to":"3fa7e38b_23c51d3d","updated":"2019-09-18 15:19:01.000000000","message":"You could wait for the OS-EXT-STS:task_state to go back to None right?","commit_id":"068b14afbe39b6e46ee316b4c9e9890a721daa6e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"fb1a500470278aec09388f95574e4d37b4a8fce3","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        args \u003d {\"reboot\": {\"type\": \"HARD\"}}"},{"line_number":60,"context_line":"        self.api.api_post(\u0027servers/%s/action\u0027 %"},{"line_number":61,"context_line":"                          active_server[\u0027id\u0027], args)"},{"line_number":62,"context_line":"        return self._wait_for_state_change("},{"line_number":63,"context_line":"            self.api, active_server, \u0027ACTIVE\u0027)"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def _rebuild_server(self, active_server):"}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_7424290e","line":62,"in_reply_to":"3fa7e38b_fe2f9af3","updated":"2019-09-18 16:38:16.000000000","message":"The task_state will be set before the API returns a response to the caller:\n\nhttps://github.com/openstack/nova/blob/c67057dff34a0054977ae3873d33313c0617b308/nova/compute/api.py#L3193","commit_id":"068b14afbe39b6e46ee316b4c9e9890a721daa6e"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"956b5e68b68f1d9e483d7ce84b68415a607ee619","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        args \u003d {\"reboot\": {\"type\": \"HARD\"}}"},{"line_number":60,"context_line":"        self.api.api_post(\u0027servers/%s/action\u0027 %"},{"line_number":61,"context_line":"                          active_server[\u0027id\u0027], args)"},{"line_number":62,"context_line":"        return self._wait_for_state_change("},{"line_number":63,"context_line":"            self.api, active_server, \u0027ACTIVE\u0027)"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def _rebuild_server(self, active_server):"}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_fe2f9af3","line":62,"in_reply_to":"3fa7e38b_fed79a22","updated":"2019-09-18 15:22:10.000000000","message":"If you wait for OS-EXT_STS:task_state \u003d\u003d None then the wait can return before the task_state is set from None to rebooting. Isn\u0027t it?","commit_id":"068b14afbe39b6e46ee316b4c9e9890a721daa6e"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"4a4ce880c90b6b36bfa1d0e963c3c45fe4d68264","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        args \u003d {\"rebuild\": {\"imageRef\": self.image_ref_1}}"},{"line_number":67,"context_line":"        self.api.api_post(\u0027servers/%s/action\u0027 %"},{"line_number":68,"context_line":"                          active_server[\u0027id\u0027], args)"},{"line_number":69,"context_line":"        return self._wait_for_state_change("},{"line_number":70,"context_line":"            self.api, active_server, \u0027ACTIVE\u0027)"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    def _shelve_server(self, active_server):"}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_63f9d57e","line":69,"updated":"2019-09-18 15:03:46.000000000","message":"ditto, but wait for instance.rebuild.end notification","commit_id":"068b14afbe39b6e46ee316b4c9e9890a721daa6e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"dd557acd24651617b3ff15219538bb30c797a1c1","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        args \u003d {\"rebuild\": {\"imageRef\": self.image_ref_1}}"},{"line_number":67,"context_line":"        self.api.api_post(\u0027servers/%s/action\u0027 %"},{"line_number":68,"context_line":"                          active_server[\u0027id\u0027], args)"},{"line_number":69,"context_line":"        return self._wait_for_state_change("},{"line_number":70,"context_line":"            self.api, active_server, \u0027ACTIVE\u0027)"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    def _shelve_server(self, active_server):"}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_be88421f","line":69,"in_reply_to":"3fa7e38b_63f9d57e","updated":"2019-09-18 15:19:01.000000000","message":"Same - can\u0027t you wait for OS-EXT-STS:task_state? Also, for the intent of this test I\u0027m not sure it matters because we do the config drive thing here:\n\nhttps://github.com/openstack/nova/blob/0984ebb9f1c3cc3c8ff352dd2a615a58da79833c/nova/compute/manager.py#L5511\n\nand then save that here:\n\nhttps://github.com/openstack/nova/blob/0984ebb9f1c3cc3c8ff352dd2a615a58da79833c/nova/compute/manager.py#L5515","commit_id":"068b14afbe39b6e46ee316b4c9e9890a721daa6e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"bce9c7ed9360a524a6ea056ad83e56634e07154f","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        args \u003d {\"rebuild\": {\"imageRef\": self.image_ref_1}}"},{"line_number":67,"context_line":"        self.api.api_post(\u0027servers/%s/action\u0027 %"},{"line_number":68,"context_line":"                          active_server[\u0027id\u0027], args)"},{"line_number":69,"context_line":"        return self._wait_for_state_change("},{"line_number":70,"context_line":"            self.api, active_server, \u0027ACTIVE\u0027)"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    def _shelve_server(self, active_server):"}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_febc7abc","line":69,"in_reply_to":"3fa7e38b_be88421f","updated":"2019-09-18 15:19:53.000000000","message":"Oh sorry I was reading this as the unshelve one.","commit_id":"068b14afbe39b6e46ee316b4c9e9890a721daa6e"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"bc91b6f4a62a7005dc0088bf21e7d345b8889db8","unresolved":false,"context_lines":[{"line_number":19,"context_line":"from nova.tests.unit import policy_fixture"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"class RegressionTest1835822("},{"line_number":23,"context_line":"        test.TestCase, integrated_helpers.InstanceHelperMixin):"},{"line_number":24,"context_line":"    # ---------------------------- setup ----------------------------"},{"line_number":25,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"3fa7e38b_3a89b074","line":22,"updated":"2019-09-19 07:46:33.000000000","message":"FWIW this whole test class is so fscking useful for checking configdrives that honestly having it defined in the functional tests outside of the regression tests (as a specific configdrive test module) wouldn\u0027t have harmed.","commit_id":"641feb62a33e211a3ed1f9a2309ee16d827f5fe2"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"325af8c160fa13f9c3c3de4ac11be4da83226131","unresolved":false,"context_lines":[{"line_number":19,"context_line":"from nova.tests.unit import policy_fixture"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"class RegressionTest1835822("},{"line_number":23,"context_line":"        test.TestCase, integrated_helpers.InstanceHelperMixin):"},{"line_number":24,"context_line":"    # ---------------------------- setup ----------------------------"},{"line_number":25,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"3fa7e38b_6b8f5ccc","line":22,"in_reply_to":"3fa7e38b_3a89b074","updated":"2019-09-19 11:31:03.000000000","message":"ya as i mention on irc i would need to add a couple of addtional tests to full cover the behavior but i can look at doing that  after we are done with the release candiates","commit_id":"641feb62a33e211a3ed1f9a2309ee16d827f5fe2"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"bc91b6f4a62a7005dc0088bf21e7d345b8889db8","unresolved":false,"context_lines":[{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    def _unshelve_server(self, shelved_server):"},{"line_number":82,"context_line":"        self.api.post_server_action(shelved_server[\u0027id\u0027], {\u0027unshelve\u0027: {}})"},{"line_number":83,"context_line":"        return self._wait_for_state_change(self.api, shelved_server, \u0027ACTIVE\u0027)"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    # ---------------------------- tests ----------------------------"},{"line_number":86,"context_line":"    def test_create_server_with_config_drive(self):"}],"source_content_type":"text/x-python","patch_set":9,"id":"3fa7e38b_7a6088cf","line":83,"updated":"2019-09-19 07:46:33.000000000","message":"nit: those helper methods could potentially be moved elsewhere so we could reuse them.","commit_id":"641feb62a33e211a3ed1f9a2309ee16d827f5fe2"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"325af8c160fa13f9c3c3de4ac11be4da83226131","unresolved":false,"context_lines":[{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    def _unshelve_server(self, shelved_server):"},{"line_number":82,"context_line":"        self.api.post_server_action(shelved_server[\u0027id\u0027], {\u0027unshelve\u0027: {}})"},{"line_number":83,"context_line":"        return self._wait_for_state_change(self.api, shelved_server, \u0027ACTIVE\u0027)"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    # ---------------------------- tests ----------------------------"},{"line_number":86,"context_line":"    def test_create_server_with_config_drive(self):"}],"source_content_type":"text/x-python","patch_set":9,"id":"3fa7e38b_8bb17892","line":83,"in_reply_to":"3fa7e38b_7a6088cf","updated":"2019-09-19 11:31:03.000000000","message":"i could move them into the integrated helpers i guess.\n\ni might need to modify the signiture of the function to accept an api  as an arg like _wait_for_state_chage does","commit_id":"641feb62a33e211a3ed1f9a2309ee16d827f5fe2"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"bc91b6f4a62a7005dc0088bf21e7d345b8889db8","unresolved":false,"context_lines":[{"line_number":96,"context_line":"        \"\"\""},{"line_number":97,"context_line":"        self.flags(force_config_drive\u003dFalse)"},{"line_number":98,"context_line":"        active_server \u003d self._create_active_server()"},{"line_number":99,"context_line":"        self.assertEqual(\u0027\u0027, active_server[\u0027config_drive\u0027])"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    def test_create_server_with_forced_config_drive(self):"},{"line_number":102,"context_line":"        \"\"\"Verify that we can create a server with a forced"}],"source_content_type":"text/x-python","patch_set":9,"id":"3fa7e38b_faa9d8de","line":99,"range":{"start_line":99,"start_character":25,"end_line":99,"end_character":27},"updated":"2019-09-19 07:46:33.000000000","message":"ouch but okay.","commit_id":"641feb62a33e211a3ed1f9a2309ee16d827f5fe2"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"325af8c160fa13f9c3c3de4ac11be4da83226131","unresolved":false,"context_lines":[{"line_number":96,"context_line":"        \"\"\""},{"line_number":97,"context_line":"        self.flags(force_config_drive\u003dFalse)"},{"line_number":98,"context_line":"        active_server \u003d self._create_active_server()"},{"line_number":99,"context_line":"        self.assertEqual(\u0027\u0027, active_server[\u0027config_drive\u0027])"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    def test_create_server_with_forced_config_drive(self):"},{"line_number":102,"context_line":"        \"\"\"Verify that we can create a server with a forced"}],"source_content_type":"text/x-python","patch_set":9,"id":"3fa7e38b_0b4ca89c","line":99,"range":{"start_line":99,"start_character":25,"end_line":99,"end_character":27},"in_reply_to":"3fa7e38b_faa9d8de","updated":"2019-09-19 11:31:03.000000000","message":"ya i original had this be assertFalse but matt pointed\nout that because we used to accpet volume uuid for a legacy rackspace use case this really returns \u0027\u0027 so im testing for the correct value.","commit_id":"641feb62a33e211a3ed1f9a2309ee16d827f5fe2"}],"nova/tests/functional/test_servers.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b7e4b187f2664a3f35cbf5bd5079475068bc340e","unresolved":false,"context_lines":[{"line_number":161,"context_line":"            compute.manager.update_available_resource(ctx)"},{"line_number":162,"context_line":"        LOG.info(\u0027Finished with periodics\u0027)"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"    def test_create_server_with_config_drive(self):"},{"line_number":165,"context_line":"        \"\"\"Verify that we can create a server with a config drive."},{"line_number":166,"context_line":"        \"\"\""},{"line_number":167,"context_line":"        active_server \u003d self._create_active_server("}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_5f8afe69","line":164,"updated":"2019-07-31 15:33:50.000000000","message":"nit: Arguably we could create a nova/tests/functional/regressions/test_bug_1835822.py module for this and just keep these tests there rather than throw them into this existing test class which means they are going to be duplicated for other microversions (in ServersTest and ServersTestV21).","commit_id":"b8cb8ff8ec59a1477b16be94c5e366c9fcaa503e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b7e4b187f2664a3f35cbf5bd5079475068bc340e","unresolved":false,"context_lines":[{"line_number":186,"context_line":""},{"line_number":187,"context_line":"    def test_create_server_with_forced_config_drive_reboot(self):"},{"line_number":188,"context_line":"        \"\"\"Verify that we can create a server with a forced"},{"line_number":189,"context_line":"        config drive and it survies reboot."},{"line_number":190,"context_line":"        \"\"\""},{"line_number":191,"context_line":"        self.flags(force_config_drive\u003dTrue)"},{"line_number":192,"context_line":"        active_server \u003d self._create_active_server()"}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_1fcec6b3","line":189,"range":{"start_line":189,"start_character":28,"end_line":189,"end_character":35},"updated":"2019-07-31 15:33:50.000000000","message":"survives","commit_id":"b8cb8ff8ec59a1477b16be94c5e366c9fcaa503e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b7e4b187f2664a3f35cbf5bd5079475068bc340e","unresolved":false,"context_lines":[{"line_number":206,"context_line":"        self.assertTrue(with_config_drive[\u0027config_drive\u0027])"},{"line_number":207,"context_line":"        self.flags(force_config_drive\u003dFalse)"},{"line_number":208,"context_line":"        without_config_drive \u003d self._create_active_server()"},{"line_number":209,"context_line":"        self.assertFalse(without_config_drive[\u0027config_drive\u0027])"},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"        # this server was created with force_config_drive\u003dtrue"},{"line_number":212,"context_line":"        # so assert now that force_config_drive is false it does"}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_5f343e93","line":209,"range":{"start_line":209,"start_character":13,"end_line":209,"end_character":24},"updated":"2019-07-31 15:33:50.000000000","message":"Technically this is self.assertEqual(\u0027\u0027, right?","commit_id":"b8cb8ff8ec59a1477b16be94c5e366c9fcaa503e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"dd504ff1a3e9c5550c4dc34e8d47f76dd615447d","unresolved":false,"context_lines":[{"line_number":206,"context_line":"        self.assertTrue(with_config_drive[\u0027config_drive\u0027])"},{"line_number":207,"context_line":"        self.flags(force_config_drive\u003dFalse)"},{"line_number":208,"context_line":"        without_config_drive \u003d self._create_active_server()"},{"line_number":209,"context_line":"        self.assertFalse(without_config_drive[\u0027config_drive\u0027])"},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"        # this server was created with force_config_drive\u003dtrue"},{"line_number":212,"context_line":"        # so assert now that force_config_drive is false it does"}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_40a1b6f6","line":209,"range":{"start_line":209,"start_character":13,"end_line":209,"end_character":24},"in_reply_to":"7faddb67_5d7f6365","updated":"2019-07-31 19:50:12.000000000","message":"Note that you have this on L177:\n\nself.assertEqual(\u0027\u0027, active_server[\u0027config_drive\u0027])\n\nAnd the API logic for this value is set during create:\n\nhttps://github.com/openstack/nova/blob/ff8de46a29fe4e75cf4e05fd645599edc4ff93c9/nova/compute/api.py#L512\n\nBefore we get to the compute. And it\u0027s only changed to True if configdrive.update_instance passes required_by and sets it to True. The API reference description is also:\n\n\"Indicates whether or not a config drive was used for this server. The value is True or an empty string. An empty string stands for False.\"\n\nIt\u0027s weird, I know. I\u0027m not totally sure why config_drive was stored as a string, but from really old novaclient code I\u0027ve seen, it looks like long ago there was a plan, and maybe rackspace implemented this out of tree, to provide a volume for the config drive value. That\u0027s why we have:\n\nhttps://storyboard.openstack.org/#!/story/2005468\n\nhttps://bugs.launchpad.net/python-novaclient/+bug/1825061","commit_id":"b8cb8ff8ec59a1477b16be94c5e366c9fcaa503e"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"16b380fc87465b643950af5f34a486c5b58f5e40","unresolved":false,"context_lines":[{"line_number":206,"context_line":"        self.assertTrue(with_config_drive[\u0027config_drive\u0027])"},{"line_number":207,"context_line":"        self.flags(force_config_drive\u003dFalse)"},{"line_number":208,"context_line":"        without_config_drive \u003d self._create_active_server()"},{"line_number":209,"context_line":"        self.assertFalse(without_config_drive[\u0027config_drive\u0027])"},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"        # this server was created with force_config_drive\u003dtrue"},{"line_number":212,"context_line":"        # so assert now that force_config_drive is false it does"}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_5d7f6365","line":209,"range":{"start_line":209,"start_character":13,"end_line":209,"end_character":24},"in_reply_to":"7faddb67_5f343e93","updated":"2019-07-31 18:52:57.000000000","message":"am i would have to check\n\nmaybe.\ni am explicitly setting the config to False rather then leaving it at the default value so i would expect this to be False rather then \u0027\u0027\nbut i cant recall.\n\nill run it in a debugger and i can update to assertEqual(\u0027\u0027,...)\nif that is what it actully is but they are logically the same","commit_id":"b8cb8ff8ec59a1477b16be94c5e366c9fcaa503e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b7e4b187f2664a3f35cbf5bd5079475068bc340e","unresolved":false,"context_lines":[{"line_number":218,"context_line":"        # assert that it\u0027s config drive setting is not overridden"},{"line_number":219,"context_line":"        self.flags(force_config_drive\u003dTrue)"},{"line_number":220,"context_line":"        without_config_drive \u003d self._reboot_server(without_config_drive)"},{"line_number":221,"context_line":"        self.assertFalse(without_config_drive[\u0027config_drive\u0027])"},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"    def _reboot_server(self, active_server):"},{"line_number":224,"context_line":"        args \u003d {\"reboot\": {\"type\": \"HARD\"}}"}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_7f181a1d","line":221,"range":{"start_line":221,"start_character":13,"end_line":221,"end_character":24},"updated":"2019-07-31 15:33:50.000000000","message":"same","commit_id":"b8cb8ff8ec59a1477b16be94c5e366c9fcaa503e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b7e4b187f2664a3f35cbf5bd5079475068bc340e","unresolved":false,"context_lines":[{"line_number":225,"context_line":"        self.api.api_post(\u0027servers/%s/action\u0027 %"},{"line_number":226,"context_line":"                          active_server[\u0027id\u0027], args)"},{"line_number":227,"context_line":"        active_server \u003d self._wait_for_state_change(active_server,"},{"line_number":228,"context_line":"                                                    \u0027Hard Reboot\u0027)"},{"line_number":229,"context_line":"        self.assertEqual(\u0027ACTIVE\u0027, active_server[\u0027status\u0027])"},{"line_number":230,"context_line":"        return active_server"},{"line_number":231,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_3f0622d0","line":228,"range":{"start_line":228,"start_character":52,"end_line":228,"end_character":65},"updated":"2019-07-31 15:33:50.000000000","message":"This has to be wrong...right? Shouldn\u0027t it be HARD_REBOOT? This is why I hate this version of _wait_for_state_change because it\u0027s waiting for any transition from whatever you provide. This likely only works because these tests are using the CastAsCall fixture so by the time you get the API response for the reboot the instance is already in ACTIVE status. Another reason to not put these tests in this busted old test class which CastAsCall and this terrible _wait_for_state_change logic and instead put them in a regression test module where you can use something more sane like integrated_helpers.InstanceHelperMixin.","commit_id":"b8cb8ff8ec59a1477b16be94c5e366c9fcaa503e"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"90e9b0622a581730ee6db16a9b51e419c1aaccd5","unresolved":false,"context_lines":[{"line_number":225,"context_line":"        self.api.api_post(\u0027servers/%s/action\u0027 %"},{"line_number":226,"context_line":"                          active_server[\u0027id\u0027], args)"},{"line_number":227,"context_line":"        active_server \u003d self._wait_for_state_change(active_server,"},{"line_number":228,"context_line":"                                                    \u0027Hard Reboot\u0027)"},{"line_number":229,"context_line":"        self.assertEqual(\u0027ACTIVE\u0027, active_server[\u0027status\u0027])"},{"line_number":230,"context_line":"        return active_server"},{"line_number":231,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_7a301a57","line":228,"range":{"start_line":228,"start_character":52,"end_line":228,"end_character":65},"in_reply_to":"7faddb67_20acbaeb","updated":"2019-08-01 09:58:13.000000000","message":"ya i was looking for the doc i copied it from but it proably that doc and i type it instaead fo copy pasting and missed the _","commit_id":"b8cb8ff8ec59a1477b16be94c5e366c9fcaa503e"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"16b380fc87465b643950af5f34a486c5b58f5e40","unresolved":false,"context_lines":[{"line_number":225,"context_line":"        self.api.api_post(\u0027servers/%s/action\u0027 %"},{"line_number":226,"context_line":"                          active_server[\u0027id\u0027], args)"},{"line_number":227,"context_line":"        active_server \u003d self._wait_for_state_change(active_server,"},{"line_number":228,"context_line":"                                                    \u0027Hard Reboot\u0027)"},{"line_number":229,"context_line":"        self.assertEqual(\u0027ACTIVE\u0027, active_server[\u0027status\u0027])"},{"line_number":230,"context_line":"        return active_server"},{"line_number":231,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_dd43533e","line":228,"range":{"start_line":228,"start_character":52,"end_line":228,"end_character":65},"in_reply_to":"7faddb67_3f0622d0","updated":"2019-07-31 18:52:57.000000000","message":"am i think i should be useing either\nhttps://github.com/openstack/nova/blob/edee8e6f8d8ff77ce7177c147929576c0b4fdf78/nova/objects/fields.py#L894\n\nor maybe \nhttps://github.com/openstack/nova/blob/edee8e6f8d8ff77ce7177c147929576c0b4fdf78/nova/compute/task_states.py#L62\nor\nhttps://github.com/openstack/nova/blob/ffa85a9263ae2ea7a41d60712320149d052d108b/nova/api/openstack/common.py#L50\n\nwhich imply you are correct it should be \u0027HARD_REBOOT\u0027\n\n\nbut sure ill refactor this.","commit_id":"b8cb8ff8ec59a1477b16be94c5e366c9fcaa503e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"dd504ff1a3e9c5550c4dc34e8d47f76dd615447d","unresolved":false,"context_lines":[{"line_number":225,"context_line":"        self.api.api_post(\u0027servers/%s/action\u0027 %"},{"line_number":226,"context_line":"                          active_server[\u0027id\u0027], args)"},{"line_number":227,"context_line":"        active_server \u003d self._wait_for_state_change(active_server,"},{"line_number":228,"context_line":"                                                    \u0027Hard Reboot\u0027)"},{"line_number":229,"context_line":"        self.assertEqual(\u0027ACTIVE\u0027, active_server[\u0027status\u0027])"},{"line_number":230,"context_line":"        return active_server"},{"line_number":231,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_20acbaeb","line":228,"range":{"start_line":228,"start_character":52,"end_line":228,"end_character":65},"in_reply_to":"7faddb67_dd43533e","updated":"2019-07-31 19:50:12.000000000","message":"It\u0027s the last one, otherwise our API guide is busted (it\u0027s not):\n\nhttps://docs.openstack.org/api-guide/compute/server_concepts.html#server-status","commit_id":"b8cb8ff8ec59a1477b16be94c5e366c9fcaa503e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b7e4b187f2664a3f35cbf5bd5079475068bc340e","unresolved":false,"context_lines":[{"line_number":235,"context_line":"            basic_server.update(server_args)"},{"line_number":236,"context_line":"        post \u003d {\u0027server\u0027: basic_server}"},{"line_number":237,"context_line":"        created_server \u003d self.api.post_server(post)"},{"line_number":238,"context_line":"        self.assertTrue(created_server[\u0027id\u0027])"},{"line_number":239,"context_line":"        # wait for the server to become active"},{"line_number":240,"context_line":"        active_server \u003d self._wait_for_state_change(created_server, \u0027BUILD\u0027)"},{"line_number":241,"context_line":"        self.assertEqual(\u0027ACTIVE\u0027, active_server[\u0027status\u0027])"}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_7fb57a31","line":238,"updated":"2019-07-31 15:33:50.000000000","message":"You can remove this - you probably copied it from somewhere but it\u0027s silly.","commit_id":"b8cb8ff8ec59a1477b16be94c5e366c9fcaa503e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b7e4b187f2664a3f35cbf5bd5079475068bc340e","unresolved":false,"context_lines":[{"line_number":240,"context_line":"        active_server \u003d self._wait_for_state_change(created_server, \u0027BUILD\u0027)"},{"line_number":241,"context_line":"        self.assertEqual(\u0027ACTIVE\u0027, active_server[\u0027status\u0027])"},{"line_number":242,"context_line":"        return active_server"},{"line_number":243,"context_line":""},{"line_number":244,"context_line":"    def test_create_server_with_error(self):"},{"line_number":245,"context_line":"        # Create a server which will enter error state."},{"line_number":246,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_5f951e32","line":243,"updated":"2019-07-31 15:33:50.000000000","message":"Since unshelve and rebuild call _update_instance_after_spawn, how do you feel about simple shelve/unshelve and rebuild tests, particularly where the force_config_drive value changes between initial create and then the subsequent re-spawn operation?","commit_id":"b8cb8ff8ec59a1477b16be94c5e366c9fcaa503e"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"16b380fc87465b643950af5f34a486c5b58f5e40","unresolved":false,"context_lines":[{"line_number":240,"context_line":"        active_server \u003d self._wait_for_state_change(created_server, \u0027BUILD\u0027)"},{"line_number":241,"context_line":"        self.assertEqual(\u0027ACTIVE\u0027, active_server[\u0027status\u0027])"},{"line_number":242,"context_line":"        return active_server"},{"line_number":243,"context_line":""},{"line_number":244,"context_line":"    def test_create_server_with_error(self):"},{"line_number":245,"context_line":"        # Create a server which will enter error state."},{"line_number":246,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_3def071e","line":243,"in_reply_to":"7faddb67_5f951e32","updated":"2019-07-31 18:52:57.000000000","message":"i didnt test those locally so ya i can add them.","commit_id":"b8cb8ff8ec59a1477b16be94c5e366c9fcaa503e"}]}
