)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":1849,"name":"Joe Gordon","email":"joe.gordon0@gmail.com","username":"jogo"},"change_message_id":"e1ff9aadb52bcf0793fdf7e567f51f06826e8098","unresolved":false,"context_lines":[{"line_number":15,"context_line":"JAVELIN_START (the time at which the javelin command was"},{"line_number":16,"context_line":"called). This is done in an effort to avoid ambiguity of"},{"line_number":17,"context_line":"sample data and race conditions with notifications made"},{"line_number":18,"context_line":"by nova and polling done by the ceilometer compute agent."},{"line_number":19,"context_line":"Since we can only use JAVELIN_START to ensure that old samples"},{"line_number":20,"context_line":"are in fact old we also inspect the modified time on the ceilometer"},{"line_number":21,"context_line":"data dump file and use that to compare new samples against it."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":17,"id":"1abeadc6_ec03410d","line":18,"updated":"2014-08-18 20:49:18.000000000","message":"wow that sounds bad","commit_id":"bedd6fe3b90391dc3cf39068f6599ee387cc9653"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"6e9fc555c6f6fef9664fee1955faf8c5783c15f7","unresolved":false,"context_lines":[{"line_number":15,"context_line":"JAVELIN_START (the time at which the javelin command was"},{"line_number":16,"context_line":"called). This is done in an effort to avoid ambiguity of"},{"line_number":17,"context_line":"sample data and race conditions with notifications made"},{"line_number":18,"context_line":"by nova and polling done by the ceilometer compute agent."},{"line_number":19,"context_line":"Since we can only use JAVELIN_START to ensure that old samples"},{"line_number":20,"context_line":"are in fact old we also inspect the modified time on the ceilometer"},{"line_number":21,"context_line":"data dump file and use that to compare new samples against it."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":17,"id":"1abeadc6_759c40c1","line":18,"in_reply_to":"1abeadc6_4bb6d2da","updated":"2014-08-19 09:13:41.000000000","message":"If you look within the earlier discussion on the patchset you\u0027ll see that \"create: create a resources in ceilometer, poll until ready. check: make sure resource is still there.\" has been there for a while.\n\nThat confirms that a meter that was saved during icehouse is still available during juno. It doesn\u0027t now, however, confirm that _metering_ is still available. The stuff related to time and the difference between the checks during create and the checks during check are there to confirm the latter.\n\nYou might argue that confirming _metering_ is not necessary. If so, I disagree, even the writing of this code has already revealed (and fixed) bugs or lacks in resiliency in all three of tempest, grenade and devstack, nevermind ceilometer itself.\n\nWhen we have an opportunity to use the testing harness to really test things, we should.\n\nThe code that you\u0027re seeing here is doing what you ask in the form you\u0027re asking for it: \"reliably add resources to ceilometer? In every other service there is a way to create a resource and poll until its ready\"\n\nI suspect what you\u0027re objecting to is the volume of code involved. If we\u0027re willing to accept some ambiguity (thus increasing the already far too great ambiguity (thus risk) in existing tests) that volume doesn\u0027t need to be there. It is there solely to ensure that the tests are as explicit and informative in both success and failure, as possible.","commit_id":"bedd6fe3b90391dc3cf39068f6599ee387cc9653"},{"author":{"_account_id":1849,"name":"Joe Gordon","email":"joe.gordon0@gmail.com","username":"jogo"},"change_message_id":"4bce7d102e303f92d48af6a2b4b9728add76ea80","unresolved":false,"context_lines":[{"line_number":15,"context_line":"JAVELIN_START (the time at which the javelin command was"},{"line_number":16,"context_line":"called). This is done in an effort to avoid ambiguity of"},{"line_number":17,"context_line":"sample data and race conditions with notifications made"},{"line_number":18,"context_line":"by nova and polling done by the ceilometer compute agent."},{"line_number":19,"context_line":"Since we can only use JAVELIN_START to ensure that old samples"},{"line_number":20,"context_line":"are in fact old we also inspect the modified time on the ceilometer"},{"line_number":21,"context_line":"data dump file and use that to compare new samples against it."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":17,"id":"1abeadc6_4bb6d2da","line":18,"in_reply_to":"1abeadc6_72470820","updated":"2014-08-19 02:32:20.000000000","message":"Right, I think this is crux of the issue, how to reliably add resources to ceilometer?  In every other service there is a way to create a resource and poll until its ready. Is there anyway to do that here?  If so then can\u0027t this test just do: \n\ncreate: create a resources in ceilometer, poll until ready.\ncheck: make sure resource is still there.","commit_id":"bedd6fe3b90391dc3cf39068f6599ee387cc9653"},{"author":{"_account_id":1849,"name":"Joe Gordon","email":"joe.gordon0@gmail.com","username":"jogo"},"change_message_id":"16e4d8e22339ab03ad6b5046d5ebc80e63c13462","unresolved":false,"context_lines":[{"line_number":15,"context_line":"JAVELIN_START (the time at which the javelin command was"},{"line_number":16,"context_line":"called). This is done in an effort to avoid ambiguity of"},{"line_number":17,"context_line":"sample data and race conditions with notifications made"},{"line_number":18,"context_line":"by nova and polling done by the ceilometer compute agent."},{"line_number":19,"context_line":"Since we can only use JAVELIN_START to ensure that old samples"},{"line_number":20,"context_line":"are in fact old we also inspect the modified time on the ceilometer"},{"line_number":21,"context_line":"data dump file and use that to compare new samples against it."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":17,"id":"1abeadc6_331bbb1d","line":18,"in_reply_to":"1abeadc6_759c40c1","updated":"2014-08-26 17:00:40.000000000","message":"Chris, I agree that this extra level of testing (confirming that _metering_ is still available) is very useful and we should support it. But how about splitting this up into two separate patches.\n\nPatch 1: the basic test\nPatch 2: confirm metering is still available\n\nThat way we can land patch 1 while hashing out any final mechanics of patch 2.","commit_id":"bedd6fe3b90391dc3cf39068f6599ee387cc9653"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"b28eb1d6cbb858e8c9a3c8be13c2d06f97fd666c","unresolved":false,"context_lines":[{"line_number":15,"context_line":"JAVELIN_START (the time at which the javelin command was"},{"line_number":16,"context_line":"called). This is done in an effort to avoid ambiguity of"},{"line_number":17,"context_line":"sample data and race conditions with notifications made"},{"line_number":18,"context_line":"by nova and polling done by the ceilometer compute agent."},{"line_number":19,"context_line":"Since we can only use JAVELIN_START to ensure that old samples"},{"line_number":20,"context_line":"are in fact old we also inspect the modified time on the ceilometer"},{"line_number":21,"context_line":"data dump file and use that to compare new samples against it."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":17,"id":"1abeadc6_72470820","line":18,"in_reply_to":"1abeadc6_ec03410d","updated":"2014-08-18 21:31:29.000000000","message":"The races are not bugs in ceilometer or nova, they are the result of:\n\n* lack of information available in javelin2 about \"time\"\n* lack of metadata in meters about the release they come from\n* variability in start up times (see e.g. the fix I made here: https://review.openstack.org/#/c/113522/ )\n\nThese combine to create a lot of ambiguity in a context that lacks the tools to clarify it.","commit_id":"bedd6fe3b90391dc3cf39068f6599ee387cc9653"}],"tempest/cmd/javelin.py":[{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"fa15bd37dd36e2a84c9ff699f1460275add6ee5c","unresolved":false,"context_lines":[{"line_number":60,"context_line":"# using full paths where files are called is the right thing to do."},{"line_number":61,"context_line":"# I\u0027m not sure what will happen in the gate, obviously there\u0027s no"},{"line_number":62,"context_line":"# /home/cdent there, so commented..."},{"line_number":63,"context_line":"BASENAME \u003d \u0027/home/cdent/src/devstack/files/images/cirros-0.3.2-x86_64-uec\u0027"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"LOG \u003d None"},{"line_number":66,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"1ae5cdf2_ae22f5b7","line":63,"updated":"2014-06-24 22:48:29.000000000","message":"Relative path an option?\n\n(i.e. if grenade always runs with the pwd relative to the devstack install in the gate)","commit_id":"33c1063460cb0055d0c388ac67a78f786b7dab2b"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"1399af6c6185d07f0446e59ee2b34a916932ac31","unresolved":false,"context_lines":[{"line_number":60,"context_line":"# using full paths where files are called is the right thing to do."},{"line_number":61,"context_line":"# I\u0027m not sure what will happen in the gate, obviously there\u0027s no"},{"line_number":62,"context_line":"# /home/cdent there, so commented..."},{"line_number":63,"context_line":"BASENAME \u003d \u0027/home/cdent/src/devstack/files/images/cirros-0.3.2-x86_64-uec\u0027"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"LOG \u003d None"},{"line_number":66,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"dab895d6_ee48c3ce","line":63,"in_reply_to":"1ae5cdf2_ae22f5b7","updated":"2014-06-29 15:39:19.000000000","message":"It should be an option, yes, but I\u0027ve been unable to locate information on what the pwd will be when javelin is called. There\u0027s a great deal of implicit knowledge or at least a lot implicit knowledge on where the explicit knowledge can be found.","commit_id":"33c1063460cb0055d0c388ac67a78f786b7dab2b"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"fa15bd37dd36e2a84c9ff699f1460275add6ee5c","unresolved":false,"context_lines":[{"line_number":276,"context_line":"            client \u003d client_for_user(user)"},{"line_number":277,"context_line":"            stats_query \u003d (\u0027user_id\u0027, \u0027eq\u0027, \u0027%s\u0027 % user_id)"},{"line_number":278,"context_line":"            r, body \u003d client.telemetry.list_statistics("},{"line_number":279,"context_line":"                \u0027vcpus\u0027, query\u003dstats_query)"},{"line_number":280,"context_line":"            if body:"},{"line_number":281,"context_line":"                self.assertEqual(body[0][\u0027max\u0027], vcpu_count)"},{"line_number":282,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"1ae5cdf2_ee55dd1e","line":279,"updated":"2014-06-24 22:48:29.000000000","message":"Why the choice of vcpus for the query?\n\nHow about doing some assertions on the resource metadata?\n\ne.g. that some user metadata of form \u0027metering.foo\u003dbar\u0027 appears in the before and after values for the metadata?\n\n(Would require a samples query, as opposed to statistics)","commit_id":"33c1063460cb0055d0c388ac67a78f786b7dab2b"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"1399af6c6185d07f0446e59ee2b34a916932ac31","unresolved":false,"context_lines":[{"line_number":276,"context_line":"            client \u003d client_for_user(user)"},{"line_number":277,"context_line":"            stats_query \u003d (\u0027user_id\u0027, \u0027eq\u0027, \u0027%s\u0027 % user_id)"},{"line_number":278,"context_line":"            r, body \u003d client.telemetry.list_statistics("},{"line_number":279,"context_line":"                \u0027vcpus\u0027, query\u003dstats_query)"},{"line_number":280,"context_line":"            if body:"},{"line_number":281,"context_line":"                self.assertEqual(body[0][\u0027max\u0027], vcpu_count)"},{"line_number":282,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"dab895d6_ee1fe3b5","line":279,"in_reply_to":"1ae5cdf2_ee55dd1e","updated":"2014-06-29 15:39:19.000000000","message":"a) I just wanted to get something in there before going to bed.\nb) I wanted to test something that I could independently verify rather than just rely on the results of commands being used  in the same way as the test.\nc) See above about implicit knowledge; I\u0027m unclear not only on how to assert on resource metadata but also on how to query to find out which resource metadata are available to query.","commit_id":"33c1063460cb0055d0c388ac67a78f786b7dab2b"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"fa15bd37dd36e2a84c9ff699f1460275add6ee5c","unresolved":false,"context_lines":[{"line_number":327,"context_line":"            r, aki \u003d client.images.create_image("},{"line_number":328,"context_line":"                \u0027javelin_\u0027 + image[\u0027aki\u0027], \u0027aki\u0027, \u0027aki\u0027)"},{"line_number":329,"context_line":"            with open(os.path.join(BASENAME, image[\u0027aki\u0027]), \u0027r\u0027) as f:"},{"line_number":330,"context_line":"                r, body \u003d client.images.store_image(aki.get(\u0027id\u0027), f)"},{"line_number":331,"context_line":"            extras[\u0027kernel_id\u0027] \u003d aki.get(\u0027id\u0027)"},{"line_number":332,"context_line":""},{"line_number":333,"context_line":"            r, ari \u003d client.images.create_image("}],"source_content_type":"text/x-python","patch_set":1,"id":"1ae5cdf2_0ede89da","line":330,"updated":"2014-06-24 22:48:29.000000000","message":"r, body unused?","commit_id":"33c1063460cb0055d0c388ac67a78f786b7dab2b"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"1399af6c6185d07f0446e59ee2b34a916932ac31","unresolved":false,"context_lines":[{"line_number":327,"context_line":"            r, aki \u003d client.images.create_image("},{"line_number":328,"context_line":"                \u0027javelin_\u0027 + image[\u0027aki\u0027], \u0027aki\u0027, \u0027aki\u0027)"},{"line_number":329,"context_line":"            with open(os.path.join(BASENAME, image[\u0027aki\u0027]), \u0027r\u0027) as f:"},{"line_number":330,"context_line":"                r, body \u003d client.images.store_image(aki.get(\u0027id\u0027), f)"},{"line_number":331,"context_line":"            extras[\u0027kernel_id\u0027] \u003d aki.get(\u0027id\u0027)"},{"line_number":332,"context_line":""},{"line_number":333,"context_line":"            r, ari \u003d client.images.create_image("}],"source_content_type":"text/x-python","patch_set":1,"id":"dab895d6_4e652f44","line":330,"in_reply_to":"1ae5cdf2_0ede89da","updated":"2014-06-29 15:39:19.000000000","message":"Yes, that\u0027s an artifact of diagnosing the issues with swallowed exceptions and not getting stuff cleaned up properly. Will fix when I make a grander commit.","commit_id":"33c1063460cb0055d0c388ac67a78f786b7dab2b"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"fa15bd37dd36e2a84c9ff699f1460275add6ee5c","unresolved":false,"context_lines":[{"line_number":340,"context_line":"            image[\u0027name\u0027], image[\u0027format\u0027], image[\u0027format\u0027], **extras)"},{"line_number":341,"context_line":"        image_id \u003d body.get(\u0027id\u0027)"},{"line_number":342,"context_line":"        with open(os.path.join(BASENAME, image[\u0027file\u0027]), \u0027r\u0027) as f:"},{"line_number":343,"context_line":"            r. body \u003d client.images.store_image(image_id, f)"},{"line_number":344,"context_line":""},{"line_number":345,"context_line":""},{"line_number":346,"context_line":"#######################"}],"source_content_type":"text/x-python","patch_set":1,"id":"1ae5cdf2_8ea0d943","line":343,"updated":"2014-06-24 22:48:29.000000000","message":"Is that period after the r identifier deliberate?\n\ni.e.\n\n  s/r. body/r, body/","commit_id":"33c1063460cb0055d0c388ac67a78f786b7dab2b"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"1399af6c6185d07f0446e59ee2b34a916932ac31","unresolved":false,"context_lines":[{"line_number":340,"context_line":"            image[\u0027name\u0027], image[\u0027format\u0027], image[\u0027format\u0027], **extras)"},{"line_number":341,"context_line":"        image_id \u003d body.get(\u0027id\u0027)"},{"line_number":342,"context_line":"        with open(os.path.join(BASENAME, image[\u0027file\u0027]), \u0027r\u0027) as f:"},{"line_number":343,"context_line":"            r. body \u003d client.images.store_image(image_id, f)"},{"line_number":344,"context_line":""},{"line_number":345,"context_line":""},{"line_number":346,"context_line":"#######################"}],"source_content_type":"text/x-python","patch_set":1,"id":"dab895d6_8e5f4772","line":343,"in_reply_to":"1ae5cdf2_8ea0d943","updated":"2014-06-29 15:39:19.000000000","message":"see above","commit_id":"33c1063460cb0055d0c388ac67a78f786b7dab2b"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"043a13fa98764b5f6323dda1e0aac783fa2ad387","unresolved":false,"context_lines":[{"line_number":267,"context_line":"        for server in self.res[\u0027servers\u0027]:"},{"line_number":268,"context_line":"            client \u003d client_for_user(server[\u0027owner\u0027])"},{"line_number":269,"context_line":"            r, body \u003d client.telemetry.list_samples(\u0027vcpus\u0027, query\u003d("},{"line_number":270,"context_line":"                \u0027metadata.display_name\u0027, \u0027eq\u0027, server[\u0027name\u0027]))"},{"line_number":271,"context_line":"            latest_sample \u003d body[0]"},{"line_number":272,"context_line":"            # Confirm display_name"},{"line_number":273,"context_line":"            self.assertEqual("}],"source_content_type":"text/x-python","patch_set":3,"id":"baada198_255ba755","line":270,"updated":"2014-07-01 07:56:03.000000000","message":"It would be nice here to also check that user_metadata is preserved as well as system metadata (as Heat autoscaling depends on the former).\n\nSo for example, when the server is spun up by javaelin, add some user metadata, e.g. on line 405 below:\n\n  client.servers.create_server(server[\u0027name\u0027], image_id, flavor_id,\n                               meta\u003ddict(metering.server_group\u003d\u0027javelin\u0027))\n\nThen add a a further query to ensure that the user metadata is preserved:\n\n    r, body \u003d client.telemetry.list_samples(\u0027vcpus\u0027, query\u003d(\n        \u0027metadata.user_metadata.server_group\u0027, \u0027eq\u0027, \u0027javelin\u0027))","commit_id":"c394203ccd5ff30895924d71909818a89489c40b"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"1e14eaee881cb22365251c5dcbba7d9b4cc8310e","unresolved":false,"context_lines":[{"line_number":267,"context_line":"        for server in self.res[\u0027servers\u0027]:"},{"line_number":268,"context_line":"            client \u003d client_for_user(server[\u0027owner\u0027])"},{"line_number":269,"context_line":"            r, body \u003d client.telemetry.list_samples(\u0027vcpus\u0027, query\u003d("},{"line_number":270,"context_line":"                \u0027metadata.display_name\u0027, \u0027eq\u0027, server[\u0027name\u0027]))"},{"line_number":271,"context_line":"            latest_sample \u003d body[0]"},{"line_number":272,"context_line":"            # Confirm display_name"},{"line_number":273,"context_line":"            self.assertEqual("}],"source_content_type":"text/x-python","patch_set":3,"id":"baada198_4edd1370","line":270,"in_reply_to":"baada198_255ba755","updated":"2014-07-01 11:33:04.000000000","message":"Yeah, that\u0027s a good idea. Until your comment, however, I didn\u0027t know how to do that. Now that I do, I\u0027ll make it so in the next commit.","commit_id":"c394203ccd5ff30895924d71909818a89489c40b"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"043a13fa98764b5f6323dda1e0aac783fa2ad387","unresolved":false,"context_lines":[{"line_number":268,"context_line":"            client \u003d client_for_user(server[\u0027owner\u0027])"},{"line_number":269,"context_line":"            r, body \u003d client.telemetry.list_samples(\u0027vcpus\u0027, query\u003d("},{"line_number":270,"context_line":"                \u0027metadata.display_name\u0027, \u0027eq\u0027, server[\u0027name\u0027]))"},{"line_number":271,"context_line":"            latest_sample \u003d body[0]"},{"line_number":272,"context_line":"            # Confirm display_name"},{"line_number":273,"context_line":"            self.assertEqual("},{"line_number":274,"context_line":"                latest_sample[\u0027resource_metadata\u0027][\u0027display_name\u0027],"}],"source_content_type":"text/x-python","patch_set":3,"id":"baada198_201d5510","line":271,"updated":"2014-07-01 07:56:03.000000000","message":"The assertions only apply to the latest sample.\n\nI though I idea was to ensure that samples from before and after the upgrade where present and correct?\n\nAlso need to be defensive there, e.g.:\n\n   self.assertTrue(len(body) \u003e 0, \u0027expected non-zero set of samples\u0027)\n   latest_sample \u003d body[0]","commit_id":"c394203ccd5ff30895924d71909818a89489c40b"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"1e14eaee881cb22365251c5dcbba7d9b4cc8310e","unresolved":false,"context_lines":[{"line_number":268,"context_line":"            client \u003d client_for_user(server[\u0027owner\u0027])"},{"line_number":269,"context_line":"            r, body \u003d client.telemetry.list_samples(\u0027vcpus\u0027, query\u003d("},{"line_number":270,"context_line":"                \u0027metadata.display_name\u0027, \u0027eq\u0027, server[\u0027name\u0027]))"},{"line_number":271,"context_line":"            latest_sample \u003d body[0]"},{"line_number":272,"context_line":"            # Confirm display_name"},{"line_number":273,"context_line":"            self.assertEqual("},{"line_number":274,"context_line":"                latest_sample[\u0027resource_metadata\u0027][\u0027display_name\u0027],"}],"source_content_type":"text/x-python","patch_set":3,"id":"baada198_ce7923fe","line":271,"in_reply_to":"baada198_201d5510","updated":"2014-07-01 11:33:04.000000000","message":"As far as I can tell the \"check\" phase of javelin will be called twice. Once before the upgrade and once after. Is it fair to assume that ceilometer and nova will have had a chance to conspire to create new samples since the upgrade. I don\u0027t know, and I haven\u0027t been able to figure it out (yet). Similarly I don\u0027t yet have a clear picture on when/how and in what context javelin is run. I need to ping Sean \u0026 co for some of those details.\n\nWithout that stuff it is hard to determine how to check the samples in the most effective way possible. So in the mean time things inch forward slowly.\n\nWill get the defensive thing in next set.","commit_id":"c394203ccd5ff30895924d71909818a89489c40b"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"d9c403befaa70c074c4f2183c6f0d3271a8d8033","unresolved":false,"context_lines":[{"line_number":264,"context_line":"            )"},{"line_number":265,"context_line":"            self.assertEqual(r.status, 200)"},{"line_number":266,"context_line":"            self.assertTrue(len(body) \u003e 0, \u0027expected non-zero set of samples\u0027)"},{"line_number":267,"context_line":"            self._confirm_telemetry_sample(server, latest_sample)"},{"line_number":268,"context_line":""},{"line_number":269,"context_line":"    def check_volumes(self):"},{"line_number":270,"context_line":"        \"\"\"Check that the volumes are still there and attached.\"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"baada198_54b75d3a","line":267,"updated":"2014-07-16 13:39:34.000000000","message":"A simple way of approximating the \"spanning the upgrade\" logic would be to make the detailed assertions about the first and last samples (i.e. body[-1] \u0026 body[0], respectively), assuming the former predates the actual upgrade.","commit_id":"b79f4d5598b558bd9e2846c566a69f8fd9201a0e"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"8c2d0a78530d9f68c7e6d7149bcc23ebaf72775a","unresolved":false,"context_lines":[{"line_number":264,"context_line":"            )"},{"line_number":265,"context_line":"            self.assertEqual(r.status, 200)"},{"line_number":266,"context_line":"            self.assertTrue(len(body) \u003e 0, \u0027expected non-zero set of samples\u0027)"},{"line_number":267,"context_line":"            self._confirm_telemetry_sample(server, latest_sample)"},{"line_number":268,"context_line":""},{"line_number":269,"context_line":"    def check_volumes(self):"},{"line_number":270,"context_line":"        \"\"\"Check that the volumes are still there and attached.\"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"baada198_94bad56f","line":267,"in_reply_to":"baada198_54b75d3a","updated":"2014-07-16 13:51:49.000000000","message":"I\u0027ve thought of that, but there are some issues/concerns/thoughts:\n\nI\u0027m waiting for confirmation on when and in what form javelin is run. It wasn\u0027t until yesterday that I became aware of \u003chttps://review.openstack.org/#/c/97317/7/grenade.sh,cm\u003e which shows create mode before the upgrade, with no check, and check mode after the upgrade. I had been assuming that before would include both create and check (as the check is needed to, you know \"check\"). If only one check is being done, and it is after the upgrade, then your idea will work, but only if we know for certain that the system was up (prior to upgrade) for long enough for notifications from nova to be consumed. I assume so, but given all the issues that are present with latency, races, etc, it all seems a bit ambiguous.\n\nAlso, to me, it is important to run \u0027check\u0027 mode pre-upgrade to confirm that the expected things have happened in terms of instances being created, otherwise when the check mode runs after the upgrade a failure can mean two thing: the thing didn\u0027t survive the upgrade or it was never created in the first place. Such ambiguity is intolerable in tests and should be shunned, eschewed and otherwise dissed.\n\nSo, if a check is run both before and after then the style of test you are recommending can\u0027t work: all the samples predate the upgrade on the first run.\n\nSo, you see my quandry? Ideas?","commit_id":"b79f4d5598b558bd9e2846c566a69f8fd9201a0e"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"20d2e6edeec0450c613161e1eea2f2087c2a789f","unresolved":false,"context_lines":[{"line_number":264,"context_line":"            )"},{"line_number":265,"context_line":"            self.assertEqual(r.status, 200)"},{"line_number":266,"context_line":"            self.assertTrue(len(body) \u003e 0, \u0027expected non-zero set of samples\u0027)"},{"line_number":267,"context_line":"            self._confirm_telemetry_sample(server, latest_sample)"},{"line_number":268,"context_line":""},{"line_number":269,"context_line":"    def check_volumes(self):"},{"line_number":270,"context_line":"        \"\"\"Check that the volumes are still there and attached.\"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"baada198_8de2c0ff","line":267,"in_reply_to":"baada198_94bad56f","updated":"2014-07-16 18:48:12.000000000","message":"Well my naive understanding of how grenade was *supposed* to work (garnered from discussions at summit, as opposed to actually seeing the thing run in anger) was that:\n\n* javelin resources are created to test survivability primarily, not to test resource creation\n* straight resource creation against an version-stable cloud on the other hand is tested separately via the API/scenario tests in Tempest itself\n\nIf that understanding is correct, then it seems to follow that the sequencing:\n\n* install stable/previous\n* run javelin in create mode\n* shutdown and upgrage to master\n* run javelin in check mode\n\nwould actually make sense. Certainly that was the kind mental picture (possibly erroneous) that I picked up in the sessions in Atlanta that touched on grenade.","commit_id":"b79f4d5598b558bd9e2846c566a69f8fd9201a0e"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"7e60f8c772f284efa30e443725dcff50c44e813f","unresolved":false,"context_lines":[{"line_number":264,"context_line":"        # checks before and after the upgrade. This doesn\u0027t work"},{"line_number":265,"context_line":"        # yet because the number of samples generated for vcpus on"},{"line_number":266,"context_line":"        # create is 12, not the 1 stated below. Will figure out the"},{"line_number":267,"context_line":"        # right thing and fix."},{"line_number":268,"context_line":"        if OPTS.mode \u003d\u003d \u0027create\u0027:"},{"line_number":269,"context_line":"            expected_sample_minimum \u003d 1"},{"line_number":270,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":8,"id":"baada198_c7c47663","line":267,"updated":"2014-08-07 09:04:28.000000000","message":"As explained off-gerrit, that 12 is due to the multiplicity of compute.instance.update notifications during the nova boot workflow.\n\nInitially, I had assumed that the expected extra post-upgrade sample is driven from a compute.instance.exists notification due to the nova services being restarted on upgrade and hence the next audit cycle kicking.\n\nHowever a quick scan of the nova code used to trigger the audit cycle indicates that since it uses a combination of a periodic task and a check on the last completed audit time, the next audit cycle won\u0027t kick in automatically straight after the upgrade - instead the audit cycles are clamped to wall-clock time (e.g. the next hour-boundary) and not reset on service restart IIUC.\n\nSo I wonder where that additional post-upgrade vcpus sample is originating from?\n\nIf it turns out that we\u0027re not actually seeing an additional post-upgrade vcpus sample, then an alternative idea would be to check for a polling-originated sample in the post-upgrade check (such as cpu) so as to leverage the fact that the ceilometer agents have been restarted.","commit_id":"947da45a478df428f090f1a197a9776686959f9c"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"15b2d6f6b22b6bf58e57831e90ca55aef0ef0035","unresolved":false,"context_lines":[{"line_number":264,"context_line":"        # checks before and after the upgrade. This doesn\u0027t work"},{"line_number":265,"context_line":"        # yet because the number of samples generated for vcpus on"},{"line_number":266,"context_line":"        # create is 12, not the 1 stated below. Will figure out the"},{"line_number":267,"context_line":"        # right thing and fix."},{"line_number":268,"context_line":"        if OPTS.mode \u003d\u003d \u0027create\u0027:"},{"line_number":269,"context_line":"            expected_sample_minimum \u003d 1"},{"line_number":270,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":8,"id":"baada198_a280469d","line":267,"in_reply_to":"baada198_92b0f7fe","updated":"2014-08-07 14:41:07.000000000","message":"These various ideas all seem to have a built in race condition; I\u0027m not sure which idea is least likely to cause a problem.\n\nFor example, if a query for cpu on one of the created servers is done before and after the upgrade, odds are that before the upgrade there will be no results because the pollster has not run. However, that\u0027s not _guaranteed_.\n\nSimilarly, if a query is done for `instance` it is unlikely, but not impossible, that some data after the upgrade will come from notifications and some from polling.\n\nTherefore I need the answer to two questions:\n\n* How can I form a query that says \"only give me polling data for meter X\"?\n* How can I form a query that says \"only give me results after the upgrade\"?\n\nIs there metadata that will allow filters on that?\n\nFor the sake on concision and quick resolution pretend a) that I\u0027m an idiot b) the query docs suck.","commit_id":"947da45a478df428f090f1a197a9776686959f9c"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"d202019c3ba099ad997e0b8e812ac8f5dfa6bc22","unresolved":false,"context_lines":[{"line_number":264,"context_line":"        # checks before and after the upgrade. This doesn\u0027t work"},{"line_number":265,"context_line":"        # yet because the number of samples generated for vcpus on"},{"line_number":266,"context_line":"        # create is 12, not the 1 stated below. Will figure out the"},{"line_number":267,"context_line":"        # right thing and fix."},{"line_number":268,"context_line":"        if OPTS.mode \u003d\u003d \u0027create\u0027:"},{"line_number":269,"context_line":"            expected_sample_minimum \u003d 1"},{"line_number":270,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":8,"id":"baada198_0e7f5118","line":267,"in_reply_to":"baada198_a280469d","updated":"2014-08-07 21:41:17.000000000","message":"Great questions!\n\n\u003e How can I form a query that says \"only give me polling data for meter X\"?\n\nI assume you mean here that if meter X originates from *both* polling and notifications, how can the samples produced from the one be distinguished from the other?\n\nI think it comes down to the fact that certain metadata are guaranteed never to be present in the polling case, as these are only ever populated from notification-specific fields. I\u0027m thinking here of \u0027event_type\u0027 and the likes.\n\nSo if you query for *all* samples for that meter, you can then distinguish on the client side between the samples that are polled and those were notified, simply by virtue of the presence or absence of metadata such as \u0027event_type\u0027.\n\n\u003e How can I form a query that says \"only give me results after the upgrade\"?\n\nThe only way of doing this AFAICS is to constrain a lower bound on sample timestamp. We discussed before how the appropriate might be deduced, e.g. by looking at the timestamp on the ceilometer database-dump made as part of the shutdown on the old cloud. \n\nIIRC you weren\u0027t a huge fan of going out to disk in that way, but right now I can\u0027t think of a better option, as we don\u0027t decorate the samples with any kind of versioning info (e.g. that was an icehouse sample, whereas this is a juno sample etc.)","commit_id":"947da45a478df428f090f1a197a9776686959f9c"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"7f76a1d36a7e20b7896926735a98b91234837f36","unresolved":false,"context_lines":[{"line_number":264,"context_line":"        # checks before and after the upgrade. This doesn\u0027t work"},{"line_number":265,"context_line":"        # yet because the number of samples generated for vcpus on"},{"line_number":266,"context_line":"        # create is 12, not the 1 stated below. Will figure out the"},{"line_number":267,"context_line":"        # right thing and fix."},{"line_number":268,"context_line":"        if OPTS.mode \u003d\u003d \u0027create\u0027:"},{"line_number":269,"context_line":"            expected_sample_minimum \u003d 1"},{"line_number":270,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":8,"id":"baada198_92b0f7fe","line":267,"in_reply_to":"baada198_c7c47663","updated":"2014-08-07 10:57:08.000000000","message":"BTW to keep things symmetric across the \u0027create\u0027 and \u0027check\u0027 modes, you could base your checks on a meter that originates from *both* polling and notifications, e.g. instance or instance.\u003cflavor\u003e.\n\nThe extra sample in that case would originate from the initial polling cycle of the restarted ceilometer compute agent.","commit_id":"947da45a478df428f090f1a197a9776686959f9c"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"7e60f8c772f284efa30e443725dcff50c44e813f","unresolved":false,"context_lines":[{"line_number":268,"context_line":"        if OPTS.mode \u003d\u003d \u0027create\u0027:"},{"line_number":269,"context_line":"            expected_sample_minimum \u003d 1"},{"line_number":270,"context_line":"        else:"},{"line_number":271,"context_line":"            expected_sample_minimum \u003d 2"},{"line_number":272,"context_line":"        LOG.info(\"checking telemetry\")"},{"line_number":273,"context_line":"        for server in self.res[\u0027servers\u0027]:"},{"line_number":274,"context_line":"            client \u003d client_for_user(server[\u0027owner\u0027])"}],"source_content_type":"text/x-python","patch_set":8,"id":"baada198_279d326d","line":271,"updated":"2014-08-07 09:04:28.000000000","message":"I\u0027d generally use a ternary in that kind of scenario ...\n\n  expected_sample_minimum \u003d 1 if OPTS.mode \u003d\u003d \u0027create\u0027 else 2","commit_id":"947da45a478df428f090f1a197a9776686959f9c"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"e9f7a7b0c087b53f79874c53f9c2c1dbf71de3c1","unresolved":false,"context_lines":[{"line_number":268,"context_line":"        if OPTS.mode \u003d\u003d \u0027create\u0027:"},{"line_number":269,"context_line":"            expected_sample_minimum \u003d 1"},{"line_number":270,"context_line":"        else:"},{"line_number":271,"context_line":"            expected_sample_minimum \u003d 2"},{"line_number":272,"context_line":"        LOG.info(\"checking telemetry\")"},{"line_number":273,"context_line":"        for server in self.res[\u0027servers\u0027]:"},{"line_number":274,"context_line":"            client \u003d client_for_user(server[\u0027owner\u0027])"}],"source_content_type":"text/x-python","patch_set":8,"id":"baada198_1c9b2074","line":271,"in_reply_to":"baada198_279d326d","updated":"2014-08-07 09:50:46.000000000","message":"ternaries are code of the devil, haven\u0027t you heard?","commit_id":"947da45a478df428f090f1a197a9776686959f9c"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"168c3f8b63620aa9db4716ddb1204d5aa54142fa","unresolved":false,"context_lines":[{"line_number":315,"context_line":"                query\u003d(\u0027metadata.display_name\u0027, \u0027eq\u0027, server[\u0027name\u0027])"},{"line_number":316,"context_line":"            )"},{"line_number":317,"context_line":"            self.assertEqual(response.status, 200)"},{"line_number":318,"context_line":"            self.assertTrue(len(body) \u003e 1, \u0027not enough samples\u0027)"},{"line_number":319,"context_line":"            # select only notifications, not pollings"},{"line_number":320,"context_line":"            for sample in body:"},{"line_number":321,"context_line":"                if \u0027event_type\u0027 not in sample[\u0027resource_metadata\u0027]:"}],"source_content_type":"text/x-python","patch_set":9,"id":"baada198_fe662e27","line":318,"updated":"2014-08-08 15:04:20.000000000","message":"Asserting len(body)\u003e1 here *before* excluding any samples with no event_type in the metadata seems to clash with the \"We confirm that there are several of these ...\" in the docstring?","commit_id":"a339bb4d33a65b5a87e974c28673156a174f42ab"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"dcf76630fc25bcd3af2bb54b5d878ae4a12e7bcb","unresolved":false,"context_lines":[{"line_number":315,"context_line":"                query\u003d(\u0027metadata.display_name\u0027, \u0027eq\u0027, server[\u0027name\u0027])"},{"line_number":316,"context_line":"            )"},{"line_number":317,"context_line":"            self.assertEqual(response.status, 200)"},{"line_number":318,"context_line":"            self.assertTrue(len(body) \u003e 1, \u0027not enough samples\u0027)"},{"line_number":319,"context_line":"            # select only notifications, not pollings"},{"line_number":320,"context_line":"            for sample in body:"},{"line_number":321,"context_line":"                if \u0027event_type\u0027 not in sample[\u0027resource_metadata\u0027]:"}],"source_content_type":"text/x-python","patch_set":9,"id":"baada198_79d4f8e9","line":318,"in_reply_to":"baada198_fe662e27","updated":"2014-08-08 15:11:05.000000000","message":"good catch, thanks","commit_id":"a339bb4d33a65b5a87e974c28673156a174f42ab"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"168c3f8b63620aa9db4716ddb1204d5aa54142fa","unresolved":false,"context_lines":[{"line_number":343,"context_line":"            self.assertTrue(len(body) \u003e 1, \u0027not enough samples\u0027)"},{"line_number":344,"context_line":""},{"line_number":345,"context_line":"            # separate pollings from notifications"},{"line_number":346,"context_line":"            pollings \u003d notifications \u003d []"},{"line_number":347,"context_line":"            for sample in body:"},{"line_number":348,"context_line":"                if \u0027event_type\u0027 not in sample[\u0027resource_metadata\u0027]:"},{"line_number":349,"context_line":"                    pollings.append(sample)"}],"source_content_type":"text/x-python","patch_set":9,"id":"baada198_3937e0e5","line":346,"updated":"2014-08-08 15:04:20.000000000","message":"Seems like that assignment pattern will set pollings and notifications to refer to the *same* empty list.\n\ne.g\n\n  \u003e\u003e\u003e a \u003d b \u003d []\n  \u003e\u003e\u003e a.append(1)\n  \u003e\u003e\u003e b.append(2)\n  \u003e\u003e\u003e a\n  [1, 2]\n  \u003e\u003e\u003e b\n  [1, 2]\n\nSo the result of the following for loop would seem to be that all samples would be contained in both the pollings and notifications lists?\n\nBetter as separate assignments:\n\n  pollings \u003d []\n  notifications \u003d []\n  for ...\n\nor even two list comprehensions:\n\n  pollings \u003d [s for s in body if \u0027event_type\u0027 not in s[\u0027resource_metadata\u0027]]\n  notifications \u003d [s for s in body if \u0027event_type\u0027 in s[\u0027resource_metadata\u0027]]","commit_id":"a339bb4d33a65b5a87e974c28673156a174f42ab"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"dcf76630fc25bcd3af2bb54b5d878ae4a12e7bcb","unresolved":false,"context_lines":[{"line_number":343,"context_line":"            self.assertTrue(len(body) \u003e 1, \u0027not enough samples\u0027)"},{"line_number":344,"context_line":""},{"line_number":345,"context_line":"            # separate pollings from notifications"},{"line_number":346,"context_line":"            pollings \u003d notifications \u003d []"},{"line_number":347,"context_line":"            for sample in body:"},{"line_number":348,"context_line":"                if \u0027event_type\u0027 not in sample[\u0027resource_metadata\u0027]:"},{"line_number":349,"context_line":"                    pollings.append(sample)"}],"source_content_type":"text/x-python","patch_set":9,"id":"baada198_190bfc7c","line":346,"in_reply_to":"baada198_3937e0e5","updated":"2014-08-08 15:11:05.000000000","message":"Whoops, you\u0027re right.\n\nI didn\u0027t, though, want to do the list comprehensions, though, because it means traversing the list twice, which seems wasteful.","commit_id":"a339bb4d33a65b5a87e974c28673156a174f42ab"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"168c3f8b63620aa9db4716ddb1204d5aa54142fa","unresolved":false,"context_lines":[{"line_number":400,"context_line":"            return datetime.datetime.strptime(time_string,"},{"line_number":401,"context_line":"                                              \u0027%Y-%m-%dT%H:%M:%S.%f\u0027)"},{"line_number":402,"context_line":"        except ValueError:"},{"line_number":403,"context_line":"            return datetime.datetime.strptime(time_string, \u0027%Y-%m-%dT%H:%M:%S\u0027)"},{"line_number":404,"context_line":""},{"line_number":405,"context_line":""},{"line_number":406,"context_line":"#######################"}],"source_content_type":"text/x-python","patch_set":9,"id":"baada198_b9e69048","line":403,"updated":"2014-08-08 15:04:20.000000000","message":"Would using the oslo timeutils be neater?\n\n  https://github.com/openstack/oslo-incubator/blob/master/openstack/common/timeutils.py#L46","commit_id":"a339bb4d33a65b5a87e974c28673156a174f42ab"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"dcf76630fc25bcd3af2bb54b5d878ae4a12e7bcb","unresolved":false,"context_lines":[{"line_number":400,"context_line":"            return datetime.datetime.strptime(time_string,"},{"line_number":401,"context_line":"                                              \u0027%Y-%m-%dT%H:%M:%S.%f\u0027)"},{"line_number":402,"context_line":"        except ValueError:"},{"line_number":403,"context_line":"            return datetime.datetime.strptime(time_string, \u0027%Y-%m-%dT%H:%M:%S\u0027)"},{"line_number":404,"context_line":""},{"line_number":405,"context_line":""},{"line_number":406,"context_line":"#######################"}],"source_content_type":"text/x-python","patch_set":9,"id":"baada198_f953a86b","line":403,"in_reply_to":"baada198_b9e69048","updated":"2014-08-08 15:11:05.000000000","message":"Based on inspecting the rest of the code (e.g tempest/auth.py) it looks like there was reluctance to using the timeutils, but I guess that\u0027s just a red herring because it is there in common, so I\u0027ll use that.","commit_id":"a339bb4d33a65b5a87e974c28673156a174f42ab"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"ea4bdc00721dc10cd727b78dbb7f495e66ac0090","unresolved":false,"context_lines":[{"line_number":374,"context_line":"            self.assertTrue(now \u003e newest_timestamp \u003e oldest_timestamp,"},{"line_number":375,"context_line":"                            \u0027timestamps have expected order\u0027)"},{"line_number":376,"context_line":"            self.assertTrue(newest_timestamp - oldest_timestamp \u003e UPGRADE_GAP,"},{"line_number":377,"context_line":"                            \u0027newest timestamp has sufficient gap from oldest\u0027)"},{"line_number":378,"context_line":"            self.assertTrue(oldest_timestamp \u003c JAVELIN_START,"},{"line_number":379,"context_line":"                            \u0027oldest timestamp comes before this run\u0027)"},{"line_number":380,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"baada198_1d5205da","line":377,"updated":"2014-08-08 16:02:54.000000000","message":"Is this condition really sufficient to deduce that the sample with newest_timestamp was received post-upgrade?\n\ne.g. we would normally have:\n\n* a group of tightly bunched instance samples corresponding to the compute.instance.* notifications on instance boot\n* followed by a gap during which the upgrade occurs\n* followed by a single post-upgrade sample created by the initial compute agent polling cycle\n\nBut is it possible that pre-shutdown-\u0026-upgrade-sequence, the compute agent\u0027s polling cycle rolls around, so that there is already a single polling-originated sample prior to the upgrade?\n\nIn which case, the \u003e15s gap could be seen between newest_timestamp \u0026 oldest_timestamp, but still newest_timestamp isn\u0027t *necessarily* from a sample that came in post-upgrade?\n\nTo be absolutely sure, would we need to actually fix an upper bound on the time during which the old cloud was running, and compare newest_timestamp against that?\n\n(e.g. by taking the modification timestamp on the database dump file)","commit_id":"b1000a82879420b06050f29861b8e254c8bcf43e"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"41f7b09a7163d1ab5607b904c35e5ec4a6ed034b","unresolved":false,"context_lines":[{"line_number":374,"context_line":"            self.assertTrue(now \u003e newest_timestamp \u003e oldest_timestamp,"},{"line_number":375,"context_line":"                            \u0027timestamps have expected order\u0027)"},{"line_number":376,"context_line":"            self.assertTrue(newest_timestamp - oldest_timestamp \u003e UPGRADE_GAP,"},{"line_number":377,"context_line":"                            \u0027newest timestamp has sufficient gap from oldest\u0027)"},{"line_number":378,"context_line":"            self.assertTrue(oldest_timestamp \u003c JAVELIN_START,"},{"line_number":379,"context_line":"                            \u0027oldest timestamp comes before this run\u0027)"},{"line_number":380,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"baada198_a051f032","line":377,"in_reply_to":"baada198_1d5205da","updated":"2014-08-08 16:39:01.000000000","message":"No, you\u0027re not being paranoid. That\u0027s exactly one of the at least two race conditions I\u0027ve been working against from the start.\n\nAccessing the dump file would work around this problem (by giving a moment in time) but I\u0027m not clear on access to the environment variables used in grenade to determine where those are saved (they are in the $SAVE_DIR which is set in grenaderc to SAVE_DIR\u003d${STACK_ROOT}/save). In other words the path is configurable, so until we get some insight from Sean or Joe or whomever on what\u0027s present in the environment I\u0027ve just been tying to push things forward.\n\nSo I reckon that\u0027s the next step, query with them.","commit_id":"b1000a82879420b06050f29861b8e254c8bcf43e"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"b63e15fcf4f963875b6476832729348694aaea36","unresolved":false,"context_lines":[{"line_number":356,"context_line":"                    if \u0027event_type\u0027 not in sample[\u0027resource_metadata\u0027]:"},{"line_number":357,"context_line":"                        pollings.append(sample)"},{"line_number":358,"context_line":"                    else:"},{"line_number":359,"context_line":"                        notifications.append(sample)"},{"line_number":360,"context_line":""},{"line_number":361,"context_line":"                LOG.debug(\u0027query count %s got sample count n:%s, p:%s\u0027,"},{"line_number":362,"context_line":"                          count, len(notifications), len(pollings))"}],"source_content_type":"text/x-python","patch_set":13,"id":"baada198_16c80674","line":359,"updated":"2014-08-10 21:47:39.000000000","message":"Would it be neater to factor lines 352-359 into a separate function, which could then also be called in place of lines 320-327?","commit_id":"b98a8d2ccd7fc69f5d33b473a9b32dec36d21437"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"4432e8c5e9851caf9c89321092923ea54b3b4cbb","unresolved":false,"context_lines":[{"line_number":356,"context_line":"                    if \u0027event_type\u0027 not in sample[\u0027resource_metadata\u0027]:"},{"line_number":357,"context_line":"                        pollings.append(sample)"},{"line_number":358,"context_line":"                    else:"},{"line_number":359,"context_line":"                        notifications.append(sample)"},{"line_number":360,"context_line":""},{"line_number":361,"context_line":"                LOG.debug(\u0027query count %s got sample count n:%s, p:%s\u0027,"},{"line_number":362,"context_line":"                          count, len(notifications), len(pollings))"}],"source_content_type":"text/x-python","patch_set":13,"id":"baada198_96917648","line":359,"in_reply_to":"baada198_16c80674","updated":"2014-08-10 21:58:52.000000000","message":"I\u0027m waiting for it to work before making it tidy. As things currently are I\u0027m needing to  use the gate as my test runner as I haven\u0027t figured out if/how to make a grenade run of my own.\n\nOnce it works I\u0027ll make it nice.","commit_id":"b98a8d2ccd7fc69f5d33b473a9b32dec36d21437"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"b63e15fcf4f963875b6476832729348694aaea36","unresolved":false,"context_lines":[{"line_number":364,"context_line":"                if len(pollings) \u003e\u003d 1:"},{"line_number":365,"context_line":"                    break"},{"line_number":366,"context_line":"                # Wait for the ceilometer compute agent to produce."},{"line_number":367,"context_line":"                time.sleep(1)"},{"line_number":368,"context_line":""},{"line_number":369,"context_line":"            self.assertTrue(len(pollings) \u003e\u003d 1, \u0027not enough pollings\u0027)"},{"line_number":370,"context_line":"            self.assertTrue(len(notifications) \u003e\u003d 1,"}],"source_content_type":"text/x-python","patch_set":13,"id":"baada198_96a336b0","line":367,"updated":"2014-08-10 21:47:39.000000000","message":"When is javelin check mode run, in relation to restarting the ceilometer services?\n\n(I had assumed that it would only be run after all the services have restarted, in which case the initial polling cycle of the ceilometer compute agent would very likely have completed before the post-upgrade javelin check is even run, but this loop more suggests that javelin check is run semi-concurrently with the upgraded agent restart)","commit_id":"b98a8d2ccd7fc69f5d33b473a9b32dec36d21437"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"4432e8c5e9851caf9c89321092923ea54b3b4cbb","unresolved":false,"context_lines":[{"line_number":364,"context_line":"                if len(pollings) \u003e\u003d 1:"},{"line_number":365,"context_line":"                    break"},{"line_number":366,"context_line":"                # Wait for the ceilometer compute agent to produce."},{"line_number":367,"context_line":"                time.sleep(1)"},{"line_number":368,"context_line":""},{"line_number":369,"context_line":"            self.assertTrue(len(pollings) \u003e\u003d 1, \u0027not enough pollings\u0027)"},{"line_number":370,"context_line":"            self.assertTrue(len(notifications) \u003e\u003d 1,"}],"source_content_type":"text/x-python","patch_set":13,"id":"baada198_f69f124f","line":367,"in_reply_to":"baada198_96a336b0","updated":"2014-08-10 21:58:52.000000000","message":"Based on my reading of the logs the ceilometer start up (after upgrade) and the check run of a javelin2 are sequential but the difference in time between the ceilo start up and the telemetry tests in javelin2 is very short _and_ the ceilo start is backgrounded or daemonized so we can\u0027t know if enough time has passed; we may need to wait.\n\nIn the previous run the tests failed because there were no polling results, so I threw this loop with delay in to test the waters. Tomorrow I can cruise the logs again and inch forward a bit more.","commit_id":"b98a8d2ccd7fc69f5d33b473a9b32dec36d21437"},{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"e851f2369be0c24ab77c4477688b535fda4592f4","unresolved":false,"context_lines":[{"line_number":391,"context_line":"        self.assertEqual(server[\u0027flavor\u0027], flavor)"},{"line_number":392,"context_line":""},{"line_number":393,"context_line":"        vcpu_count \u003d int(sample[\u0027resource_metadata\u0027][\u0027vcpus\u0027])"},{"line_number":394,"context_line":"        expected_vcpu_count \u003d 2 if \u0027medium\u0027 in flavor else 1"},{"line_number":395,"context_line":"        self.assertEqual(expected_vcpu_count, vcpu_count)"},{"line_number":396,"context_line":""},{"line_number":397,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":15,"id":"7ac7a964_952470b0","line":394,"updated":"2014-08-15 15:01:52.000000000","message":"out of curiosity, is the hardcoded value dependent on another item? if yes, any way at linking the two so it\u0027s easier to change in future?","commit_id":"62ec3e47ae19cd7b80270fb0c66738a9c0390284"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"e2d14bddb0ef222ec9e1956c72aee9c2c0d6c637","unresolved":false,"context_lines":[{"line_number":391,"context_line":"        self.assertEqual(server[\u0027flavor\u0027], flavor)"},{"line_number":392,"context_line":""},{"line_number":393,"context_line":"        vcpu_count \u003d int(sample[\u0027resource_metadata\u0027][\u0027vcpus\u0027])"},{"line_number":394,"context_line":"        expected_vcpu_count \u003d 2 if \u0027medium\u0027 in flavor else 1"},{"line_number":395,"context_line":"        self.assertEqual(expected_vcpu_count, vcpu_count)"},{"line_number":396,"context_line":""},{"line_number":397,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":15,"id":"7ac7a964_739fe9b4","line":394,"in_reply_to":"7ac7a964_952470b0","updated":"2014-08-15 16:58:36.000000000","message":"I\u0027m actually considering getting rid of this chunk as it doesn\u0027t really provide much additional value and is not resilient in the face of changes. We don\u0027t really need to check the content of samples other than to confirm that it is there, a proper response to the query and otherwise sane.\n\nMake sense?","commit_id":"62ec3e47ae19cd7b80270fb0c66738a9c0390284"}]}
