)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":4715,"name":"Angus Salkeld","email":"asalkeld@redhat.com","username":"asalkeld"},"change_message_id":"33d0f3c0b4963cb39ef38a8e1e5962724393e98a","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Add PortCheck resource"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"See https://blueprints.launchpad.net/heat/+spec/port-check-condition-resource"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Change-Id: I34900635bbb7de8f914bbce4266ecfafbc9f961e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"AAAATn%2F9JwM%3D","line":10,"updated":"2013-12-16 09:22:11.000000000","message":"Implements: blueprint port-check-condition-resource","commit_id":"c2c8d42f4fa9af5dcbfa22e69f6fff9a7bfd8721"},{"author":{"_account_id":6488,"name":"Clint Byrum","email":"clint@fewbar.com","username":"clint-fewbar"},"change_message_id":"868f0a5daf759865d35ae89ef907a4e3a08a4332","unresolved":false,"context_lines":[{"line_number":13,"context_line":""},{"line_number":14,"context_line":"It is only a suitable replacement for a WaitCondition in use cases"},{"line_number":15,"context_line":"where the service being waited on is globally reachable (or at least"},{"line_number":16,"context_line":"reachable from the node running the Heat engine)."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Change-Id: I34900635bbb7de8f914bbce4266ecfafbc9f961e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"AAAATn%2F86P8%3D","line":16,"updated":"2013-12-18 22:11:47.000000000","message":"Before we get too far down this road, I think it would be worthwhile to poll openstack-dev to find out if anybody is working on monitoring as a service. I know, for instance, HP Public cloud (full disclosure: I work for HP) has something.","commit_id":"ffbd985c3807464167fff85c13c4755c476a64ca"},{"author":{"_account_id":6488,"name":"Clint Byrum","email":"clint@fewbar.com","username":"clint-fewbar"},"change_message_id":"78c56376aaae55a56096ca8d1d7cc422671525ea","unresolved":false,"context_lines":[{"line_number":13,"context_line":""},{"line_number":14,"context_line":"It is only a suitable replacement for a WaitCondition in use cases"},{"line_number":15,"context_line":"where the service being waited on is globally reachable (or at least"},{"line_number":16,"context_line":"reachable from the node running the Heat engine)."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Change-Id: I34900635bbb7de8f914bbce4266ecfafbc9f961e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":13,"id":"AAAATn%2F81ZI%3D","line":16,"updated":"2013-12-19 18:50:54.000000000","message":"I think this is a significant enough feature to call out in the release notes. Hence, we should put it on the release team\u0027s radar by adding a Heat blueprint and referencing it here.","commit_id":"7e1e896624dd4e4995f95f695af4f934ef58b61e"}],"heat/engine/resources/port_check.py":[{"author":{"_account_id":7135,"name":"Liang Chen","email":"liangchen.linux@gmail.com","username":"Liang"},"change_message_id":"5f07b757d27543d755417cdfeae6b142e2933b11","unresolved":false,"context_lines":[{"line_number":108,"context_line":""},{"line_number":109,"context_line":"            pool \u003d eventlet.greenpool.GreenPool()"},{"line_number":110,"context_line":"            results \u003d pool.imap(self._check_port, ports)"},{"line_number":111,"context_line":"            ports \u003d [port for (ready, port) in results if not ready]"},{"line_number":112,"context_line":"            if len(ports) \u003d\u003d 0:"},{"line_number":113,"context_line":"                logger.info(_(\"%s Succeeded\") % str(self))"},{"line_number":114,"context_line":"                return"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F894Q%3D","line":111,"updated":"2013-12-18 10:11:10.000000000","message":"This doesn\u0027t need to depend on a GreenPool() instance - itertools.imap() will be enough.\n\nAlternatively this can be easily done as below,\n\nports \u003d [port for port in itertools.ifilter(lambda p: not self._check_port(p), ports)]\n\nwith a little change to _check_port to only return the bool value.","commit_id":"ffbd985c3807464167fff85c13c4755c476a64ca"},{"author":{"_account_id":6488,"name":"Clint Byrum","email":"clint@fewbar.com","username":"clint-fewbar"},"change_message_id":"868f0a5daf759865d35ae89ef907a4e3a08a4332","unresolved":false,"context_lines":[{"line_number":108,"context_line":""},{"line_number":109,"context_line":"            pool \u003d eventlet.greenpool.GreenPool()"},{"line_number":110,"context_line":"            results \u003d pool.imap(self._check_port, ports)"},{"line_number":111,"context_line":"            ports \u003d [port for (ready, port) in results if not ready]"},{"line_number":112,"context_line":"            if len(ports) \u003d\u003d 0:"},{"line_number":113,"context_line":"                logger.info(_(\"%s Succeeded\") % str(self))"},{"line_number":114,"context_line":"                return"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F86Rs%3D","line":111,"in_reply_to":"AAAATn%2F878o%3D","updated":"2013-12-18 22:11:47.000000000","message":"I think this is premature optimization. Unless you have a use case where things will be served by sub-second improvements in port checks, just do them one at a time until they have all succeeded.","commit_id":"ffbd985c3807464167fff85c13c4755c476a64ca"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"cccdb5548fe04c7db87dacbf13eba2b48c92ccae","unresolved":false,"context_lines":[{"line_number":108,"context_line":""},{"line_number":109,"context_line":"            pool \u003d eventlet.greenpool.GreenPool()"},{"line_number":110,"context_line":"            results \u003d pool.imap(self._check_port, ports)"},{"line_number":111,"context_line":"            ports \u003d [port for (ready, port) in results if not ready]"},{"line_number":112,"context_line":"            if len(ports) \u003d\u003d 0:"},{"line_number":113,"context_line":"                logger.info(_(\"%s Succeeded\") % str(self))"},{"line_number":114,"context_line":"                return"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F86RU%3D","line":111,"in_reply_to":"AAAATn%2F878o%3D","updated":"2013-12-18 22:13:58.000000000","message":"We don\u0027t currently use greenthreads for any resources, and we don\u0027t really want to start. This workflow has already been implemented as PollingTaskGroup:\n\n  wait \u003d scheduler.PollingTaskGroup.from_task_with_args(self._check_port, ports)\n\nYou just need to move the while loop and yield into _check_port().\n\nThis may be sufficient in itself, since we don\u0027t check all of the ports between each yield. If this is still too slow (what is the connect timeout?), then you may need to use the asyncore module to make the connect asynchronous (just yield while you\u0027re waiting).","commit_id":"ffbd985c3807464167fff85c13c4755c476a64ca"},{"author":{"_account_id":7540,"name":"Stephen Sugden","email":"me@stephensugden.com","username":"grncdr"},"change_message_id":"400169a1e1cfe06276457ddace6f7ff865e64a80","unresolved":false,"context_lines":[{"line_number":108,"context_line":""},{"line_number":109,"context_line":"            pool \u003d eventlet.greenpool.GreenPool()"},{"line_number":110,"context_line":"            results \u003d pool.imap(self._check_port, ports)"},{"line_number":111,"context_line":"            ports \u003d [port for (ready, port) in results if not ready]"},{"line_number":112,"context_line":"            if len(ports) \u003d\u003d 0:"},{"line_number":113,"context_line":"                logger.info(_(\"%s Succeeded\") % str(self))"},{"line_number":114,"context_line":"                return"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F878o%3D","line":111,"in_reply_to":"AAAATn%2F894Q%3D","updated":"2013-12-18 15:56:17.000000000","message":"I\u0027m not super familiar with eventlet, would using itertools imap still check multiple ports concurrently? The reasoning for using concurrent checks is that connecting to a port can take a long time to time out, performing the checks serially would increase the probability of the PortCheck resource timing out when the port became available while waiting for another `connect(...)` call to time out.","commit_id":"ffbd985c3807464167fff85c13c4755c476a64ca"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"d8cfedb1fee7d743f2439f05e314561e13eb9d78","unresolved":false,"context_lines":[{"line_number":50,"context_line":"    WaitCondition should be used."},{"line_number":51,"context_line":"    \u0027\u0027\u0027"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    (TIMEOUT, HOST, PORTS) \u003d (\u0027timeout\u0027, \u0027host\u0027, \u0027ports\u0027)"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    properties_schema \u003d {"},{"line_number":56,"context_line":"        HOST: properties.Schema("}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAATn%2F858o%3D","line":53,"updated":"2013-12-18 23:32:43.000000000","message":"Please set PROPERTIES \u003d (TIMEOUT, ...\n\n(we may make use of this in future)","commit_id":"7566e8d3390804989a670947972f5898c0f8e19f"},{"author":{"_account_id":7230,"name":"Vijendar Komalla","email":"vijendar.komalla@rackspace.com","username":"vijendar"},"change_message_id":"5020077aff884b4f2ef36039583f649edc342ce6","unresolved":false,"context_lines":[{"line_number":26,"context_line":"logger \u003d log.getLogger(__name__)"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class PortCheckTimeout(Exception):"},{"line_number":30,"context_line":"    def __init__(self, host, port):"},{"line_number":31,"context_line":"        message \u003d (_(\"Port %(port)s on %(host)s is not connectable.\") % {"},{"line_number":32,"context_line":"                   \u0027port\u0027: port, \u0027host\u0027: host})"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAATn%2F82Gw%3D","line":29,"updated":"2013-12-19 16:23:38.000000000","message":"probably this exception definition needs to be moved into heat/common/exception.py.\nand also may be it can be named something like  \u0027ResourceTimeout\u0027, so that exception could be reused?","commit_id":"7e1e896624dd4e4995f95f695af4f934ef58b61e"},{"author":{"_account_id":6488,"name":"Clint Byrum","email":"clint@fewbar.com","username":"clint-fewbar"},"change_message_id":"78c56376aaae55a56096ca8d1d7cc422671525ea","unresolved":false,"context_lines":[{"line_number":26,"context_line":"logger \u003d log.getLogger(__name__)"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class PortCheckTimeout(Exception):"},{"line_number":30,"context_line":"    def __init__(self, host, port):"},{"line_number":31,"context_line":"        message \u003d (_(\"Port %(port)s on %(host)s is not connectable.\") % {"},{"line_number":32,"context_line":"                   \u0027port\u0027: port, \u0027host\u0027: host})"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAATn%2F81bY%3D","line":29,"in_reply_to":"AAAATn%2F81kk%3D","updated":"2013-12-19 18:50:54.000000000","message":"I think you\u0027re right Stephen, and thanks for resetting my overly conservative point. :)","commit_id":"7e1e896624dd4e4995f95f695af4f934ef58b61e"},{"author":{"_account_id":7540,"name":"Stephen Sugden","email":"me@stephensugden.com","username":"grncdr"},"change_message_id":"d4f976b975b28794341d164ab46c59e29576e8fe","unresolved":false,"context_lines":[{"line_number":26,"context_line":"logger \u003d log.getLogger(__name__)"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class PortCheckTimeout(Exception):"},{"line_number":30,"context_line":"    def __init__(self, host, port):"},{"line_number":31,"context_line":"        message \u003d (_(\"Port %(port)s on %(host)s is not connectable.\") % {"},{"line_number":32,"context_line":"                   \u0027port\u0027: port, \u0027host\u0027: host})"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAATn%2F81kk%3D","line":29,"in_reply_to":"AAAATn%2F82DY%3D","updated":"2013-12-19 18:25:09.000000000","message":"Hm, I was modelling this (almost exactly) after WaitCondition. See\n\n https://github.com/openstack/heat/blob/master/heat/engine/resources/wait_condition.py#L122-131\n\n https://github.com/openstack/heat/blob/master/heat/engine/resources/wait_condition.py#L203-207\n\n\u003e In this case it looks like it is not caught anywhere, and thus that would be a bug.\n\nIt\u0027s caught here:\n\n https://github.com/openstack/heat/blob/master/heat/engine/resource.py#L416\n\nand wrapped in a heat.common.exception.ResourceFailure. ResourceFailure expects an exception as it\u0027s first arg so AFAICT we have to raise some sort of Exception to report the error to the user.\n\n\u003e also may be it can be named something like \u0027ResourceTimeout\u0027, so that exception could be reused?\n\nIf we want to avoid having resource-specific exceptions, \nI\u0027d be just as happy to let the scheduler.Timeout exception bubble up the call stack. On the other hand, if we want error messages that include more useful information about the reason a particular resource failed, then the decision becomes whether wrapping the message formatting code in an exception constructor is better than just doing it inline and raising a generic exception. I\u0027m fine with either way though.\n\n(note, to avoid time-warp effects, replace \"master\" in the links above with \"005b64ae30838\")","commit_id":"7e1e896624dd4e4995f95f695af4f934ef58b61e"},{"author":{"_account_id":6488,"name":"Clint Byrum","email":"clint@fewbar.com","username":"clint-fewbar"},"change_message_id":"646bf44e7f453094673dc14fa888fae1ac2aadea","unresolved":false,"context_lines":[{"line_number":26,"context_line":"logger \u003d log.getLogger(__name__)"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class PortCheckTimeout(Exception):"},{"line_number":30,"context_line":"    def __init__(self, host, port):"},{"line_number":31,"context_line":"        message \u003d (_(\"Port %(port)s on %(host)s is not connectable.\") % {"},{"line_number":32,"context_line":"                   \u0027port\u0027: port, \u0027host\u0027: host})"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAATn%2F82DY%3D","line":29,"in_reply_to":"AAAATn%2F82Gw%3D","updated":"2013-12-19 16:44:23.000000000","message":"I think it is fine for resources to have their own \"private\" exceptions as long as they never let them escape the methods of the resource themselves.\n\nIn this case it looks like it is not caught anywhere, and thus that would be a bug. We should only be raising exceptions out of resources that are mapped in the Heat API. So I agree with Vijendar, if this is going to be raised, it needs to be a Heat exception, not private.","commit_id":"7e1e896624dd4e4995f95f695af4f934ef58b61e"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"a0e4b408a2ca35d61dbb3abb9570b74afac0bee6","unresolved":false,"context_lines":[{"line_number":55,"context_line":"    properties_schema \u003d {"},{"line_number":56,"context_line":"        HOST: properties.Schema("},{"line_number":57,"context_line":"            properties.Schema.STRING,"},{"line_number":58,"context_line":"            _(\u0027The hostname or IP address to check. This address must be\u0027"},{"line_number":59,"context_line":"              \u0027 reachable from the node running the Heat engine.\u0027),"},{"line_number":60,"context_line":"            required\u003dTrue"},{"line_number":61,"context_line":"        ),"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAATn%2F84GY%3D","line":58,"updated":"2013-12-19 09:28:41.000000000","message":"Cosmetic nit: I think, that will be better set \u0027white space\u0027 in first part of message, like in other places.","commit_id":"7e1e896624dd4e4995f95f695af4f934ef58b61e"},{"author":{"_account_id":7540,"name":"Stephen Sugden","email":"me@stephensugden.com","username":"grncdr"},"change_message_id":"d4f976b975b28794341d164ab46c59e29576e8fe","unresolved":false,"context_lines":[{"line_number":55,"context_line":"    properties_schema \u003d {"},{"line_number":56,"context_line":"        HOST: properties.Schema("},{"line_number":57,"context_line":"            properties.Schema.STRING,"},{"line_number":58,"context_line":"            _(\u0027The hostname or IP address to check. This address must be\u0027"},{"line_number":59,"context_line":"              \u0027 reachable from the node running the Heat engine.\u0027),"},{"line_number":60,"context_line":"            required\u003dTrue"},{"line_number":61,"context_line":"        ),"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAATn%2F81n8%3D","line":58,"in_reply_to":"AAAATn%2F84GY%3D","updated":"2013-12-19 18:25:09.000000000","message":"Done","commit_id":"7e1e896624dd4e4995f95f695af4f934ef58b61e"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"a0e4b408a2ca35d61dbb3abb9570b74afac0bee6","unresolved":false,"context_lines":[{"line_number":75,"context_line":""},{"line_number":76,"context_line":"        TIMEOUT: properties.Schema("},{"line_number":77,"context_line":"            properties.Schema.INTEGER,"},{"line_number":78,"context_line":"            _(\u0027The number of seconds to wait for each port in `ports` to begin\u0027"},{"line_number":79,"context_line":"              \u0027 accepting connections.\u0027),"},{"line_number":80,"context_line":"            required\u003dTrue"},{"line_number":81,"context_line":"        ),"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAATn%2F84GU%3D","line":78,"updated":"2013-12-19 09:28:41.000000000","message":"same","commit_id":"7e1e896624dd4e4995f95f695af4f934ef58b61e"},{"author":{"_account_id":7540,"name":"Stephen Sugden","email":"me@stephensugden.com","username":"grncdr"},"change_message_id":"d4f976b975b28794341d164ab46c59e29576e8fe","unresolved":false,"context_lines":[{"line_number":75,"context_line":""},{"line_number":76,"context_line":"        TIMEOUT: properties.Schema("},{"line_number":77,"context_line":"            properties.Schema.INTEGER,"},{"line_number":78,"context_line":"            _(\u0027The number of seconds to wait for each port in `ports` to begin\u0027"},{"line_number":79,"context_line":"              \u0027 accepting connections.\u0027),"},{"line_number":80,"context_line":"            required\u003dTrue"},{"line_number":81,"context_line":"        ),"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAATn%2F81n4%3D","line":78,"in_reply_to":"AAAATn%2F84GU%3D","updated":"2013-12-19 18:25:09.000000000","message":"Done","commit_id":"7e1e896624dd4e4995f95f695af4f934ef58b61e"},{"author":{"_account_id":4715,"name":"Angus Salkeld","email":"asalkeld@redhat.com","username":"asalkeld"},"change_message_id":"fa378e123e7c4cb1b7aa8bbc1d94c4cb6491fee5","unresolved":false,"context_lines":[{"line_number":82,"context_line":"    }"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    def handle_create(self):"},{"line_number":85,"context_line":"        \u0027\u0027\u0027Return an expiry time based on the \"timeout\" property.\u0027\u0027\u0027"},{"line_number":86,"context_line":"        ports \u003d set(self.properties[self.PORTS])"},{"line_number":87,"context_line":"        wait \u003d scheduler.PollingTaskGroup.from_task_with_args(self._wait,"},{"line_number":88,"context_line":"                                                              ports)"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAATn%2F80Fo%3D","line":85,"updated":"2013-12-20 02:09:53.000000000","message":"this doc string is now wrong. it returns a TaskRunner","commit_id":"2eb9d57fa869e1dd55c27133fefef4021717960c"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"ad0f5cfcff812247d29d6e84e54dd1739fcec178","unresolved":false,"context_lines":[{"line_number":50,"context_line":"    WaitCondition should be used."},{"line_number":51,"context_line":"    \u0027\u0027\u0027"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    PROPERTIES \u003d (TIMEOUT, HOST, PORTS) \u003d (\u0027timeout\u0027, \u0027host\u0027, \u0027ports\u0027)"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    properties_schema \u003d {"},{"line_number":56,"context_line":"        HOST: properties.Schema("}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAATn%2F8zQQ%3D","line":53,"updated":"2013-12-23 11:23:29.000000000","message":"Please, make this line format similar on other. F.e. https://github.com/openstack/heat/blob/master/heat/engine/resources/wait_condition.py#L135.\n\nIMO, It makes code more comfortable for reading.)\n\nAnd, please,  add comma after \u0027ports\u0027","commit_id":"af4b1987fa327e13698bedfe97651720ab25d0ef"}],"heat/engine/resources/portcheck.py":[{"author":{"_account_id":7135,"name":"Liang Chen","email":"liangchen.linux@gmail.com","username":"Liang"},"change_message_id":"48664c2cfd40071eaa5e4dda19b268cf6ea63f05","unresolved":false,"context_lines":[{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class PortCheck(resource.Resource):"},{"line_number":30,"context_line":"    properties_schema \u003d {"},{"line_number":31,"context_line":"        \u0027host\u0027: {\u0027Type\u0027: \u0027String\u0027,"},{"line_number":32,"context_line":"                 \u0027Description\u0027: _(\u0027The hostname or IP address to check.\u0027),"},{"line_number":33,"context_line":"                 \u0027Required\u0027: True},"},{"line_number":34,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F9M5Y%3D","line":31,"updated":"2013-12-14 09:05:51.000000000","message":"We may have a limitation here when it comes to overlapping ips when namespace is enabled. It would be good to have this stated in the description. Though initiating a connection from a namespace enabled system is fine as the other cases - namespace implementation will match incoming packets to sockets has been made namespace-aware.","commit_id":"c2c8d42f4fa9af5dcbfa22e69f6fff9a7bfd8721"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"8e9f827cafab9dc17363c89edf93f7be2a9d5c8f","unresolved":false,"context_lines":[{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        \u0027timeout\u0027: {\u0027Type\u0027: \u0027Number\u0027,"},{"line_number":44,"context_line":"                    \u0027Description\u0027: _(\u0027The number of seconds to wait for all \u0027"},{"line_number":45,"context_line":"                                     \u0027 ports to begin accepting connections.\u0027),"},{"line_number":46,"context_line":"                    \u0027Required\u0027: True}"},{"line_number":47,"context_line":"    }"},{"line_number":48,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F9JZE%3D","line":45,"updated":"2013-12-16 10:47:58.000000000","message":"Extra white space. I thin, that enough:\n\u0027ports to begin accepting connections.\u0027","commit_id":"c2c8d42f4fa9af5dcbfa22e69f6fff9a7bfd8721"},{"author":{"_account_id":4715,"name":"Angus Salkeld","email":"asalkeld@redhat.com","username":"asalkeld"},"change_message_id":"33d0f3c0b4963cb39ef38a8e1e5962724393e98a","unresolved":false,"context_lines":[{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def handle_create(self):"},{"line_number":50,"context_line":"        \u0027\u0027\u0027Return an expiry time based on the \"timeout\" property.\u0027\u0027\u0027"},{"line_number":51,"context_line":"        return datetime.now() + timedelta(seconds\u003dself.properties[\u0027timeout\u0027])"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def check_create_complete(self, expiry):"},{"line_number":54,"context_line":"        \u0027\u0027\u0027"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F9Jug%3D","line":51,"updated":"2013-12-16 09:22:11.000000000","message":"I\u0027d follow what the waitcondition does, see:\nhttps://github.com/openstack/heat/blob/master/heat/engine/resources/wait_condition.py#L225\n(also _wait() in that class)","commit_id":"c2c8d42f4fa9af5dcbfa22e69f6fff9a7bfd8721"},{"author":{"_account_id":7135,"name":"Liang Chen","email":"liangchen.linux@gmail.com","username":"Liang"},"change_message_id":"48664c2cfd40071eaa5e4dda19b268cf6ea63f05","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        if datetime.now() \u003c expiry:"},{"line_number":60,"context_line":"            raise exception.Error(\u0027Timeout waiting for services on %s\u0027 % host)"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"        return all(self._check_port(host, port)"},{"line_number":63,"context_line":"                   for port in self.properties[\u0027ports\u0027])"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def _check_port(self, host, port):"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F9M5Q%3D","line":62,"updated":"2013-12-14 09:05:51.000000000","message":"This should not check those which have been previously verified to be open ports repeatedly for each check_create_complete call.","commit_id":"c2c8d42f4fa9af5dcbfa22e69f6fff9a7bfd8721"},{"author":{"_account_id":7225,"name":"Serg Melikyan","email":"smelikyan@mirantis.com","username":"smelikyan"},"change_message_id":"fb97a90d1fc474e93e0a31bb8abf27132b708ef8","unresolved":false,"context_lines":[{"line_number":67,"context_line":"        Return boolean indicating if `host:port` is connectable."},{"line_number":68,"context_line":"        \u0027\u0027\u0027"},{"line_number":69,"context_line":"        try:"},{"line_number":70,"context_line":"            eventlet.connect((host, port)).close()"},{"line_number":71,"context_line":"            return True"},{"line_number":72,"context_line":"        except socket.error:"},{"line_number":73,"context_line":"            return False"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F9JPs%3D","line":70,"updated":"2013-12-16 11:16:22.000000000","message":"I am not sure, but service booted on VM may be not accessible from Heat (this check will fail) since usually Heat is located in different network then a service that is listens on VMs. \n\nTo check that some service listens some port we need to be in the same network as service. Also port may be opened not only for one network, but for several ones, and we not going to be able check that port is accessible from different networks.","commit_id":"c2c8d42f4fa9af5dcbfa22e69f6fff9a7bfd8721"}],"heat/tests/test_port_check.py":[{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"17fb4da5f7a7ea34c2f1adec203e7129f48a2db6","unresolved":false,"context_lines":[{"line_number":88,"context_line":""},{"line_number":89,"context_line":"        self.m.ReplayAll()"},{"line_number":90,"context_line":"        self.stack.create()"},{"line_number":91,"context_line":"        self.assertEqual(self.stack.state,"},{"line_number":92,"context_line":"                         (parser.Stack.CREATE, parser.Stack.COMPLETE))"},{"line_number":93,"context_line":"        self.m.VerifyAll()"},{"line_number":94,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAATn%2F84SE%3D","line":91,"updated":"2013-12-19 08:43:24.000000000","message":"please fix order of arguments to assertEqual to be (expected, observed), here and it line 117","commit_id":"7566e8d3390804989a670947972f5898c0f8e19f"},{"author":{"_account_id":6488,"name":"Clint Byrum","email":"clint@fewbar.com","username":"clint-fewbar"},"change_message_id":"78c56376aaae55a56096ca8d1d7cc422671525ea","unresolved":false,"context_lines":[{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    def tearDown(self):"},{"line_number":59,"context_line":"        super(PortCheckTest, self).tearDown()"},{"line_number":60,"context_line":"        utils.reset_dummy_db()"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    def create_stack(self):"},{"line_number":63,"context_line":"        template \u003d parser.Template("}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAATn%2F81bA%3D","line":60,"updated":"2013-12-19 18:50:54.000000000","message":"Do not use tearDown. It is problematic and may not be run in all cases.\n\nIn setUp, use\n\n    self.addCleanup(utils.reset_dummy_db)","commit_id":"7e1e896624dd4e4995f95f695af4f934ef58b61e"},{"author":{"_account_id":6488,"name":"Clint Byrum","email":"clint@fewbar.com","username":"clint-fewbar"},"change_message_id":"78c56376aaae55a56096ca8d1d7cc422671525ea","unresolved":false,"context_lines":[{"line_number":76,"context_line":""},{"line_number":77,"context_line":"        return stack"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    @utils.stack_delete_after"},{"line_number":80,"context_line":"    def test_connect_succeeds(self):"},{"line_number":81,"context_line":"        self.stack \u003d self.create_stack()"},{"line_number":82,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAATn%2F81Zw%3D","line":79,"updated":"2013-12-19 18:50:54.000000000","message":"belt and suspenders is fine, but I just wanted to note that using reset_dummy_db eliminates the need for htis.","commit_id":"7e1e896624dd4e4995f95f695af4f934ef58b61e"},{"author":{"_account_id":4715,"name":"Angus Salkeld","email":"asalkeld@redhat.com","username":"asalkeld"},"change_message_id":"fa378e123e7c4cb1b7aa8bbc1d94c4cb6491fee5","unresolved":false,"context_lines":[{"line_number":69,"context_line":"        self.stack_id \u003d str(uuid.uuid4())"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"        with utils.UUIDStub(self.stack_id):"},{"line_number":72,"context_line":"            stack.store()"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"        return stack"},{"line_number":75,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAATn%2F80EI%3D","line":72,"updated":"2013-12-20 02:09:53.000000000","message":"I don\u0027t think you need this uuidStub at all, it\u0027s for when we generate ec2signed urls and need the uuid to be known. Try without.","commit_id":"2eb9d57fa869e1dd55c27133fefef4021717960c"}]}
