)]}'
{"shade/__init__.py":[{"author":{"_account_id":3099,"name":"David Shrewsbury","email":"dshrewsb@redhat.com","username":"dshrews"},"change_message_id":"a7565cc9f872ea34506af704c52879640d146fec","unresolved":false,"context_lines":[{"line_number":2532,"context_line":""},{"line_number":2533,"context_line":"    # --- Services (Keystone)"},{"line_number":2534,"context_line":""},{"line_number":2535,"context_line":"    @staticmethod"},{"line_number":2536,"context_line":"    def _service_to_dict(service_obj):"},{"line_number":2537,"context_line":"        # We could use to_dict(), but being explict is a bit more resilient"},{"line_number":2538,"context_line":"        # to openstack resources internal changes"}],"source_content_type":"text/x-python","patch_set":10,"id":"3acd31a7_aad50244","line":2535,"updated":"2015-04-30 19:51:29.000000000","message":"I don\u0027t agree with using this decorator here. This is intended to be a private method. I would never expect someone to call OperatorCloud._service_to_dict() (which is allowed by making it static).\n\nHowever, I think this would fit nicely next to the obj_to_dict() and warlock_to_dict() (and similar) methods in shade/meta.py. Perhaps you can move it there?","commit_id":"e1c2aa6e2945717bd3b2e8300d877b4a657dbd68"},{"author":{"_account_id":6550,"name":"Davide Guerri","email":"davide.guerri@gmail.com","username":"davide-guerri"},"change_message_id":"fdf384942b1178cfd4bc9125d9ece125d9de7c55","unresolved":false,"context_lines":[{"line_number":2532,"context_line":""},{"line_number":2533,"context_line":"    # --- Services (Keystone)"},{"line_number":2534,"context_line":""},{"line_number":2535,"context_line":"    @staticmethod"},{"line_number":2536,"context_line":"    def _service_to_dict(service_obj):"},{"line_number":2537,"context_line":"        # We could use to_dict(), but being explict is a bit more resilient"},{"line_number":2538,"context_line":"        # to openstack resources internal changes"}],"source_content_type":"text/x-python","patch_set":10,"id":"3acd31a7_3f836b58","line":2535,"in_reply_to":"3acd31a7_aad50244","updated":"2015-04-30 22:28:46.000000000","message":"Done.\nNeed to get more into the existing code...","commit_id":"e1c2aa6e2945717bd3b2e8300d877b4a657dbd68"},{"author":{"_account_id":3099,"name":"David Shrewsbury","email":"dshrewsb@redhat.com","username":"dshrews"},"change_message_id":"a7565cc9f872ea34506af704c52879640d146fec","unresolved":false,"context_lines":[{"line_number":2550,"context_line":"        :param name: Service name"},{"line_number":2551,"context_line":"        :param service_type: Service type"},{"line_number":2552,"context_line":"        :param description: Service description (optional)"},{"line_number":2553,"context_line":"        :return: a dict with the service description:"},{"line_number":2554,"context_line":"            {"},{"line_number":2555,"context_line":"                \u0027id\u0027: s.id,"},{"line_number":2556,"context_line":"                \u0027name\u0027: s.name,"}],"source_content_type":"text/x-python","patch_set":10,"id":"3acd31a7_652b9b31","line":2553,"updated":"2015-04-30 19:51:29.000000000","message":"This return example will not render correctly unless the text is on a separate line and you use :: after \u0027description\u0027 and have a blank line between the text and example, and after the example. Like (hope gerrit doesn\u0027t mess this formatting up):\n\n        :return:\n            A dict with the service description::\n\n                {\n                    \u0027id\u0027: s.id,\n                    \u0027name\u0027: s.name,\n                    \u0027service_type\u0027: s.type,\n                    \u0027description\u0027: s.description\n                }","commit_id":"e1c2aa6e2945717bd3b2e8300d877b4a657dbd68"},{"author":{"_account_id":6550,"name":"Davide Guerri","email":"davide.guerri@gmail.com","username":"davide-guerri"},"change_message_id":"fdf384942b1178cfd4bc9125d9ece125d9de7c55","unresolved":false,"context_lines":[{"line_number":2550,"context_line":"        :param name: Service name"},{"line_number":2551,"context_line":"        :param service_type: Service type"},{"line_number":2552,"context_line":"        :param description: Service description (optional)"},{"line_number":2553,"context_line":"        :return: a dict with the service description:"},{"line_number":2554,"context_line":"            {"},{"line_number":2555,"context_line":"                \u0027id\u0027: s.id,"},{"line_number":2556,"context_line":"                \u0027name\u0027: s.name,"}],"source_content_type":"text/x-python","patch_set":10,"id":"3acd31a7_1f866f65","line":2553,"in_reply_to":"3acd31a7_652b9b31","updated":"2015-04-30 22:28:46.000000000","message":"Done","commit_id":"e1c2aa6e2945717bd3b2e8300d877b4a657dbd68"},{"author":{"_account_id":3099,"name":"David Shrewsbury","email":"dshrewsb@redhat.com","username":"dshrews"},"change_message_id":"a7565cc9f872ea34506af704c52879640d146fec","unresolved":false,"context_lines":[{"line_number":2558,"context_line":"                \u0027description\u0027: s.description"},{"line_number":2559,"context_line":"            }"},{"line_number":2560,"context_line":"        :raise OpenStackCloudException: if something goes wrong during the"},{"line_number":2561,"context_line":"        openstack API call"},{"line_number":2562,"context_line":""},{"line_number":2563,"context_line":"        \"\"\""},{"line_number":2564,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":10,"id":"3acd31a7_45a41fa5","line":2561,"updated":"2015-04-30 19:51:29.000000000","message":"This will generate a sphinx warning (and improperly rendered text) unless the continuation line of the description is indented.\n\n        :raise OpenStackCloudException: if something goes wrong during the\n            openstack API call","commit_id":"e1c2aa6e2945717bd3b2e8300d877b4a657dbd68"},{"author":{"_account_id":6550,"name":"Davide Guerri","email":"davide.guerri@gmail.com","username":"davide-guerri"},"change_message_id":"fdf384942b1178cfd4bc9125d9ece125d9de7c55","unresolved":false,"context_lines":[{"line_number":2558,"context_line":"                \u0027description\u0027: s.description"},{"line_number":2559,"context_line":"            }"},{"line_number":2560,"context_line":"        :raise OpenStackCloudException: if something goes wrong during the"},{"line_number":2561,"context_line":"        openstack API call"},{"line_number":2562,"context_line":""},{"line_number":2563,"context_line":"        \"\"\""},{"line_number":2564,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":10,"id":"3acd31a7_ff7cd373","line":2561,"in_reply_to":"3acd31a7_45a41fa5","updated":"2015-04-30 22:28:46.000000000","message":"Done","commit_id":"e1c2aa6e2945717bd3b2e8300d877b4a657dbd68"},{"author":{"_account_id":3099,"name":"David Shrewsbury","email":"dshrewsb@redhat.com","username":"dshrews"},"change_message_id":"a7565cc9f872ea34506af704c52879640d146fec","unresolved":false,"context_lines":[{"line_number":2576,"context_line":"        \"\"\""},{"line_number":2577,"context_line":"        List Keystone services"},{"line_number":2578,"context_line":""},{"line_number":2579,"context_line":"        :return: a list of dict containing the services description:"},{"line_number":2580,"context_line":"            {"},{"line_number":2581,"context_line":"                \u0027id\u0027: s.id,"},{"line_number":2582,"context_line":"                \u0027name\u0027: s.name,"}],"source_content_type":"text/x-python","patch_set":10,"id":"3acd31a7_c5b6efdb","line":2579,"updated":"2015-04-30 19:51:29.000000000","message":"Ditto about rendering.","commit_id":"e1c2aa6e2945717bd3b2e8300d877b4a657dbd68"},{"author":{"_account_id":6550,"name":"Davide Guerri","email":"davide.guerri@gmail.com","username":"davide-guerri"},"change_message_id":"fdf384942b1178cfd4bc9125d9ece125d9de7c55","unresolved":false,"context_lines":[{"line_number":2576,"context_line":"        \"\"\""},{"line_number":2577,"context_line":"        List Keystone services"},{"line_number":2578,"context_line":""},{"line_number":2579,"context_line":"        :return: a list of dict containing the services description:"},{"line_number":2580,"context_line":"            {"},{"line_number":2581,"context_line":"                \u0027id\u0027: s.id,"},{"line_number":2582,"context_line":"                \u0027name\u0027: s.name,"}],"source_content_type":"text/x-python","patch_set":10,"id":"3acd31a7_df7fd764","line":2579,"in_reply_to":"3acd31a7_c5b6efdb","updated":"2015-04-30 22:28:46.000000000","message":"Done","commit_id":"e1c2aa6e2945717bd3b2e8300d877b4a657dbd68"},{"author":{"_account_id":3099,"name":"David Shrewsbury","email":"dshrewsb@redhat.com","username":"dshrews"},"change_message_id":"a7565cc9f872ea34506af704c52879640d146fec","unresolved":false,"context_lines":[{"line_number":2584,"context_line":"                \u0027description\u0027: s.description"},{"line_number":2585,"context_line":"            }"},{"line_number":2586,"context_line":"        :raise OpenStackCloudException: if something goes wrong during the"},{"line_number":2587,"context_line":"        openstack API call"},{"line_number":2588,"context_line":"        \"\"\""},{"line_number":2589,"context_line":"        try:"},{"line_number":2590,"context_line":"            services \u003d self.manager.submitTask(_tasks.ServiceList())"}],"source_content_type":"text/x-python","patch_set":10,"id":"3acd31a7_a5bbf3c3","line":2587,"updated":"2015-04-30 19:51:29.000000000","message":"Indent continuation line.","commit_id":"e1c2aa6e2945717bd3b2e8300d877b4a657dbd68"},{"author":{"_account_id":6550,"name":"Davide Guerri","email":"davide.guerri@gmail.com","username":"davide-guerri"},"change_message_id":"fdf384942b1178cfd4bc9125d9ece125d9de7c55","unresolved":false,"context_lines":[{"line_number":2584,"context_line":"                \u0027description\u0027: s.description"},{"line_number":2585,"context_line":"            }"},{"line_number":2586,"context_line":"        :raise OpenStackCloudException: if something goes wrong during the"},{"line_number":2587,"context_line":"        openstack API call"},{"line_number":2588,"context_line":"        \"\"\""},{"line_number":2589,"context_line":"        try:"},{"line_number":2590,"context_line":"            services \u003d self.manager.submitTask(_tasks.ServiceList())"}],"source_content_type":"text/x-python","patch_set":10,"id":"3acd31a7_9f927f9e","line":2587,"in_reply_to":"3acd31a7_a5bbf3c3","updated":"2015-04-30 22:28:46.000000000","message":"Done","commit_id":"e1c2aa6e2945717bd3b2e8300d877b4a657dbd68"},{"author":{"_account_id":3099,"name":"David Shrewsbury","email":"dshrewsb@redhat.com","username":"dshrews"},"change_message_id":"a7565cc9f872ea34506af704c52879640d146fec","unresolved":false,"context_lines":[{"line_number":2607,"context_line":"        :param name_or_id: Service name or id"},{"line_number":2608,"context_line":"        :return: nothing"},{"line_number":2609,"context_line":"        :raise OpenStackCloudException: if the service cannot be"},{"line_number":2610,"context_line":"        found or if something goes wrong during the openstack API call"},{"line_number":2611,"context_line":"        \"\"\""},{"line_number":2612,"context_line":"        service \u003d self.get_service(name_or_id\u003dname_or_id)"},{"line_number":2613,"context_line":"        if service is None:"}],"source_content_type":"text/x-python","patch_set":10,"id":"3acd31a7_05c5073b","line":2610,"updated":"2015-04-30 19:51:29.000000000","message":"Indent continuation line.","commit_id":"e1c2aa6e2945717bd3b2e8300d877b4a657dbd68"},{"author":{"_account_id":6550,"name":"Davide Guerri","email":"davide.guerri@gmail.com","username":"davide-guerri"},"change_message_id":"fdf384942b1178cfd4bc9125d9ece125d9de7c55","unresolved":false,"context_lines":[{"line_number":2607,"context_line":"        :param name_or_id: Service name or id"},{"line_number":2608,"context_line":"        :return: nothing"},{"line_number":2609,"context_line":"        :raise OpenStackCloudException: if the service cannot be"},{"line_number":2610,"context_line":"        found or if something goes wrong during the openstack API call"},{"line_number":2611,"context_line":"        \"\"\""},{"line_number":2612,"context_line":"        service \u003d self.get_service(name_or_id\u003dname_or_id)"},{"line_number":2613,"context_line":"        if service is None:"}],"source_content_type":"text/x-python","patch_set":10,"id":"3acd31a7_5f8ce77e","line":2610,"in_reply_to":"3acd31a7_05c5073b","updated":"2015-04-30 22:28:46.000000000","message":"Done","commit_id":"e1c2aa6e2945717bd3b2e8300d877b4a657dbd68"},{"author":{"_account_id":3099,"name":"David Shrewsbury","email":"dshrewsb@redhat.com","username":"dshrews"},"change_message_id":"a7565cc9f872ea34506af704c52879640d146fec","unresolved":false,"context_lines":[{"line_number":2609,"context_line":"        :raise OpenStackCloudException: if the service cannot be"},{"line_number":2610,"context_line":"        found or if something goes wrong during the openstack API call"},{"line_number":2611,"context_line":"        \"\"\""},{"line_number":2612,"context_line":"        service \u003d self.get_service(name_or_id\u003dname_or_id)"},{"line_number":2613,"context_line":"        if service is None:"},{"line_number":2614,"context_line":"            raise OpenStackCloudException(\"service {service} not found\".format("},{"line_number":2615,"context_line":"                service\u003dname_or_id))"}],"source_content_type":"text/x-python","patch_set":10,"id":"3acd31a7_e51d6bbe","line":2612,"updated":"2015-04-30 19:51:29.000000000","message":"nit: Using the argument name is not necessary. Cleaner and more consistent with other uses without it.","commit_id":"e1c2aa6e2945717bd3b2e8300d877b4a657dbd68"},{"author":{"_account_id":3099,"name":"David Shrewsbury","email":"dshrewsb@redhat.com","username":"dshrews"},"change_message_id":"a7565cc9f872ea34506af704c52879640d146fec","unresolved":false,"context_lines":[{"line_number":2623,"context_line":""},{"line_number":2624,"context_line":"    # --- Endpoints (Keystone)"},{"line_number":2625,"context_line":""},{"line_number":2626,"context_line":"    @staticmethod"},{"line_number":2627,"context_line":"    def _endpoint_to_dict(endpoint_obj):"},{"line_number":2628,"context_line":"        # We could use to_dict(), but being explict is a bit more resilient"},{"line_number":2629,"context_line":"        # to openstack resources internal changes"}],"source_content_type":"text/x-python","patch_set":10,"id":"3acd31a7_6ab92ae9","line":2626,"updated":"2015-04-30 19:51:29.000000000","message":"Ditto for the _service_to_dict() argument I made.","commit_id":"e1c2aa6e2945717bd3b2e8300d877b4a657dbd68"},{"author":{"_account_id":6550,"name":"Davide Guerri","email":"davide.guerri@gmail.com","username":"davide-guerri"},"change_message_id":"fdf384942b1178cfd4bc9125d9ece125d9de7c55","unresolved":false,"context_lines":[{"line_number":2623,"context_line":""},{"line_number":2624,"context_line":"    # --- Endpoints (Keystone)"},{"line_number":2625,"context_line":""},{"line_number":2626,"context_line":"    @staticmethod"},{"line_number":2627,"context_line":"    def _endpoint_to_dict(endpoint_obj):"},{"line_number":2628,"context_line":"        # We could use to_dict(), but being explict is a bit more resilient"},{"line_number":2629,"context_line":"        # to openstack resources internal changes"}],"source_content_type":"text/x-python","patch_set":10,"id":"3acd31a7_9fd95f86","line":2626,"in_reply_to":"3acd31a7_6ab92ae9","updated":"2015-04-30 22:28:46.000000000","message":"Done","commit_id":"e1c2aa6e2945717bd3b2e8300d877b4a657dbd68"},{"author":{"_account_id":3099,"name":"David Shrewsbury","email":"dshrewsb@redhat.com","username":"dshrews"},"change_message_id":"a7565cc9f872ea34506af704c52879640d146fec","unresolved":false,"context_lines":[{"line_number":2646,"context_line":"        :param internal_url: Endpoint internal URL"},{"line_number":2647,"context_line":"        :param admin_url: Endpoint admin URL"},{"line_number":2648,"context_line":"        :param region: Endpoint region"},{"line_number":2649,"context_line":"        :return: a dict with the endpoint description:"},{"line_number":2650,"context_line":"            {"},{"line_number":2651,"context_line":"                \u0027id\u0027: e.id,"},{"line_number":2652,"context_line":"                \u0027region\u0027: e.region,"}],"source_content_type":"text/x-python","patch_set":10,"id":"3acd31a7_a5e2d3d3","line":2649,"updated":"2015-04-30 19:51:29.000000000","message":"Ditto.","commit_id":"e1c2aa6e2945717bd3b2e8300d877b4a657dbd68"},{"author":{"_account_id":6550,"name":"Davide Guerri","email":"davide.guerri@gmail.com","username":"davide-guerri"},"change_message_id":"fdf384942b1178cfd4bc9125d9ece125d9de7c55","unresolved":false,"context_lines":[{"line_number":2646,"context_line":"        :param internal_url: Endpoint internal URL"},{"line_number":2647,"context_line":"        :param admin_url: Endpoint admin URL"},{"line_number":2648,"context_line":"        :param region: Endpoint region"},{"line_number":2649,"context_line":"        :return: a dict with the endpoint description:"},{"line_number":2650,"context_line":"            {"},{"line_number":2651,"context_line":"                \u0027id\u0027: e.id,"},{"line_number":2652,"context_line":"                \u0027region\u0027: e.region,"}],"source_content_type":"text/x-python","patch_set":10,"id":"3acd31a7_7fe8c310","line":2649,"in_reply_to":"3acd31a7_a5e2d3d3","updated":"2015-04-30 22:28:46.000000000","message":"Done","commit_id":"e1c2aa6e2945717bd3b2e8300d877b4a657dbd68"},{"author":{"_account_id":3099,"name":"David Shrewsbury","email":"dshrewsb@redhat.com","username":"dshrews"},"change_message_id":"a7565cc9f872ea34506af704c52879640d146fec","unresolved":false,"context_lines":[{"line_number":2655,"context_line":"                \u0027admin_url\u0027: e.adminurl"},{"line_number":2656,"context_line":"            }"},{"line_number":2657,"context_line":"        :raise OpenStackCloudException: if the service cannot be found or if"},{"line_number":2658,"context_line":"        something goes wrong during the openstack API call"},{"line_number":2659,"context_line":"        \"\"\""},{"line_number":2660,"context_line":"        # ToDo: support v3 api (dguerri)"},{"line_number":2661,"context_line":"        service \u003d self.get_service(name_or_id\u003dservice_name_or_id)"}],"source_content_type":"text/x-python","patch_set":10,"id":"3acd31a7_65ecbbc7","line":2658,"updated":"2015-04-30 19:51:29.000000000","message":"Indent continuation line.","commit_id":"e1c2aa6e2945717bd3b2e8300d877b4a657dbd68"},{"author":{"_account_id":6550,"name":"Davide Guerri","email":"davide.guerri@gmail.com","username":"davide-guerri"},"change_message_id":"fdf384942b1178cfd4bc9125d9ece125d9de7c55","unresolved":false,"context_lines":[{"line_number":2655,"context_line":"                \u0027admin_url\u0027: e.adminurl"},{"line_number":2656,"context_line":"            }"},{"line_number":2657,"context_line":"        :raise OpenStackCloudException: if the service cannot be found or if"},{"line_number":2658,"context_line":"        something goes wrong during the openstack API call"},{"line_number":2659,"context_line":"        \"\"\""},{"line_number":2660,"context_line":"        # ToDo: support v3 api (dguerri)"},{"line_number":2661,"context_line":"        service \u003d self.get_service(name_or_id\u003dservice_name_or_id)"}],"source_content_type":"text/x-python","patch_set":10,"id":"3acd31a7_5fe3c733","line":2658,"in_reply_to":"3acd31a7_65ecbbc7","updated":"2015-04-30 22:28:46.000000000","message":"Done","commit_id":"e1c2aa6e2945717bd3b2e8300d877b4a657dbd68"},{"author":{"_account_id":3099,"name":"David Shrewsbury","email":"dshrewsb@redhat.com","username":"dshrews"},"change_message_id":"a7565cc9f872ea34506af704c52879640d146fec","unresolved":false,"context_lines":[{"line_number":2681,"context_line":"        \"\"\""},{"line_number":2682,"context_line":"        List Keystone endpoints"},{"line_number":2683,"context_line":""},{"line_number":2684,"context_line":"        :return: a list of dict containing the endpoint description:"},{"line_number":2685,"context_line":"            {"},{"line_number":2686,"context_line":"                \u0027id\u0027: e.id,"},{"line_number":2687,"context_line":"                \u0027region\u0027: e.region,"}],"source_content_type":"text/x-python","patch_set":10,"id":"3acd31a7_05dce710","line":2684,"updated":"2015-04-30 19:51:29.000000000","message":"Ditto.","commit_id":"e1c2aa6e2945717bd3b2e8300d877b4a657dbd68"},{"author":{"_account_id":6550,"name":"Davide Guerri","email":"davide.guerri@gmail.com","username":"davide-guerri"},"change_message_id":"fdf384942b1178cfd4bc9125d9ece125d9de7c55","unresolved":false,"context_lines":[{"line_number":2681,"context_line":"        \"\"\""},{"line_number":2682,"context_line":"        List Keystone endpoints"},{"line_number":2683,"context_line":""},{"line_number":2684,"context_line":"        :return: a list of dict containing the endpoint description:"},{"line_number":2685,"context_line":"            {"},{"line_number":2686,"context_line":"                \u0027id\u0027: e.id,"},{"line_number":2687,"context_line":"                \u0027region\u0027: e.region,"}],"source_content_type":"text/x-python","patch_set":10,"id":"3acd31a7_3fd12b58","line":2684,"in_reply_to":"3acd31a7_05dce710","updated":"2015-04-30 22:28:46.000000000","message":"Done","commit_id":"e1c2aa6e2945717bd3b2e8300d877b4a657dbd68"},{"author":{"_account_id":3099,"name":"David Shrewsbury","email":"dshrewsb@redhat.com","username":"dshrews"},"change_message_id":"a7565cc9f872ea34506af704c52879640d146fec","unresolved":false,"context_lines":[{"line_number":2690,"context_line":"                \u0027admin_url\u0027: e.adminurl"},{"line_number":2691,"context_line":"            }"},{"line_number":2692,"context_line":"        :raise OpenStackCloudException: if something goes wrong during the"},{"line_number":2693,"context_line":"        openstack API call"},{"line_number":2694,"context_line":"        \"\"\""},{"line_number":2695,"context_line":"        # ToDo: support v3 api (dguerri)"},{"line_number":2696,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":10,"id":"3acd31a7_a509b397","line":2693,"updated":"2015-04-30 19:51:29.000000000","message":"Indent continuation line.","commit_id":"e1c2aa6e2945717bd3b2e8300d877b4a657dbd68"},{"author":{"_account_id":6550,"name":"Davide Guerri","email":"davide.guerri@gmail.com","username":"davide-guerri"},"change_message_id":"fdf384942b1178cfd4bc9125d9ece125d9de7c55","unresolved":false,"context_lines":[{"line_number":2690,"context_line":"                \u0027admin_url\u0027: e.adminurl"},{"line_number":2691,"context_line":"            }"},{"line_number":2692,"context_line":"        :raise OpenStackCloudException: if something goes wrong during the"},{"line_number":2693,"context_line":"        openstack API call"},{"line_number":2694,"context_line":"        \"\"\""},{"line_number":2695,"context_line":"        # ToDo: support v3 api (dguerri)"},{"line_number":2696,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":10,"id":"3acd31a7_1fd42f45","line":2693,"in_reply_to":"3acd31a7_a509b397","updated":"2015-04-30 22:28:46.000000000","message":"Done","commit_id":"e1c2aa6e2945717bd3b2e8300d877b4a657dbd68"},{"author":{"_account_id":3099,"name":"David Shrewsbury","email":"dshrewsb@redhat.com","username":"dshrews"},"change_message_id":"a7565cc9f872ea34506af704c52879640d146fec","unresolved":false,"context_lines":[{"line_number":2714,"context_line":"        :param id: Id of the endpoint to delete"},{"line_number":2715,"context_line":"        :return: nothing"},{"line_number":2716,"context_line":"        :raise OpenStackCloudException: if the endpoint is not found or if"},{"line_number":2717,"context_line":"        something goes wrong during the openstack API call"},{"line_number":2718,"context_line":"        \"\"\""},{"line_number":2719,"context_line":"        # ToDo: support v3 api (dguerri)"},{"line_number":2720,"context_line":"        endpoint \u003d self.get_endpoint(id\u003did)"}],"source_content_type":"text/x-python","patch_set":10,"id":"3acd31a7_65039b74","line":2717,"updated":"2015-04-30 19:51:29.000000000","message":"Indent continuation line.","commit_id":"e1c2aa6e2945717bd3b2e8300d877b4a657dbd68"},{"author":{"_account_id":6550,"name":"Davide Guerri","email":"davide.guerri@gmail.com","username":"davide-guerri"},"change_message_id":"fdf384942b1178cfd4bc9125d9ece125d9de7c55","unresolved":false,"context_lines":[{"line_number":2714,"context_line":"        :param id: Id of the endpoint to delete"},{"line_number":2715,"context_line":"        :return: nothing"},{"line_number":2716,"context_line":"        :raise OpenStackCloudException: if the endpoint is not found or if"},{"line_number":2717,"context_line":"        something goes wrong during the openstack API call"},{"line_number":2718,"context_line":"        \"\"\""},{"line_number":2719,"context_line":"        # ToDo: support v3 api (dguerri)"},{"line_number":2720,"context_line":"        endpoint \u003d self.get_endpoint(id\u003did)"}],"source_content_type":"text/x-python","patch_set":10,"id":"3acd31a7_ffca93a0","line":2717,"in_reply_to":"3acd31a7_65039b74","updated":"2015-04-30 22:28:46.000000000","message":"Done","commit_id":"e1c2aa6e2945717bd3b2e8300d877b4a657dbd68"},{"author":{"_account_id":3099,"name":"David Shrewsbury","email":"dshrewsb@redhat.com","username":"dshrews"},"change_message_id":"a7565cc9f872ea34506af704c52879640d146fec","unresolved":false,"context_lines":[{"line_number":2717,"context_line":"        something goes wrong during the openstack API call"},{"line_number":2718,"context_line":"        \"\"\""},{"line_number":2719,"context_line":"        # ToDo: support v3 api (dguerri)"},{"line_number":2720,"context_line":"        endpoint \u003d self.get_endpoint(id\u003did)"},{"line_number":2721,"context_line":"        if endpoint is None:"},{"line_number":2722,"context_line":"            raise OpenStackCloudException("},{"line_number":2723,"context_line":"                \"endpoint {endpoint} not found\".format(endpoint\u003did))"}],"source_content_type":"text/x-python","patch_set":10,"id":"3acd31a7_65a4bb56","line":2720,"updated":"2015-04-30 19:51:29.000000000","message":"Just: self.get_endpoint(id)","commit_id":"e1c2aa6e2945717bd3b2e8300d877b4a657dbd68"},{"author":{"_account_id":6488,"name":"Clint Byrum","email":"clint@fewbar.com","username":"clint-fewbar"},"change_message_id":"336531616dc630da84e675f601e64730d82290bc","unresolved":false,"context_lines":[{"line_number":2812,"context_line":""},{"line_number":2813,"context_line":"        :param name_or_id: Service name or id."},{"line_number":2814,"context_line":""},{"line_number":2815,"context_line":"        :returns: nothing"},{"line_number":2816,"context_line":""},{"line_number":2817,"context_line":"        :raises: ``OpenStackCloudException`` if the service cannot be"},{"line_number":2818,"context_line":"            found or if something goes wrong during the openstack API call"}],"source_content_type":"text/x-python","patch_set":18,"id":"3acd31a7_717bf628","line":2815,"updated":"2015-05-05 18:00:15.000000000","message":"Technically \"None\" would be more accurate. #notaminusone","commit_id":"db26f68c7e1de397068e32e2b3b812ab927c52c9"},{"author":{"_account_id":6488,"name":"Clint Byrum","email":"clint@fewbar.com","username":"clint-fewbar"},"change_message_id":"2b3e47dc2ce298bfb9950e59c10b0d7afc81394f","unresolved":false,"context_lines":[{"line_number":2836,"context_line":"        \"\"\""},{"line_number":2837,"context_line":"        service \u003d self.get_service(name_or_id\u003dname_or_id)"},{"line_number":2838,"context_line":"        if service is None:"},{"line_number":2839,"context_line":"            raise OpenStackCloudException(\"service {service} not found\".format("},{"line_number":2840,"context_line":"                service\u003dname_or_id))"},{"line_number":2841,"context_line":"        try:"},{"line_number":2842,"context_line":"            self.manager.submitTask(_tasks.ServiceDelete(id\u003dservice[\u0027id\u0027]))"}],"source_content_type":"text/x-python","patch_set":25,"id":"9a0c5dc1_b63b04eb","line":2839,"updated":"2015-05-13 17:34:02.000000000","message":"This is inconsistent with other delete methods. If we can\u0027t find the requested item, we just return.","commit_id":"9e95598435e8a54b8d333e78a4358ead68f54b9f"},{"author":{"_account_id":6550,"name":"Davide Guerri","email":"davide.guerri@gmail.com","username":"davide-guerri"},"change_message_id":"5ed8ecfd8714ede0a5f608fa86bb679df3b69e36","unresolved":false,"context_lines":[{"line_number":2836,"context_line":"        \"\"\""},{"line_number":2837,"context_line":"        service \u003d self.get_service(name_or_id\u003dname_or_id)"},{"line_number":2838,"context_line":"        if service is None:"},{"line_number":2839,"context_line":"            raise OpenStackCloudException(\"service {service} not found\".format("},{"line_number":2840,"context_line":"                service\u003dname_or_id))"},{"line_number":2841,"context_line":"        try:"},{"line_number":2842,"context_line":"            self.manager.submitTask(_tasks.ServiceDelete(id\u003dservice[\u0027id\u0027]))"}],"source_content_type":"text/x-python","patch_set":25,"id":"9a0c5dc1_43a9a77a","line":2839,"in_reply_to":"9a0c5dc1_b63b04eb","updated":"2015-05-13 19:09:49.000000000","message":"this is exactly what we are doing in the methods like delete_subnet or delete_network","commit_id":"9e95598435e8a54b8d333e78a4358ead68f54b9f"},{"author":{"_account_id":6488,"name":"Clint Byrum","email":"clint@fewbar.com","username":"clint-fewbar"},"change_message_id":"2b3e47dc2ce298bfb9950e59c10b0d7afc81394f","unresolved":false,"context_lines":[{"line_number":2840,"context_line":"                service\u003dname_or_id))"},{"line_number":2841,"context_line":"        try:"},{"line_number":2842,"context_line":"            self.manager.submitTask(_tasks.ServiceDelete(id\u003dservice[\u0027id\u0027]))"},{"line_number":2843,"context_line":"        except Exception as e:"},{"line_number":2844,"context_line":"            self.log.debug("},{"line_number":2845,"context_line":"                \"Failed to delete service {id}\".format(id\u003dservice[\u0027id\u0027]),"},{"line_number":2846,"context_line":"                exc_info\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":25,"id":"9a0c5dc1_963ec0d8","line":2843,"updated":"2015-05-13 17:34:02.000000000","message":"Likewise, we want to special-case NotFound errors and just return, since that means it\u0027s already gone, which is what the user wanted.","commit_id":"9e95598435e8a54b8d333e78a4358ead68f54b9f"},{"author":{"_account_id":6550,"name":"Davide Guerri","email":"davide.guerri@gmail.com","username":"davide-guerri"},"change_message_id":"5ed8ecfd8714ede0a5f608fa86bb679df3b69e36","unresolved":false,"context_lines":[{"line_number":2840,"context_line":"                service\u003dname_or_id))"},{"line_number":2841,"context_line":"        try:"},{"line_number":2842,"context_line":"            self.manager.submitTask(_tasks.ServiceDelete(id\u003dservice[\u0027id\u0027]))"},{"line_number":2843,"context_line":"        except Exception as e:"},{"line_number":2844,"context_line":"            self.log.debug("},{"line_number":2845,"context_line":"                \"Failed to delete service {id}\".format(id\u003dservice[\u0027id\u0027]),"},{"line_number":2846,"context_line":"                exc_info\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":25,"id":"9a0c5dc1_e3b09bdf","line":2843,"in_reply_to":"9a0c5dc1_963ec0d8","updated":"2015-05-13 19:09:49.000000000","message":"idem","commit_id":"9e95598435e8a54b8d333e78a4358ead68f54b9f"},{"author":{"_account_id":6488,"name":"Clint Byrum","email":"clint@fewbar.com","username":"clint-fewbar"},"change_message_id":"492550e5742e9708db3f0622967b10f8d4c7434a","unresolved":false,"context_lines":[{"line_number":2878,"context_line":"                exc_info\u003dTrue)"},{"line_number":2879,"context_line":"            raise OpenStackCloudException(str(e))"},{"line_number":2880,"context_line":"        return meta.obj_to_dict(service)"},{"line_number":2881,"context_line":""},{"line_number":2882,"context_line":"    def list_services(self):"},{"line_number":2883,"context_line":"        \"\"\"List all Keystone services."},{"line_number":2884,"context_line":""}],"source_content_type":"text/x-python","patch_set":30,"id":"5afe65bd_39a36551","line":2881,"updated":"2015-06-03 23:49:05.000000000","message":"This one would probably be a good candidate for caching, but not important to do right away.","commit_id":"7e2d698babeffbca543cc314e0385e3beedf260e"}],"shade/meta.py":[{"author":{"_account_id":6550,"name":"Davide Guerri","email":"davide.guerri@gmail.com","username":"davide-guerri"},"change_message_id":"ef24e7f407df3a5997e168ad051ca4a465c7fa80","unresolved":false,"context_lines":[{"line_number":190,"context_line":"    :param service_obj: a Service object."},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"    :return: a dict containing the service description. i.e. a dict with the"},{"line_number":193,"context_line":"        following attributes::"},{"line_number":194,"context_line":"            - id: \u003cservice id\u003e"},{"line_number":195,"context_line":"            - name: \u003cservice name\u003e"},{"line_number":196,"context_line":"            - service_type: \u003cservice type\u003e"}],"source_content_type":"text/x-python","patch_set":13,"id":"3acd31a7_df09fa2d","line":193,"updated":"2015-05-02 10:59:11.000000000","message":"RFC: do you think this is a good approach?\nOr shall we just use obj_to_dict?","commit_id":"ac72370b5ab4c5121234164d7a4b355b5a95e83f"}],"shade/tests/functional/test_endpoints.py":[{"author":{"_account_id":3099,"name":"David Shrewsbury","email":"dshrewsb@redhat.com","username":"dshrews"},"change_message_id":"a7565cc9f872ea34506af704c52879640d146fec","unresolved":false,"context_lines":[{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    def test_create_endpoint(self):"},{"line_number":49,"context_line":"        self.addCleanup(self._cleanup_services)"},{"line_number":50,"context_line":"        self.addCleanup(self._cleanup_endpoints)"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"        service \u003d self.operator_cloud.create_service("},{"line_number":53,"context_line":"            name\u003d\u0027test_service\u0027, service_type\u003d\u0027test_type\u0027,"}],"source_content_type":"text/x-python","patch_set":10,"id":"3acd31a7_e5a7ab4d","line":50,"updated":"2015-04-30 19:51:29.000000000","message":"Looks like the addCleanup() calls should be moved to setUp() since they are needed for every test.","commit_id":"e1c2aa6e2945717bd3b2e8300d877b4a657dbd68"},{"author":{"_account_id":6550,"name":"Davide Guerri","email":"davide.guerri@gmail.com","username":"davide-guerri"},"change_message_id":"fdf384942b1178cfd4bc9125d9ece125d9de7c55","unresolved":false,"context_lines":[{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    def test_create_endpoint(self):"},{"line_number":49,"context_line":"        self.addCleanup(self._cleanup_services)"},{"line_number":50,"context_line":"        self.addCleanup(self._cleanup_endpoints)"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"        service \u003d self.operator_cloud.create_service("},{"line_number":53,"context_line":"            name\u003d\u0027test_service\u0027, service_type\u003d\u0027test_type\u0027,"}],"source_content_type":"text/x-python","patch_set":10,"id":"3acd31a7_1f9f8fb5","line":50,"in_reply_to":"3acd31a7_e5a7ab4d","updated":"2015-04-30 22:28:46.000000000","message":"Done","commit_id":"e1c2aa6e2945717bd3b2e8300d877b4a657dbd68"},{"author":{"_account_id":6488,"name":"Clint Byrum","email":"clint@fewbar.com","username":"clint-fewbar"},"change_message_id":"336531616dc630da84e675f601e64730d82290bc","unresolved":false,"context_lines":[{"line_number":54,"context_line":"            description\u003d\u0027this is a test description\u0027)"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"        endpoint \u003d self.operator_cloud.create_endpoint("},{"line_number":57,"context_line":"            service_name_or_id\u003dservice[\u0027id\u0027], public_url\u003d\u0027http://public.url/\u0027,"},{"line_number":58,"context_line":"            internal_url\u003d\u0027http://internal_url/\u0027,"},{"line_number":59,"context_line":"            admin_url\u003d\u0027http://admin.url/\u0027, region\u003d\u0027test_region\u0027)"},{"line_number":60,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"3acd31a7_917e9217","line":57,"updated":"2015-05-05 18:00:15.000000000","message":"Highly recommend using RFC2606 compliant test urls: .test, .example, .invalid, .localhost","commit_id":"db26f68c7e1de397068e32e2b3b812ab927c52c9"}],"shade/tests/functional/test_services.py":[{"author":{"_account_id":3099,"name":"David Shrewsbury","email":"dshrewsb@redhat.com","username":"dshrews"},"change_message_id":"a7565cc9f872ea34506af704c52879640d146fec","unresolved":false,"context_lines":[{"line_number":40,"context_line":"                self.operator_cloud.delete_service(name_or_id\u003ds[\u0027id\u0027])"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def test_create_service(self):"},{"line_number":43,"context_line":"        self.addCleanup(self._cleanup_services)"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"        service \u003d self.operator_cloud.create_service("},{"line_number":46,"context_line":"            name\u003d\u0027test_service\u0027, service_type\u003d\u0027test_type\u0027,"}],"source_content_type":"text/x-python","patch_set":10,"id":"3acd31a7_45265fcf","line":43,"updated":"2015-04-30 19:51:29.000000000","message":"Makes sense to move addCleanup() to setUp() since every test needs it.","commit_id":"e1c2aa6e2945717bd3b2e8300d877b4a657dbd68"},{"author":{"_account_id":6550,"name":"Davide Guerri","email":"davide.guerri@gmail.com","username":"davide-guerri"},"change_message_id":"fdf384942b1178cfd4bc9125d9ece125d9de7c55","unresolved":false,"context_lines":[{"line_number":40,"context_line":"                self.operator_cloud.delete_service(name_or_id\u003ds[\u0027id\u0027])"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def test_create_service(self):"},{"line_number":43,"context_line":"        self.addCleanup(self._cleanup_services)"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"        service \u003d self.operator_cloud.create_service("},{"line_number":46,"context_line":"            name\u003d\u0027test_service\u0027, service_type\u003d\u0027test_type\u0027,"}],"source_content_type":"text/x-python","patch_set":10,"id":"3acd31a7_dfa8f7dd","line":43,"in_reply_to":"3acd31a7_45265fcf","updated":"2015-04-30 22:28:46.000000000","message":"Done","commit_id":"e1c2aa6e2945717bd3b2e8300d877b4a657dbd68"},{"author":{"_account_id":10035,"name":"greghaynes","email":"greg@greghaynes.net","username":"greghaynes"},"change_message_id":"0553c4f83d094a8cac09bb12bb2bef552ff0eaa2","unresolved":false,"context_lines":[{"line_number":39,"context_line":"    def _cleanup_services(self):"},{"line_number":40,"context_line":"        for s in self.operator_cloud.list_services():"},{"line_number":41,"context_line":"            if s[\u0027name\u0027].startswith(\u0027test_\u0027):"},{"line_number":42,"context_line":"                self.operator_cloud.delete_service(name_or_id\u003ds[\u0027id\u0027])"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def test_create_service(self):"},{"line_number":45,"context_line":"        service \u003d self.operator_cloud.create_service("}],"source_content_type":"text/x-python","patch_set":20,"id":"1aca2d91_a61bb872","line":42,"updated":"2015-05-08 18:28:31.000000000","message":"Do we want to catch the cloud exception here? If not, then if one of the deletes fail we wont perform the remaining ones.","commit_id":"422ac643aef64adf12bea37b8a749d7263476bbe"},{"author":{"_account_id":6550,"name":"Davide Guerri","email":"davide.guerri@gmail.com","username":"davide-guerri"},"change_message_id":"c3ada5f99dbc379d735ed4d907878d6c8202f050","unresolved":false,"context_lines":[{"line_number":39,"context_line":"    def _cleanup_services(self):"},{"line_number":40,"context_line":"        for s in self.operator_cloud.list_services():"},{"line_number":41,"context_line":"            if s[\u0027name\u0027].startswith(\u0027test_\u0027):"},{"line_number":42,"context_line":"                self.operator_cloud.delete_service(name_or_id\u003ds[\u0027id\u0027])"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def test_create_service(self):"},{"line_number":45,"context_line":"        service \u003d self.operator_cloud.create_service("}],"source_content_type":"text/x-python","patch_set":20,"id":"1aca2d91_5b0a6e7a","line":42,"in_reply_to":"1aca2d91_02280f99","updated":"2015-05-09 08:29:08.000000000","message":"Nevertheless, if we were unable to delete one or more services, an error should be raised.\nStrictly speaking, the test has failed. Moreover, the user will struggle to understand why there are stale services around.\n\nWe may want to do the same also in tests currently merged.","commit_id":"422ac643aef64adf12bea37b8a749d7263476bbe"},{"author":{"_account_id":10035,"name":"greghaynes","email":"greg@greghaynes.net","username":"greghaynes"},"change_message_id":"e9b2e3601b5bc1d46a5f3f9a726d9be1b4d83659","unresolved":false,"context_lines":[{"line_number":39,"context_line":"    def _cleanup_services(self):"},{"line_number":40,"context_line":"        for s in self.operator_cloud.list_services():"},{"line_number":41,"context_line":"            if s[\u0027name\u0027].startswith(\u0027test_\u0027):"},{"line_number":42,"context_line":"                self.operator_cloud.delete_service(name_or_id\u003ds[\u0027id\u0027])"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def test_create_service(self):"},{"line_number":45,"context_line":"        service \u003d self.operator_cloud.create_service("}],"source_content_type":"text/x-python","patch_set":20,"id":"1aca2d91_02280f99","line":42,"in_reply_to":"1aca2d91_4c67634d","updated":"2015-05-09 01:04:16.000000000","message":"The reason I am concerned is that we will be leaving around after effects in the environment which is especially an issue if we do things like test against a real cloud. This means the user will have to clean up after test runs.","commit_id":"422ac643aef64adf12bea37b8a749d7263476bbe"},{"author":{"_account_id":6550,"name":"Davide Guerri","email":"davide.guerri@gmail.com","username":"davide-guerri"},"change_message_id":"32ad1f18409c683d2a3c8dab4d4254520b2abb53","unresolved":false,"context_lines":[{"line_number":39,"context_line":"    def _cleanup_services(self):"},{"line_number":40,"context_line":"        for s in self.operator_cloud.list_services():"},{"line_number":41,"context_line":"            if s[\u0027name\u0027].startswith(\u0027test_\u0027):"},{"line_number":42,"context_line":"                self.operator_cloud.delete_service(name_or_id\u003ds[\u0027id\u0027])"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def test_create_service(self):"},{"line_number":45,"context_line":"        service \u003d self.operator_cloud.create_service("}],"source_content_type":"text/x-python","patch_set":20,"id":"1aca2d91_bbe06297","line":42,"in_reply_to":"1aca2d91_5b0a6e7a","updated":"2015-05-09 08:41:54.000000000","message":"Would this work for you?\n\n    def _cleanup_services(self):\n        exception_list \u003d list()\n        for s in self.operator_cloud.list_services():\n            if s[\u0027name\u0027].startswith(\u0027test_\u0027):\n                try:\n                    self.operator_cloud.delete_service(name_or_id\u003ds[\u0027id\u0027])\n                except Exception as e:\n                    # We were unable to delete a service, let\u0027s try with next\n                    exception_list.append(e)\n                    continue\n        if exception_list:\n            # Raise an error: we must make users aware that something went\n            # wrong\n            raise OpenStackCloudException(\u0027\\n\u0027.join(exception_list))","commit_id":"422ac643aef64adf12bea37b8a749d7263476bbe"},{"author":{"_account_id":6550,"name":"Davide Guerri","email":"davide.guerri@gmail.com","username":"davide-guerri"},"change_message_id":"646c280335a5c06df95f37711a7147017e201133","unresolved":false,"context_lines":[{"line_number":39,"context_line":"    def _cleanup_services(self):"},{"line_number":40,"context_line":"        for s in self.operator_cloud.list_services():"},{"line_number":41,"context_line":"            if s[\u0027name\u0027].startswith(\u0027test_\u0027):"},{"line_number":42,"context_line":"                self.operator_cloud.delete_service(name_or_id\u003ds[\u0027id\u0027])"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def test_create_service(self):"},{"line_number":45,"context_line":"        service \u003d self.operator_cloud.create_service("}],"source_content_type":"text/x-python","patch_set":20,"id":"1aca2d91_4c67634d","line":42,"in_reply_to":"1aca2d91_a61bb872","updated":"2015-05-08 19:46:42.000000000","message":"I agree about your statement, and in production code would be a mistake not including such check.\nBut, IMO, in a test this is not very important. \n\nIt is true that If delete_service fails, we leave the system in a inconsistent state and subsequent tests might fail too because of that, nevertheless if it fails in this mono-user and serial testing there must be some \"bigger\" issue that will almost certainly will blow up everything else :)","commit_id":"422ac643aef64adf12bea37b8a749d7263476bbe"},{"author":{"_account_id":10035,"name":"greghaynes","email":"greg@greghaynes.net","username":"greghaynes"},"change_message_id":"edfe84e59d68f10ffc42f479da64f18fe3c7ec59","unresolved":false,"context_lines":[{"line_number":39,"context_line":"    def _cleanup_services(self):"},{"line_number":40,"context_line":"        for s in self.operator_cloud.list_services():"},{"line_number":41,"context_line":"            if s[\u0027name\u0027].startswith(\u0027test_\u0027):"},{"line_number":42,"context_line":"                self.operator_cloud.delete_service(name_or_id\u003ds[\u0027id\u0027])"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def test_create_service(self):"},{"line_number":45,"context_line":"        service \u003d self.operator_cloud.create_service("}],"source_content_type":"text/x-python","patch_set":20,"id":"9af37de9_e43b609b","line":42,"in_reply_to":"1aca2d91_bbe06297","updated":"2015-05-10 17:29:53.000000000","message":"The problem isn\u0027t test failure - this is a cleanup method so it should not be testing anything. The problem is that tests should not leave garbage on the system - especially if the system is a cloud which is something we may test against.\n\nThe fix you posted should work fine.","commit_id":"422ac643aef64adf12bea37b8a749d7263476bbe"},{"author":{"_account_id":6550,"name":"Davide Guerri","email":"davide.guerri@gmail.com","username":"davide-guerri"},"change_message_id":"25f3b87c0fba2ce8b9ce920babecc75ba36d4b56","unresolved":false,"context_lines":[{"line_number":39,"context_line":"    def _cleanup_services(self):"},{"line_number":40,"context_line":"        for s in self.operator_cloud.list_services():"},{"line_number":41,"context_line":"            if s[\u0027name\u0027].startswith(\u0027test_\u0027):"},{"line_number":42,"context_line":"                self.operator_cloud.delete_service(name_or_id\u003ds[\u0027id\u0027])"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def test_create_service(self):"},{"line_number":45,"context_line":"        service \u003d self.operator_cloud.create_service("}],"source_content_type":"text/x-python","patch_set":20,"id":"9af37de9_04bc246b","line":42,"in_reply_to":"9af37de9_e43b609b","updated":"2015-05-10 19:05:06.000000000","message":"Of course we are not testing anything in a cleanup handler.\nBut, again, an error means that the test unit failed to complete successfully so if we are testing against a real cloud we must inform the user.\n\nNevertheless, I am still not fully convinced of the importance (and hence a -1) of this exception handling. If we have N services to delete and we are unable to delete some of them, and if we are testing against a real cloud (i.e. cloud is not destroyed after testing), we are still leaving garbage behind, so manual intervention is still needed.","commit_id":"422ac643aef64adf12bea37b8a749d7263476bbe"},{"author":{"_account_id":6488,"name":"Clint Byrum","email":"clint@fewbar.com","username":"clint-fewbar"},"change_message_id":"2b3e47dc2ce298bfb9950e59c10b0d7afc81394f","unresolved":false,"context_lines":[{"line_number":40,"context_line":"    def _cleanup_services(self):"},{"line_number":41,"context_line":"        exception_list \u003d list()"},{"line_number":42,"context_line":"        for s in self.operator_cloud.list_services():"},{"line_number":43,"context_line":"            if s[\u0027name\u0027].startswith(\u0027test_\u0027):"},{"line_number":44,"context_line":"                try:"},{"line_number":45,"context_line":"                    self.operator_cloud.delete_service(name_or_id\u003ds[\u0027id\u0027])"},{"line_number":46,"context_line":"                except Exception as e:"}],"source_content_type":"text/x-python","patch_set":25,"id":"9a0c5dc1_f6317c0c","line":43,"updated":"2015-05-13 17:34:02.000000000","message":"\u0027test_\u0027 needs to be a random string per test run. Functional tests may be run against all kinds of clouds, so we don\u0027t want to presume we own the whole namespace. I know other functional tests we have may do that, but let\u0027s not perpetuate the mistake.","commit_id":"9e95598435e8a54b8d333e78a4358ead68f54b9f"},{"author":{"_account_id":6550,"name":"Davide Guerri","email":"davide.guerri@gmail.com","username":"davide-guerri"},"change_message_id":"5ed8ecfd8714ede0a5f608fa86bb679df3b69e36","unresolved":false,"context_lines":[{"line_number":40,"context_line":"    def _cleanup_services(self):"},{"line_number":41,"context_line":"        exception_list \u003d list()"},{"line_number":42,"context_line":"        for s in self.operator_cloud.list_services():"},{"line_number":43,"context_line":"            if s[\u0027name\u0027].startswith(\u0027test_\u0027):"},{"line_number":44,"context_line":"                try:"},{"line_number":45,"context_line":"                    self.operator_cloud.delete_service(name_or_id\u003ds[\u0027id\u0027])"},{"line_number":46,"context_line":"                except Exception as e:"}],"source_content_type":"text/x-python","patch_set":25,"id":"9a0c5dc1_43c0872a","line":43,"in_reply_to":"9a0c5dc1_f6317c0c","updated":"2015-05-13 19:09:49.000000000","message":"Done","commit_id":"9e95598435e8a54b8d333e78a4358ead68f54b9f"},{"author":{"_account_id":6488,"name":"Clint Byrum","email":"clint@fewbar.com","username":"clint-fewbar"},"change_message_id":"2b3e47dc2ce298bfb9950e59c10b0d7afc81394f","unresolved":false,"context_lines":[{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def test_list_service(self):"},{"line_number":62,"context_line":"        service \u003d self.operator_cloud.create_service("},{"line_number":63,"context_line":"            name\u003d\u0027test_service\u0027, service_type\u003d\u0027test_type\u0027)"},{"line_number":64,"context_line":"        observed_services \u003d self.operator_cloud.list_services()"},{"line_number":65,"context_line":"        self.assertIsInstance(observed_services, list)"},{"line_number":66,"context_line":"        found \u003d False"}],"source_content_type":"text/x-python","patch_set":25,"id":"9a0c5dc1_d63438fc","line":63,"updated":"2015-05-13 17:34:02.000000000","message":"We can\u0027t guarantee concurrency or ordering of these tests, they may all run at the same time. So use unique names per test. The name of the test should be perfect.","commit_id":"9e95598435e8a54b8d333e78a4358ead68f54b9f"},{"author":{"_account_id":6550,"name":"Davide Guerri","email":"davide.guerri@gmail.com","username":"davide-guerri"},"change_message_id":"5ed8ecfd8714ede0a5f608fa86bb679df3b69e36","unresolved":false,"context_lines":[{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def test_list_service(self):"},{"line_number":62,"context_line":"        service \u003d self.operator_cloud.create_service("},{"line_number":63,"context_line":"            name\u003d\u0027test_service\u0027, service_type\u003d\u0027test_type\u0027)"},{"line_number":64,"context_line":"        observed_services \u003d self.operator_cloud.list_services()"},{"line_number":65,"context_line":"        self.assertIsInstance(observed_services, list)"},{"line_number":66,"context_line":"        found \u003d False"}],"source_content_type":"text/x-python","patch_set":25,"id":"9a0c5dc1_03e16fd0","line":63,"in_reply_to":"9a0c5dc1_d63438fc","updated":"2015-05-13 19:09:49.000000000","message":"Done","commit_id":"9e95598435e8a54b8d333e78a4358ead68f54b9f"},{"author":{"_account_id":6488,"name":"Clint Byrum","email":"clint@fewbar.com","username":"clint-fewbar"},"change_message_id":"492550e5742e9708db3f0622967b10f8d4c7434a","unresolved":false,"context_lines":[{"line_number":40,"context_line":""},{"line_number":41,"context_line":"        # Generate a random name for services in this test"},{"line_number":42,"context_line":"        self.new_service_name \u003d \u0027test_\u0027 + \u0027\u0027.join("},{"line_number":43,"context_line":"            random.choice(string.ascii_lowercase) for _ in range(5))"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"        self.addCleanup(self._cleanup_services)"},{"line_number":46,"context_line":""}],"source_content_type":"text/x-python","patch_set":30,"id":"5afe65bd_7999dd1e","line":43,"updated":"2015-06-03 23:49:05.000000000","message":"nit: 5 is a bit short. Entirely likely you\u0027ll generate \u0027test_chris\u0027 and chris will be sad because we deleted all his services.","commit_id":"7e2d698babeffbca543cc314e0385e3beedf260e"},{"author":{"_account_id":10035,"name":"greghaynes","email":"greg@greghaynes.net","username":"greghaynes"},"change_message_id":"174daaec36b79a68a0bc6b8017fe679fc76f3ca6","unresolved":false,"context_lines":[{"line_number":40,"context_line":""},{"line_number":41,"context_line":"        # Generate a random name for services in this test"},{"line_number":42,"context_line":"        self.new_service_name \u003d \u0027test_\u0027 + \u0027\u0027.join("},{"line_number":43,"context_line":"            random.choice(string.ascii_lowercase) for _ in range(5))"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"        self.addCleanup(self._cleanup_services)"},{"line_number":46,"context_line":""}],"source_content_type":"text/x-python","patch_set":30,"id":"5afe65bd_147e3019","line":43,"in_reply_to":"5afe65bd_7999dd1e","updated":"2015-06-04 00:15:26.000000000","message":"poor chris","commit_id":"7e2d698babeffbca543cc314e0385e3beedf260e"},{"author":{"_account_id":6488,"name":"Clint Byrum","email":"clint@fewbar.com","username":"clint-fewbar"},"change_message_id":"492550e5742e9708db3f0622967b10f8d4c7434a","unresolved":false,"context_lines":[{"line_number":77,"context_line":"                self.assertEqual(self.new_service_name + \u0027_list\u0027,"},{"line_number":78,"context_line":"                                 s.get(\u0027name\u0027))"},{"line_number":79,"context_line":"                self.assertEqual(\u0027test_type\u0027, s.get(\u0027type\u0027))"},{"line_number":80,"context_line":"                found \u003d True"},{"line_number":81,"context_line":"        self.assertTrue(found, msg\u003d\u0027new service not found in service list!\u0027)"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    def test_delete_service_by_name(self):"}],"source_content_type":"text/x-python","patch_set":30,"id":"5afe65bd_59a06143","line":80,"updated":"2015-06-03 23:49:05.000000000","message":"is there some reason you\u0027re not using search_services here?","commit_id":"7e2d698babeffbca543cc314e0385e3beedf260e"}]}
