)]}'
{"etc/trove/trove-taskmanager.conf.sample":[{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"26cc4cf88eee28e6c3e7d626070b8e966d34ee22","unresolved":false,"context_lines":[{"line_number":74,"context_line":"dns_service_type \u003d dns"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"# Trove Security Groups for Instances"},{"line_number":77,"context_line":"trove_security_groups_support \u003d True"},{"line_number":78,"context_line":"trove_security_groups_rules_support \u003d False"},{"line_number":79,"context_line":"trove_security_group_rule_protocol \u003d tcp"},{"line_number":80,"context_line":"trove_security_group_rule_port \u003d 3306"}],"source_content_type":"application/octet-stream","patch_set":8,"id":"AAAAUH%2F9t3A%3D","line":77,"updated":"2014-02-04 18:18:12.000000000","message":"trove_security_groups_rules_support, trove_security_group_rule_protocol, \u0026 trove_security_group_rule_port were all removed from cfg.py, which means they should be removed here as well.","commit_id":"71b7ef991606465f2a132ef789acdaac9c393dc2"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"26cc4cf88eee28e6c3e7d626070b8e966d34ee22","unresolved":false,"context_lines":[{"line_number":137,"context_line":"tcp_ports \u003d 3306"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"[redis]"},{"line_number":140,"context_line":"tcp_ports \u003d 4369, 8091, 8091, 11209-11211, 21100-21199"}],"source_content_type":"application/octet-stream","patch_set":8,"id":"AAAAUH%2F9t8A%3D","line":140,"updated":"2014-02-04 18:18:12.000000000","message":"these are the ports required for couchbase, not redis. although i imagine you did this to showcase the fact that multiple ports and even port ranges are supported, i think anyone looking at this will wonder: \"redis only needs one port, why are these all here?\". i\u0027d ask the that this file use representative values.\n\nthe ability to use ranges should be reflected in the tests you\u0027ll add, plus the cfg.py help text.","commit_id":"71b7ef991606465f2a132ef789acdaac9c393dc2"}],"etc/trove/trove.conf.sample":[{"author":{"_account_id":5293,"name":"Nikhil","email":"SlickNik@gmail.com","username":"slicknik"},"change_message_id":"05e850e24d053ff00a2ba7011a82540bba2d1fb0","unresolved":false,"context_lines":[{"line_number":94,"context_line":"trove_security_group_rule_protocol \u003d tcp"},{"line_number":95,"context_line":"trove_security_group_rule_cidr \u003d 0.0.0.0/0"},{"line_number":96,"context_line":"database_default_port \u003d mysql:3306, percona:3306"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"# Trove api-paste file name"},{"line_number":99,"context_line":"api_paste_config \u003d api-paste.ini"},{"line_number":100,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":1,"id":"AAAATH%2F%2FlE0%3D","line":97,"updated":"2013-10-14 09:52:49.000000000","message":"Do we really need a dictionary with 2 entries, if both values are going to be the same?","commit_id":"f8093ab036fed2edbb4577f241721d558697dd3b"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"3f2fe17032e44e0b24fc9bb77287c6f631168b18","unresolved":false,"context_lines":[{"line_number":94,"context_line":"trove_security_group_rule_protocol \u003d tcp"},{"line_number":95,"context_line":"trove_security_group_rule_cidr \u003d 0.0.0.0/0"},{"line_number":96,"context_line":"database_default_port \u003d mysql:3306, percona:3306"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"# Trove api-paste file name"},{"line_number":99,"context_line":"api_paste_config \u003d api-paste.ini"},{"line_number":100,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":1,"id":"AAAATH%2F%2FlEM%3D","line":97,"in_reply_to":"AAAATH%2F%2FlE0%3D","updated":"2013-10-14 09:58:57.000000000","message":"Because, in nearest future trove would support several services with different ports. That is why we need this dictionary with default ports.","commit_id":"f8093ab036fed2edbb4577f241721d558697dd3b"},{"author":{"_account_id":5293,"name":"Nikhil","email":"SlickNik@gmail.com","username":"slicknik"},"change_message_id":"5e788c80ac4cc54d0041469e0872c47f6927a7ff","unresolved":false,"context_lines":[{"line_number":94,"context_line":"trove_security_group_rule_protocol \u003d tcp"},{"line_number":95,"context_line":"trove_security_group_rule_cidr \u003d 0.0.0.0/0"},{"line_number":96,"context_line":"database_default_port \u003d mysql:3306, percona:3306"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"# Trove api-paste file name"},{"line_number":99,"context_line":"api_paste_config \u003d api-paste.ini"},{"line_number":100,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":1,"id":"AAAATH%2F%2Fip4%3D","line":97,"in_reply_to":"AAAATH%2F%2FlEM%3D","updated":"2013-10-14 19:19:31.000000000","message":"OK","commit_id":"f8093ab036fed2edbb4577f241721d558697dd3b"}],"trove/common/cfg.py":[{"author":{"_account_id":5293,"name":"Nikhil","email":"SlickNik@gmail.com","username":"slicknik"},"change_message_id":"05e850e24d053ff00a2ba7011a82540bba2d1fb0","unresolved":false,"context_lines":[{"line_number":130,"context_line":"    cfg.BoolOpt(\u0027hostname_require_ipv4\u0027, default\u003dTrue,"},{"line_number":131,"context_line":"                help\u003d\"Require user hostnames to be IPv4 addresses.\"),"},{"line_number":132,"context_line":"    cfg.BoolOpt(\u0027trove_security_groups_support\u0027, default\u003dTrue),"},{"line_number":133,"context_line":"    cfg.BoolOpt(\u0027trove_security_groups_rules_support\u0027, default\u003dTrue),"},{"line_number":134,"context_line":"    cfg.StrOpt(\u0027trove_security_group_name_prefix\u0027, default\u003d\u0027SecGroup\u0027),"},{"line_number":135,"context_line":"    cfg.StrOpt(\u0027trove_security_group_rule_protocol\u0027, default\u003d\u0027tcp\u0027),"},{"line_number":136,"context_line":"    cfg.IntOpt(\u0027trove_security_group_rule_port\u0027, default\u003d3306),"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATH%2F%2FlFQ%3D","side":"PARENT","line":133,"updated":"2013-10-14 09:52:49.000000000","message":"Why are we making sec-groups mandatory? These are an optional extension in nova, and should be left optional in trove as well.","commit_id":"d16940a1c3adb2b1355281f18a859b526129af68"},{"author":{"_account_id":5293,"name":"Nikhil","email":"SlickNik@gmail.com","username":"slicknik"},"change_message_id":"5e788c80ac4cc54d0041469e0872c47f6927a7ff","unresolved":false,"context_lines":[{"line_number":130,"context_line":"    cfg.BoolOpt(\u0027hostname_require_ipv4\u0027, default\u003dTrue,"},{"line_number":131,"context_line":"                help\u003d\"Require user hostnames to be IPv4 addresses.\"),"},{"line_number":132,"context_line":"    cfg.BoolOpt(\u0027trove_security_groups_support\u0027, default\u003dTrue),"},{"line_number":133,"context_line":"    cfg.BoolOpt(\u0027trove_security_groups_rules_support\u0027, default\u003dTrue),"},{"line_number":134,"context_line":"    cfg.StrOpt(\u0027trove_security_group_name_prefix\u0027, default\u003d\u0027SecGroup\u0027),"},{"line_number":135,"context_line":"    cfg.StrOpt(\u0027trove_security_group_rule_protocol\u0027, default\u003d\u0027tcp\u0027),"},{"line_number":136,"context_line":"    cfg.IntOpt(\u0027trove_security_group_rule_port\u0027, default\u003d3306),"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATH%2F%2FipY%3D","side":"PARENT","line":133,"in_reply_to":"AAAATH%2F%2FlEE%3D","updated":"2013-10-14 19:19:31.000000000","message":"Sure, that makes sense. This is fine.","commit_id":"d16940a1c3adb2b1355281f18a859b526129af68"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"3f2fe17032e44e0b24fc9bb77287c6f631168b18","unresolved":false,"context_lines":[{"line_number":130,"context_line":"    cfg.BoolOpt(\u0027hostname_require_ipv4\u0027, default\u003dTrue,"},{"line_number":131,"context_line":"                help\u003d\"Require user hostnames to be IPv4 addresses.\"),"},{"line_number":132,"context_line":"    cfg.BoolOpt(\u0027trove_security_groups_support\u0027, default\u003dTrue),"},{"line_number":133,"context_line":"    cfg.BoolOpt(\u0027trove_security_groups_rules_support\u0027, default\u003dTrue),"},{"line_number":134,"context_line":"    cfg.StrOpt(\u0027trove_security_group_name_prefix\u0027, default\u003d\u0027SecGroup\u0027),"},{"line_number":135,"context_line":"    cfg.StrOpt(\u0027trove_security_group_rule_protocol\u0027, default\u003d\u0027tcp\u0027),"},{"line_number":136,"context_line":"    cfg.IntOpt(\u0027trove_security_group_rule_port\u0027, default\u003d3306),"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATH%2F%2FlEE%3D","side":"PARENT","line":133,"in_reply_to":"AAAATH%2F%2FlFQ%3D","updated":"2013-10-14 09:58:57.000000000","message":"Not security groups, we making ser. gr. rules mandatory, because empty sec.gr is meaningless.","commit_id":"d16940a1c3adb2b1355281f18a859b526129af68"},{"author":{"_account_id":1375,"name":"Ed Cranford","email":"ed.cranford@gmail.com","username":"ed--cranford"},"change_message_id":"3aea5bafff890ef1f3b4d6d41d3fccae2d6eb982","unresolved":false,"context_lines":[{"line_number":138,"context_line":"    cfg.StrOpt(\u0027trove_security_group_name_prefix\u0027, default\u003d\u0027SecGroup\u0027),"},{"line_number":139,"context_line":"    cfg.StrOpt(\u0027trove_security_group_rule_protocol\u0027, default\u003d\u0027tcp\u0027),"},{"line_number":140,"context_line":"    cfg.StrOpt(\u0027trove_security_group_rule_cidr\u0027, default\u003d\u00270.0.0.0/0\u0027),"},{"line_number":141,"context_line":"    cfg.DictOpt(\u0027datastore_read_write_port\u0027, default\u003d{\u0027mysql\u0027: 3306,"},{"line_number":142,"context_line":"                                                      \u0027percona\u0027: 3306},"},{"line_number":143,"context_line":"                help\u003d\u0027Default read/write port per datastore\u0027),"},{"line_number":144,"context_line":"    cfg.IntOpt(\u0027trove_api_workers\u0027, default\u003dNone),"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F%2Fz8w%3D","line":141,"updated":"2013-10-28 18:35:31.000000000","message":"The sample file also mentions a default rw port for cassandra. Should that be here, too?","commit_id":"b36bfc5aaa9bd6a3ad53624c914ee8d3e16110f0"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"739a46686cd0d8cf918590c51643fb18b60e7e9a","unresolved":false,"context_lines":[{"line_number":138,"context_line":"    cfg.StrOpt(\u0027trove_security_group_name_prefix\u0027, default\u003d\u0027SecGroup\u0027),"},{"line_number":139,"context_line":"    cfg.StrOpt(\u0027trove_security_group_rule_protocol\u0027, default\u003d\u0027tcp\u0027),"},{"line_number":140,"context_line":"    cfg.StrOpt(\u0027trove_security_group_rule_cidr\u0027, default\u003d\u00270.0.0.0/0\u0027),"},{"line_number":141,"context_line":"    cfg.DictOpt(\u0027datastore_read_write_port\u0027, default\u003d{\u0027mysql\u0027: 3306,"},{"line_number":142,"context_line":"                                                      \u0027percona\u0027: 3306},"},{"line_number":143,"context_line":"                help\u003d\u0027Default read/write port per datastore\u0027),"},{"line_number":144,"context_line":"    cfg.IntOpt(\u0027trove_api_workers\u0027, default\u003dNone),"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F%2FzRs%3D","line":141,"in_reply_to":"AAAATn%2F%2Fz8w%3D","updated":"2013-10-28 20:44:35.000000000","message":"i suppose not, are  there any reasons to do vise versa ?","commit_id":"b36bfc5aaa9bd6a3ad53624c914ee8d3e16110f0"},{"author":{"_account_id":1375,"name":"Ed Cranford","email":"ed.cranford@gmail.com","username":"ed--cranford"},"change_message_id":"04c79ebe647cf604761dff882ea1b34028ce7ebf","unresolved":false,"context_lines":[{"line_number":138,"context_line":"    cfg.StrOpt(\u0027trove_security_group_name_prefix\u0027, default\u003d\u0027SecGroup\u0027),"},{"line_number":139,"context_line":"    cfg.StrOpt(\u0027trove_security_group_rule_protocol\u0027, default\u003d\u0027tcp\u0027),"},{"line_number":140,"context_line":"    cfg.StrOpt(\u0027trove_security_group_rule_cidr\u0027, default\u003d\u00270.0.0.0/0\u0027),"},{"line_number":141,"context_line":"    cfg.DictOpt(\u0027datastore_read_write_port\u0027, default\u003d{\u0027mysql\u0027: 3306,"},{"line_number":142,"context_line":"                                                      \u0027percona\u0027: 3306},"},{"line_number":143,"context_line":"                help\u003d\u0027Default read/write port per datastore\u0027),"},{"line_number":144,"context_line":"    cfg.IntOpt(\u0027trove_api_workers\u0027, default\u003dNone),"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F%2FzOI%3D","line":141,"in_reply_to":"AAAATn%2F%2FzRs%3D","updated":"2013-10-28 21:11:47.000000000","message":"Disregard, the Cassandra review can deal with adding that. I was treating the config.sample as gospel for some reason.","commit_id":"b36bfc5aaa9bd6a3ad53624c914ee8d3e16110f0"},{"author":{"_account_id":6794,"name":"Simon Pasquier","email":"pasquier.simon@gmail.com","username":"simon-pasquier"},"change_message_id":"c6bcef1dc06e8b1e48fc48e3739a39f317c82ae4","unresolved":false,"context_lines":[{"line_number":249,"context_line":"    cfg.ListOpt(\u0027tcp_ports\u0027, default\u003d[\"3306\"],"},{"line_number":250,"context_line":"                help\u003d\u0027List of single ports and port ranges, \u0027"},{"line_number":251,"context_line":"                     \u0027format: [\"A\", \"A-B\"]\u0027),"},{"line_number":252,"context_line":"    cfg.ListOpt(\u0027upd_ports\u0027, default\u003d[],"},{"line_number":253,"context_line":"                help\u003d\u0027List of single ports and port ranges, \u0027"},{"line_number":254,"context_line":"                     \u0027format: [\"A\", \"A-B\"]\u0027),"},{"line_number":255,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUH%2F9vBM%3D","line":252,"updated":"2014-02-04 15:12:26.000000000","message":"s/upd/udp/","commit_id":"ce49c2506a6c7ff35b3e4ac38da5ab2a523997c1"},{"author":{"_account_id":6794,"name":"Simon Pasquier","email":"pasquier.simon@gmail.com","username":"simon-pasquier"},"change_message_id":"c6bcef1dc06e8b1e48fc48e3739a39f317c82ae4","unresolved":false,"context_lines":[{"line_number":261,"context_line":"                                      \"11209-11211\", \"21100-21199\"],"},{"line_number":262,"context_line":"                help\u003d\u0027List of single ports and port ranges, \u0027"},{"line_number":263,"context_line":"                     \u0027format: [\"A\", \"A-B\"]\u0027),"},{"line_number":264,"context_line":"    cfg.ListOpt(\u0027upd_ports\u0027, default\u003d[],"},{"line_number":265,"context_line":"                help\u003d\u0027List of single ports and port ranges, \u0027"},{"line_number":266,"context_line":"                     \u0027format: [\"A\", \"A-B\"]\u0027),"},{"line_number":267,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUH%2F9vBI%3D","line":264,"updated":"2014-02-04 15:12:26.000000000","message":"ditto","commit_id":"ce49c2506a6c7ff35b3e4ac38da5ab2a523997c1"},{"author":{"_account_id":9683,"name":"Mat Lowery","email":"mlowery@ebaysf.com","username":"mat-lowery"},"change_message_id":"04cbca406aa2fb7e9733228c98783fc6a386e519","unresolved":false,"context_lines":[{"line_number":248,"context_line":"mysql_opts \u003d ["},{"line_number":249,"context_line":"    cfg.ListOpt(\u0027tcp_ports\u0027, default\u003d[\"3306\"],"},{"line_number":250,"context_line":"                help\u003d\u0027List of single ports and port ranges, \u0027"},{"line_number":251,"context_line":"                     \u0027format: [\"A\", \"A-B\"]\u0027),"},{"line_number":252,"context_line":"    cfg.ListOpt(\u0027udp_ports\u0027, default\u003d[],"},{"line_number":253,"context_line":"                help\u003d\u0027List of single ports and port ranges, \u0027"},{"line_number":254,"context_line":"                     \u0027format: [\"A\", \"A-B\"]\u0027),"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUH%2F9uDs%3D","line":251,"updated":"2014-02-04 17:45:43.000000000","message":"If the format clause of the help string is meant to represent what the operator would enter into trove-taskmanager.conf, then the brackets and quotes should be removed as they will come through in the parsing.\n\nOn that note, should sample lines be added to etc/trove/trove-taskmanager.conf.sample?","commit_id":"8eeab1f89cba7c62ad419023e336e9aa40708541"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"26cc4cf88eee28e6c3e7d626070b8e966d34ee22","unresolved":false,"context_lines":[{"line_number":247,"context_line":"mysql_group \u003d cfg.OptGroup(\u0027mysql\u0027, title\u003d\u0027MySQL options\u0027)"},{"line_number":248,"context_line":"mysql_opts \u003d ["},{"line_number":249,"context_line":"    cfg.ListOpt(\u0027tcp_ports\u0027, default\u003d[\"3306\"],"},{"line_number":250,"context_line":"                help\u003d\u0027List of single ports and port ranges\u0027),"},{"line_number":251,"context_line":"    cfg.ListOpt(\u0027udp_ports\u0027, default\u003d[],"},{"line_number":252,"context_line":"                help\u003d\u0027List of single ports and port ranges\u0027),"},{"line_number":253,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUH%2F9t58%3D","line":250,"updated":"2014-02-04 18:18:12.000000000","message":"change to \u0027List of TCP ports and/or port ranges to open in the security group (only applicable if trove_security_groups_support is True)\u0027","commit_id":"71b7ef991606465f2a132ef789acdaac9c393dc2"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"26cc4cf88eee28e6c3e7d626070b8e966d34ee22","unresolved":false,"context_lines":[{"line_number":249,"context_line":"    cfg.ListOpt(\u0027tcp_ports\u0027, default\u003d[\"3306\"],"},{"line_number":250,"context_line":"                help\u003d\u0027List of single ports and port ranges\u0027),"},{"line_number":251,"context_line":"    cfg.ListOpt(\u0027udp_ports\u0027, default\u003d[],"},{"line_number":252,"context_line":"                help\u003d\u0027List of single ports and port ranges\u0027),"},{"line_number":253,"context_line":"]"},{"line_number":254,"context_line":""},{"line_number":255,"context_line":"# Redis"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUH%2F9t5o%3D","line":252,"updated":"2014-02-04 18:18:12.000000000","message":"change to \u0027List of UDP ports and/or port ranges to open in the security group (only applicable if trove_security_groups_support is True)\u0027","commit_id":"71b7ef991606465f2a132ef789acdaac9c393dc2"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"26cc4cf88eee28e6c3e7d626070b8e966d34ee22","unresolved":false,"context_lines":[{"line_number":255,"context_line":"# Redis"},{"line_number":256,"context_line":"redis_group \u003d cfg.OptGroup(\u0027redis\u0027, title\u003d\u0027Redis options\u0027)"},{"line_number":257,"context_line":"redis_opts \u003d ["},{"line_number":258,"context_line":"    cfg.ListOpt(\u0027tcp_ports\u0027, default\u003d[\"4369\", \"8091\", \"8091\","},{"line_number":259,"context_line":"                                      \"11209-11211\", \"21100-21199\"],"},{"line_number":260,"context_line":"                help\u003d\u0027List of single ports and port ranges\u0027),"},{"line_number":261,"context_line":"    cfg.ListOpt(\u0027udp_ports\u0027, default\u003d[],"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUH%2F9t3s%3D","line":258,"updated":"2014-02-04 18:18:12.000000000","message":"as mentioned in the conf.sample, please change this to \"6379\".","commit_id":"71b7ef991606465f2a132ef789acdaac9c393dc2"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"26cc4cf88eee28e6c3e7d626070b8e966d34ee22","unresolved":false,"context_lines":[{"line_number":257,"context_line":"redis_opts \u003d ["},{"line_number":258,"context_line":"    cfg.ListOpt(\u0027tcp_ports\u0027, default\u003d[\"4369\", \"8091\", \"8091\","},{"line_number":259,"context_line":"                                      \"11209-11211\", \"21100-21199\"],"},{"line_number":260,"context_line":"                help\u003d\u0027List of single ports and port ranges\u0027),"},{"line_number":261,"context_line":"    cfg.ListOpt(\u0027udp_ports\u0027, default\u003d[],"},{"line_number":262,"context_line":"                help\u003d\u0027List of single ports and port ranges\u0027),"},{"line_number":263,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUH%2F9t5M%3D","line":260,"updated":"2014-02-04 18:18:12.000000000","message":"change to \"List of TCP ports and/or port ranges to open in the security group (only applicable if trove_security_groups_support is True)\"","commit_id":"71b7ef991606465f2a132ef789acdaac9c393dc2"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"26cc4cf88eee28e6c3e7d626070b8e966d34ee22","unresolved":false,"context_lines":[{"line_number":259,"context_line":"                                      \"11209-11211\", \"21100-21199\"],"},{"line_number":260,"context_line":"                help\u003d\u0027List of single ports and port ranges\u0027),"},{"line_number":261,"context_line":"    cfg.ListOpt(\u0027udp_ports\u0027, default\u003d[],"},{"line_number":262,"context_line":"                help\u003d\u0027List of single ports and port ranges\u0027),"},{"line_number":263,"context_line":"]"},{"line_number":264,"context_line":""},{"line_number":265,"context_line":"CONF \u003d cfg.CONF"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUH%2F9t5I%3D","line":262,"updated":"2014-02-04 18:18:12.000000000","message":"change to \"List of TCP ports and/or port ranges to open in the security group (only applicable if trove_security_groups_support is True)\"","commit_id":"71b7ef991606465f2a132ef789acdaac9c393dc2"}],"trove/instance/models.py":[{"author":{"_account_id":5293,"name":"Nikhil","email":"SlickNik@gmail.com","username":"slicknik"},"change_message_id":"05e850e24d053ff00a2ba7011a82540bba2d1fb0","unresolved":false,"context_lines":[{"line_number":484,"context_line":"                security_group \u003d SecurityGroup.create_for_instance("},{"line_number":485,"context_line":"                    db_info.id,"},{"line_number":486,"context_line":"                    context)"},{"line_number":487,"context_line":"                if CONF.trove_security_groups_rules_support:"},{"line_number":488,"context_line":"                    SecurityGroupRule.create_sec_group_rule("},{"line_number":489,"context_line":"                        security_group,"},{"line_number":490,"context_line":"                        CONF.trove_security_group_rule_protocol,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATH%2F%2FlFI%3D","side":"PARENT","line":487,"updated":"2013-10-14 09:52:49.000000000","message":"We want sec-groups to be optional based on the conf.","commit_id":"d16940a1c3adb2b1355281f18a859b526129af68"},{"author":{"_account_id":5293,"name":"Nikhil","email":"SlickNik@gmail.com","username":"slicknik"},"change_message_id":"5e788c80ac4cc54d0041469e0872c47f6927a7ff","unresolved":false,"context_lines":[{"line_number":484,"context_line":"                security_group \u003d SecurityGroup.create_for_instance("},{"line_number":485,"context_line":"                    db_info.id,"},{"line_number":486,"context_line":"                    context)"},{"line_number":487,"context_line":"                if CONF.trove_security_groups_rules_support:"},{"line_number":488,"context_line":"                    SecurityGroupRule.create_sec_group_rule("},{"line_number":489,"context_line":"                        security_group,"},{"line_number":490,"context_line":"                        CONF.trove_security_group_rule_protocol,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATH%2F%2Fink%3D","side":"PARENT","line":487,"in_reply_to":"AAAATH%2F%2FlDY%3D","updated":"2013-10-14 19:19:31.000000000","message":"OK","commit_id":"d16940a1c3adb2b1355281f18a859b526129af68"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"3f2fe17032e44e0b24fc9bb77287c6f631168b18","unresolved":false,"context_lines":[{"line_number":484,"context_line":"                security_group \u003d SecurityGroup.create_for_instance("},{"line_number":485,"context_line":"                    db_info.id,"},{"line_number":486,"context_line":"                    context)"},{"line_number":487,"context_line":"                if CONF.trove_security_groups_rules_support:"},{"line_number":488,"context_line":"                    SecurityGroupRule.create_sec_group_rule("},{"line_number":489,"context_line":"                        security_group,"},{"line_number":490,"context_line":"                        CONF.trove_security_group_rule_protocol,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATH%2F%2FlDY%3D","side":"PARENT","line":487,"in_reply_to":"AAAATH%2F%2FlFI%3D","updated":"2013-10-14 09:58:57.000000000","message":"Security groups are still optinal, we make rules mandatory, because empty security group is meaningless.","commit_id":"d16940a1c3adb2b1355281f18a859b526129af68"},{"author":{"_account_id":5293,"name":"Nikhil","email":"SlickNik@gmail.com","username":"slicknik"},"change_message_id":"05e850e24d053ff00a2ba7011a82540bba2d1fb0","unresolved":false,"context_lines":[{"line_number":488,"context_line":"                    security_group,"},{"line_number":489,"context_line":"                    CONF.trove_security_group_rule_protocol,"},{"line_number":490,"context_line":"                    CONF.database_default_port.get(service_type, 1),"},{"line_number":491,"context_line":"                    CONF.database_default_port.get(service_type, 65535),"},{"line_number":492,"context_line":"                    CONF.trove_security_group_rule_cidr,"},{"line_number":493,"context_line":"                    context"},{"line_number":494,"context_line":"                )"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATH%2F%2FlFE%3D","line":491,"updated":"2013-10-14 09:52:49.000000000","message":"Why choose defaults of 1 and 65535? They don\u0027t make much sense in this case.","commit_id":"f8093ab036fed2edbb4577f241721d558697dd3b"},{"author":{"_account_id":5293,"name":"Nikhil","email":"SlickNik@gmail.com","username":"slicknik"},"change_message_id":"5e788c80ac4cc54d0041469e0872c47f6927a7ff","unresolved":false,"context_lines":[{"line_number":488,"context_line":"                    security_group,"},{"line_number":489,"context_line":"                    CONF.trove_security_group_rule_protocol,"},{"line_number":490,"context_line":"                    CONF.database_default_port.get(service_type, 1),"},{"line_number":491,"context_line":"                    CONF.database_default_port.get(service_type, 65535),"},{"line_number":492,"context_line":"                    CONF.trove_security_group_rule_cidr,"},{"line_number":493,"context_line":"                    context"},{"line_number":494,"context_line":"                )"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATH%2F%2Fino%3D","line":491,"in_reply_to":"AAAATH%2F%2FlDw%3D","updated":"2013-10-14 19:19:31.000000000","message":"I think that this is a horrible idea. We should be secure by default and NOT open up ALL the ports in case this is not specified in the conf. Please use a single port here (perhaps just 3306?).","commit_id":"f8093ab036fed2edbb4577f241721d558697dd3b"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"3f2fe17032e44e0b24fc9bb77287c6f631168b18","unresolved":false,"context_lines":[{"line_number":488,"context_line":"                    security_group,"},{"line_number":489,"context_line":"                    CONF.trove_security_group_rule_protocol,"},{"line_number":490,"context_line":"                    CONF.database_default_port.get(service_type, 1),"},{"line_number":491,"context_line":"                    CONF.database_default_port.get(service_type, 65535),"},{"line_number":492,"context_line":"                    CONF.trove_security_group_rule_cidr,"},{"line_number":493,"context_line":"                    context"},{"line_number":494,"context_line":"                )"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATH%2F%2FlDw%3D","line":491,"in_reply_to":"AAAATH%2F%2FlFE%3D","updated":"2013-10-14 09:58:57.000000000","message":"because if there is no value in dictionary we allow this instance to be accesible to any port in networking port range.","commit_id":"f8093ab036fed2edbb4577f241721d558697dd3b"}],"trove/taskmanager/models.py":[{"author":{"_account_id":739,"name":"Michael Basnight","email":"mbasnight@gmail.com","username":"hubcap"},"change_message_id":"5758bfcda62e533e4889bf9e5d91c62f0799f712","unresolved":false,"context_lines":[{"line_number":145,"context_line":"                        availability_zone, root_password):"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"        security_groups \u003d None"},{"line_number":148,"context_line":"        if CONF.trove_security_groups_support:"},{"line_number":149,"context_line":"            try:"},{"line_number":150,"context_line":"                self._create_secgroup(service_type)"},{"line_number":151,"context_line":"            except Exception as e:"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F%2FAl8%3D","line":148,"updated":"2013-11-15 19:01:04.000000000","message":"Now that we are using heat, we need to make sure that we arent using the heat template here. If we are using heat, then we should _not_ do any of this","commit_id":"b36bfc5aaa9bd6a3ad53624c914ee8d3e16110f0"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"3e13e3aff6242e65edd00395853d64a473845c92","unresolved":false,"context_lines":[{"line_number":145,"context_line":"                        availability_zone, root_password):"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"        security_groups \u003d None"},{"line_number":148,"context_line":"        if CONF.trove_security_groups_support:"},{"line_number":149,"context_line":"            try:"},{"line_number":150,"context_line":"                self._create_secgroup(service_type)"},{"line_number":151,"context_line":"            except Exception as e:"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F%2B%2FOE%3D","line":148,"in_reply_to":"AAAATn%2F%2FAl8%3D","updated":"2013-11-16 10:01:59.000000000","message":"agreed","commit_id":"b36bfc5aaa9bd6a3ad53624c914ee8d3e16110f0"},{"author":{"_account_id":1375,"name":"Ed Cranford","email":"ed.cranford@gmail.com","username":"ed--cranford"},"change_message_id":"3aea5bafff890ef1f3b4d6d41d3fccae2d6eb982","unresolved":false,"context_lines":[{"line_number":345,"context_line":"        resource \u003d client.resources.get(stack.id, \u0027BaseInstance\u0027)"},{"line_number":346,"context_line":"        server \u003d novaclient.servers.get(resource.physical_resource_id)"},{"line_number":347,"context_line":"        novaclient.servers.add_security_group(resource.physical_resource_id,"},{"line_number":348,"context_line":"                                              security_groups[0])"},{"line_number":349,"context_line":"        resource \u003d client.resources.get(stack.id, \u0027DataVolume\u0027)"},{"line_number":350,"context_line":"        volume \u003d cinderclient.volumes.get(resource.physical_resource_id)"},{"line_number":351,"context_line":"        volume_info \u003d self._build_volume(volume)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F%2Fzpg%3D","line":348,"updated":"2013-10-28 18:35:31.000000000","message":"What do we do if len(security_groups) !\u003d 1? Is that ever a realistic concern?","commit_id":"b36bfc5aaa9bd6a3ad53624c914ee8d3e16110f0"},{"author":{"_account_id":739,"name":"Michael Basnight","email":"mbasnight@gmail.com","username":"hubcap"},"change_message_id":"71952c6bdd7c22686056cfc18efae0135a2be99c","unresolved":false,"context_lines":[{"line_number":345,"context_line":"        resource \u003d client.resources.get(stack.id, \u0027BaseInstance\u0027)"},{"line_number":346,"context_line":"        server \u003d novaclient.servers.get(resource.physical_resource_id)"},{"line_number":347,"context_line":"        novaclient.servers.add_security_group(resource.physical_resource_id,"},{"line_number":348,"context_line":"                                              security_groups[0])"},{"line_number":349,"context_line":"        resource \u003d client.resources.get(stack.id, \u0027DataVolume\u0027)"},{"line_number":350,"context_line":"        volume \u003d cinderclient.volumes.get(resource.physical_resource_id)"},{"line_number":351,"context_line":"        volume_info \u003d self._build_volume(volume)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F%2FAoQ%3D","line":348,"in_reply_to":"AAAATn%2F%2FL7w%3D","updated":"2013-11-15 18:49:17.000000000","message":"ya i agree that we need to only care about 1 instance now. If anything we can make a note saying we need to revisit this area when we build clustering in.","commit_id":"b36bfc5aaa9bd6a3ad53624c914ee8d3e16110f0"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"15152e3682f8b92c83232681f80fd96045c15282","unresolved":false,"context_lines":[{"line_number":345,"context_line":"        resource \u003d client.resources.get(stack.id, \u0027BaseInstance\u0027)"},{"line_number":346,"context_line":"        server \u003d novaclient.servers.get(resource.physical_resource_id)"},{"line_number":347,"context_line":"        novaclient.servers.add_security_group(resource.physical_resource_id,"},{"line_number":348,"context_line":"                                              security_groups[0])"},{"line_number":349,"context_line":"        resource \u003d client.resources.get(stack.id, \u0027DataVolume\u0027)"},{"line_number":350,"context_line":"        volume \u003d cinderclient.volumes.get(resource.physical_resource_id)"},{"line_number":351,"context_line":"        volume_info \u003d self._build_volume(volume)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F%2FL7w%3D","line":348,"in_reply_to":"AAAATn%2F%2FNEU%3D","updated":"2013-11-13 07:39:09.000000000","message":"until we are talking about single instance then this code is fine, heat instance group is not applicapable  until clustering would come.","commit_id":"b36bfc5aaa9bd6a3ad53624c914ee8d3e16110f0"},{"author":{"_account_id":1925,"name":"Vipul Sabhaya","email":"vipuls@gmail.com","username":"vipuls"},"change_message_id":"e53e87125c889226d73630966d193b27ac609b67","unresolved":false,"context_lines":[{"line_number":345,"context_line":"        resource \u003d client.resources.get(stack.id, \u0027BaseInstance\u0027)"},{"line_number":346,"context_line":"        server \u003d novaclient.servers.get(resource.physical_resource_id)"},{"line_number":347,"context_line":"        novaclient.servers.add_security_group(resource.physical_resource_id,"},{"line_number":348,"context_line":"                                              security_groups[0])"},{"line_number":349,"context_line":"        resource \u003d client.resources.get(stack.id, \u0027DataVolume\u0027)"},{"line_number":350,"context_line":"        volume \u003d cinderclient.volumes.get(resource.physical_resource_id)"},{"line_number":351,"context_line":"        volume_info \u003d self._build_volume(volume)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F%2FNEU%3D","line":348,"in_reply_to":"AAAATn%2F%2Fwus%3D","updated":"2013-11-12 23:21:56.000000000","message":"How does this work when we have \u003e1 instance being created by the template?","commit_id":"b36bfc5aaa9bd6a3ad53624c914ee8d3e16110f0"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"800ad18d3b8ba1458088d57ff173b57d5127940b","unresolved":false,"context_lines":[{"line_number":345,"context_line":"        resource \u003d client.resources.get(stack.id, \u0027BaseInstance\u0027)"},{"line_number":346,"context_line":"        server \u003d novaclient.servers.get(resource.physical_resource_id)"},{"line_number":347,"context_line":"        novaclient.servers.add_security_group(resource.physical_resource_id,"},{"line_number":348,"context_line":"                                              security_groups[0])"},{"line_number":349,"context_line":"        resource \u003d client.resources.get(stack.id, \u0027DataVolume\u0027)"},{"line_number":350,"context_line":"        volume \u003d cinderclient.volumes.get(resource.physical_resource_id)"},{"line_number":351,"context_line":"        volume_info \u003d self._build_volume(volume)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F%2Fwus%3D","line":348,"in_reply_to":"AAAATn%2F%2Fy84%3D","updated":"2013-10-29 13:12:39.000000000","message":"heat cannot add security group to instance resource even via stack update, that is why we are going to add security group to template and then it would not be optional.","commit_id":"b36bfc5aaa9bd6a3ad53624c914ee8d3e16110f0"},{"author":{"_account_id":1925,"name":"Vipul Sabhaya","email":"vipuls@gmail.com","username":"vipuls"},"change_message_id":"cd78ca2adf2eba1d9de620119e34afe0ab56bd63","unresolved":false,"context_lines":[{"line_number":345,"context_line":"        resource \u003d client.resources.get(stack.id, \u0027BaseInstance\u0027)"},{"line_number":346,"context_line":"        server \u003d novaclient.servers.get(resource.physical_resource_id)"},{"line_number":347,"context_line":"        novaclient.servers.add_security_group(resource.physical_resource_id,"},{"line_number":348,"context_line":"                                              security_groups[0])"},{"line_number":349,"context_line":"        resource \u003d client.resources.get(stack.id, \u0027DataVolume\u0027)"},{"line_number":350,"context_line":"        volume \u003d cinderclient.volumes.get(resource.physical_resource_id)"},{"line_number":351,"context_line":"        volume_info \u003d self._build_volume(volume)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F%2Fy84%3D","line":348,"in_reply_to":"AAAATn%2F%2FzN8%3D","updated":"2013-10-28 22:25:54.000000000","message":"Shouldn\u0027t this be done in the Heat Template itself?  If we do this here, that we\u0027re only going to be adding a sec group to a single instance within the stack, or did i miss something?","commit_id":"b36bfc5aaa9bd6a3ad53624c914ee8d3e16110f0"},{"author":{"_account_id":1375,"name":"Ed Cranford","email":"ed.cranford@gmail.com","username":"ed--cranford"},"change_message_id":"04c79ebe647cf604761dff882ea1b34028ce7ebf","unresolved":false,"context_lines":[{"line_number":345,"context_line":"        resource \u003d client.resources.get(stack.id, \u0027BaseInstance\u0027)"},{"line_number":346,"context_line":"        server \u003d novaclient.servers.get(resource.physical_resource_id)"},{"line_number":347,"context_line":"        novaclient.servers.add_security_group(resource.physical_resource_id,"},{"line_number":348,"context_line":"                                              security_groups[0])"},{"line_number":349,"context_line":"        resource \u003d client.resources.get(stack.id, \u0027DataVolume\u0027)"},{"line_number":350,"context_line":"        volume \u003d cinderclient.volumes.get(resource.physical_resource_id)"},{"line_number":351,"context_line":"        volume_info \u003d self._build_volume(volume)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F%2FzN8%3D","line":348,"in_reply_to":"AAAATn%2F%2FzR8%3D","updated":"2013-10-28 21:11:47.000000000","message":"I hope by \"would\" you mean \"will in the next patchset\" c:","commit_id":"b36bfc5aaa9bd6a3ad53624c914ee8d3e16110f0"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"739a46686cd0d8cf918590c51643fb18b60e7e9a","unresolved":false,"context_lines":[{"line_number":345,"context_line":"        resource \u003d client.resources.get(stack.id, \u0027BaseInstance\u0027)"},{"line_number":346,"context_line":"        server \u003d novaclient.servers.get(resource.physical_resource_id)"},{"line_number":347,"context_line":"        novaclient.servers.add_security_group(resource.physical_resource_id,"},{"line_number":348,"context_line":"                                              security_groups[0])"},{"line_number":349,"context_line":"        resource \u003d client.resources.get(stack.id, \u0027DataVolume\u0027)"},{"line_number":350,"context_line":"        volume \u003d cinderclient.volumes.get(resource.physical_resource_id)"},{"line_number":351,"context_line":"        volume_info \u003d self._build_volume(volume)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F%2FzR8%3D","line":348,"in_reply_to":"AAAATn%2F%2Fzpg%3D","updated":"2013-10-28 20:44:35.000000000","message":"We would do that in a loop.","commit_id":"b36bfc5aaa9bd6a3ad53624c914ee8d3e16110f0"},{"author":{"_account_id":9683,"name":"Mat Lowery","email":"mlowery@ebaysf.com","username":"mat-lowery"},"change_message_id":"27674353d1f2df7495dd4361f8eb36718556c9c2","unresolved":false,"context_lines":[{"line_number":145,"context_line":"                        availability_zone, root_password):"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"        security_groups \u003d None"},{"line_number":148,"context_line":"        if CONF.trove_security_groups_support:"},{"line_number":149,"context_line":"            try:"},{"line_number":150,"context_line":"                self._create_secgroup(service_type)"},{"line_number":151,"context_line":"            except Exception as e:"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F%2BVVk%3D","line":148,"updated":"2014-01-27 22:55:32.000000000","message":"Denis, can you point me to the \"guest with single conf review?\" I\u0027m trying to understand the status of the \"secgroup per datastore\" effort. Thanks.","commit_id":"ae4db9b75a084ac945cd8a9941439990a6106bed"},{"author":{"_account_id":739,"name":"Michael Basnight","email":"mbasnight@gmail.com","username":"hubcap"},"change_message_id":"9c870537f0a8d953a9aa0012f5f84ee2c38a51a7","unresolved":false,"context_lines":[{"line_number":145,"context_line":"                        availability_zone, root_password):"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"        security_groups \u003d None"},{"line_number":148,"context_line":"        if CONF.trove_security_groups_support:"},{"line_number":149,"context_line":"            try:"},{"line_number":150,"context_line":"                self._create_secgroup(service_type)"},{"line_number":151,"context_line":"            except Exception as e:"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F9njQ%3D","line":148,"updated":"2013-12-09 16:13:17.000000000","message":"Denis, in the last draft i said \n\nNow that we are using heat, we need to make sure that we arent using the heat template here. If we are using heat, then we should _not_ do any of this\n\nYou said you agree but you did not change the code. Can u also make sure heat_support is False here?","commit_id":"ae4db9b75a084ac945cd8a9941439990a6106bed"},{"author":{"_account_id":9683,"name":"Mat Lowery","email":"mlowery@ebaysf.com","username":"mat-lowery"},"change_message_id":"b7dcabcff20e6a5a1c23a95a88b39285393ae380","unresolved":false,"context_lines":[{"line_number":145,"context_line":"                        availability_zone, root_password):"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"        security_groups \u003d None"},{"line_number":148,"context_line":"        if CONF.trove_security_groups_support:"},{"line_number":149,"context_line":"            try:"},{"line_number":150,"context_line":"                self._create_secgroup(service_type)"},{"line_number":151,"context_line":"            except Exception as e:"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F%2BBOY%3D","line":148,"updated":"2014-01-31 05:23:33.000000000","message":"I think you just need to add the following to the if:\n\n  and not use_heat","commit_id":"ae4db9b75a084ac945cd8a9941439990a6106bed"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"f12f1c4ebece3fd1ac2ec2efdee14fbc5e373dae","unresolved":false,"context_lines":[{"line_number":145,"context_line":"                        availability_zone, root_password):"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"        security_groups \u003d None"},{"line_number":148,"context_line":"        if CONF.trove_security_groups_support:"},{"line_number":149,"context_line":"            try:"},{"line_number":150,"context_line":"                self._create_secgroup(service_type)"},{"line_number":151,"context_line":"            except Exception as e:"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F9l04%3D","line":148,"in_reply_to":"AAAATn%2F9njQ%3D","updated":"2013-12-09 21:38:44.000000000","message":"this review already outdated, this patch will be rewritten when guest with single conf review lands at codebase.","commit_id":"ae4db9b75a084ac945cd8a9941439990a6106bed"},{"author":{"_account_id":9683,"name":"Mat Lowery","email":"mlowery@ebaysf.com","username":"mat-lowery"},"change_message_id":"9264ccfa91c97fa86729d121bbb9a7f2fa74dbbe","unresolved":false,"context_lines":[{"line_number":526,"context_line":"    def _create_secgroup(self, service_type):"},{"line_number":527,"context_line":"        security_group \u003d SecurityGroup.create_for_instance(self.id,"},{"line_number":528,"context_line":"                                                           self.context)"},{"line_number":529,"context_line":"        SecurityGroupRule.create_sec_group_rule("},{"line_number":530,"context_line":"            security_group,"},{"line_number":531,"context_line":"            CONF.trove_security_group_rule_protocol,"},{"line_number":532,"context_line":"            CONF.datastore_read_write_port.get(service_type),"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F%2BOh0%3D","line":529,"updated":"2014-01-28 22:01:02.000000000","message":"We have some datastores that require multiple ports (e.g. cassandra) or port ranges (e.g. couchbase). Can this be modified to support that?","commit_id":"ae4db9b75a084ac945cd8a9941439990a6106bed"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"0002812e361c75a54cb34f02327ef13153b77a96","unresolved":false,"context_lines":[{"line_number":526,"context_line":"    def _create_secgroup(self, service_type):"},{"line_number":527,"context_line":"        security_group \u003d SecurityGroup.create_for_instance(self.id,"},{"line_number":528,"context_line":"                                                           self.context)"},{"line_number":529,"context_line":"        SecurityGroupRule.create_sec_group_rule("},{"line_number":530,"context_line":"            security_group,"},{"line_number":531,"context_line":"            CONF.trove_security_group_rule_protocol,"},{"line_number":532,"context_line":"            CONF.datastore_read_write_port.get(service_type),"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F9784%3D","line":529,"in_reply_to":"AAAAUH%2F%2BAFM%3D","updated":"2014-01-31 21:53:47.000000000","message":"oslo guys blocks all attempts to add more complex type, based upon DictOpt. So we would use already existed types.","commit_id":"ae4db9b75a084ac945cd8a9941439990a6106bed"},{"author":{"_account_id":9683,"name":"Mat Lowery","email":"mlowery@ebaysf.com","username":"mat-lowery"},"change_message_id":"b7dcabcff20e6a5a1c23a95a88b39285393ae380","unresolved":false,"context_lines":[{"line_number":526,"context_line":"    def _create_secgroup(self, service_type):"},{"line_number":527,"context_line":"        security_group \u003d SecurityGroup.create_for_instance(self.id,"},{"line_number":528,"context_line":"                                                           self.context)"},{"line_number":529,"context_line":"        SecurityGroupRule.create_sec_group_rule("},{"line_number":530,"context_line":"            security_group,"},{"line_number":531,"context_line":"            CONF.trove_security_group_rule_protocol,"},{"line_number":532,"context_line":"            CONF.datastore_read_write_port.get(service_type),"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F%2BAFM%3D","line":529,"in_reply_to":"AAAAUH%2F%2BOh0%3D","updated":"2014-01-31 05:23:33.000000000","message":"Perhaps something like the following would support port ranges? Note: The DictOpt value would be a whitespace-separated list of ports and/or port ranges.\n\nHelper:\n\n    def _split_port_string(self, line):\n        \"\"\"\n        Splits a string of the form \u00273306 3308-3310\u0027 into\n        [(3306, 3306), (3308, 3310)]\n        \"\"\"\n        if not line:\n            return list()\n        ports \u003d list()\n        if \u0027-\u0027 in line.split():\n            raise ValueError(\u0027ranges cannot contain whitespace\u0027)\n        for p in line.split():\n            tokens \u003d p.split(\u0027-\u0027)\n            if len(tokens) \u003d\u003d 2:\n                ports.append((int(tokens[0].strip()), int(tokens[1].strip())))\n            else:\n                ports.append((int(tokens[0].strip()), int(tokens[0].strip())))\n        return ports\n\nUsage:\n\n    def _create_secgroup(self, service_type):\n        security_group \u003d SecurityGroup.create_for_instance(self.id,\n                                                           self.context)\n\n        port_string \u003d CONF.datastore_read_write_port.get(service_type)\n        port_pairs \u003d self._split_port_string(port_string)\n\n        for port_pair in port_pairs:\n            SecurityGroupRule.create_sec_group_rule(\n                security_group,\n                CONF.trove_security_group_rule_protocol,\n                port_pair[0],\n                port_pair[1],\n                CONF.trove_security_group_rule_cidr,\n                self.context\n            )\n        return [security_group[\"name\"]]\n\nAnd a unit test to go in taskmanager/test_models.py:\n\n    def test_split_port_string(self):\n        ports \u003d self.freshinstancetasks._split_port_string(None)\n        self.assertEqual(ports, [])\n\n        ports \u003d self.freshinstancetasks._split_port_string(\u0027\u0027)\n        self.assertEqual(ports, [])\n\n        ports \u003d self.freshinstancetasks._split_port_string(\u0027 \u0027)\n        self.assertEqual(ports, [])\n\n        ports \u003d self.freshinstancetasks._split_port_string(\u00273306\u0027)\n        self.assertEqual(ports, [(3306, 3306)])\n\n        ports \u003d self.freshinstancetasks._split_port_string(\n            \u00273306  3307-3309   3400\u0027)\n        self.assertEqual(ports, [(3306, 3306), (3307, 3309), (3400, 3400)])\n\n        self.assertRaises(ValueError,\n                          self.freshinstancetasks._split_port_string,\n                          \u00273307 - 3309\u0027)\n\nA side note: It appears that the latest oslo.config has an easy was to add custom processing to DictOpt types:\n\n    class CustomDictOpt(Opt):\n\n        \"\"\"Opt with Dict(String) type (for backward compatibility).\"\"\"\n\n        def __init__(self, name, **kwargs):\n            super(DictOpt, self).__init__(name, type\u003dtypes.Dict(value_type\u003dmyhandler), **kwargs)","commit_id":"ae4db9b75a084ac945cd8a9941439990a6106bed"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"0002812e361c75a54cb34f02327ef13153b77a96","unresolved":false,"context_lines":[{"line_number":526,"context_line":"    def _create_secgroup(self, service_type):"},{"line_number":527,"context_line":"        security_group \u003d SecurityGroup.create_for_instance(self.id,"},{"line_number":528,"context_line":"                                                           self.context)"},{"line_number":529,"context_line":"        SecurityGroupRule.create_sec_group_rule("},{"line_number":530,"context_line":"            security_group,"},{"line_number":531,"context_line":"            CONF.trove_security_group_rule_protocol,"},{"line_number":532,"context_line":"            CONF.datastore_read_write_port.get(service_type),"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F979c%3D","line":529,"in_reply_to":"AAAAUH%2F%2BOh0%3D","updated":"2014-01-31 21:53:47.000000000","message":"as i said we would have two lists per datastore:\n1. tcp_ports (ListOption)\n2. udp_ports (ListOption)\n3. cidr is constant\n4. No port ranges, only specific ports that database provides by default.","commit_id":"ae4db9b75a084ac945cd8a9941439990a6106bed"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"5aef85854f7db20eb32d2508af4efa4097e26666","unresolved":false,"context_lines":[{"line_number":526,"context_line":"    def _create_secgroup(self, service_type):"},{"line_number":527,"context_line":"        security_group \u003d SecurityGroup.create_for_instance(self.id,"},{"line_number":528,"context_line":"                                                           self.context)"},{"line_number":529,"context_line":"        SecurityGroupRule.create_sec_group_rule("},{"line_number":530,"context_line":"            security_group,"},{"line_number":531,"context_line":"            CONF.trove_security_group_rule_protocol,"},{"line_number":532,"context_line":"            CONF.datastore_read_write_port.get(service_type),"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F97gg%3D","line":529,"in_reply_to":"AAAAUH%2F979c%3D","updated":"2014-01-31 23:23:22.000000000","message":"Denis: agreed on avoiding oslo-related changes. the listoption approach is fine, but the list needs to support ranges.\n\notherwise, couchbase will require this\n\ntcp_ports \u003d 4369,8091,8092,11209,11210,11211,21100,21101,21102,21103,21104,21105,21106,21107,21108,21109,21110,\n21111,21112,21113,21114,21115,21116,21117,21118,21119,21120,21121,21122,21123,21124,21125,21126,\n21127,21128,21129,21130,21131,21132,21133,21134,21135,21136,21137,21138,21139,21140,21141,21142,\n21143,21144,21145,21146,21147,21148,21149,21150,21151,21152,21153,21154,21155,21156,21157,21158,\n21159,21160,21161,21162,21163,21164,21165,21166,21167,21168,21169,21170,21171,21172,21173,21174,\n21175,21176,21177,21178,21179,21180,21181,21182,21183,21184,21185,21186,21187,21188,21189,21190,\n21191,21192,21193,21194,21195,21196,21197,21198,21199\n\nvs\n\ntcp_port \u003d 4369,8091,8092,11209-11211,21100-21199\n\nsecurity-groups in nova already support ranges, so this isn\u0027t stretch. and to the inevitable \"but couchbase isn\u0027t supported\": it will be, very soon.","commit_id":"ae4db9b75a084ac945cd8a9941439990a6106bed"},{"author":{"_account_id":9683,"name":"Mat Lowery","email":"mlowery@ebaysf.com","username":"mat-lowery"},"change_message_id":"04cbca406aa2fb7e9733228c98783fc6a386e519","unresolved":false,"context_lines":[{"line_number":615,"context_line":"        self._create_rules(security_group, upd_ports, \u0027upd\u0027)"},{"line_number":616,"context_line":"        return [security_group[\"name\"]]"},{"line_number":617,"context_line":""},{"line_number":618,"context_line":"    def _create_rules(self, s_group, ports, protocol):"},{"line_number":619,"context_line":"        if ports:"},{"line_number":620,"context_line":"            # If ports list contains duplicated"},{"line_number":621,"context_line":"            # entities they will be dropped"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUH%2F9uC4%3D","line":618,"updated":"2014-02-04 17:45:43.000000000","message":"Unit tests?","commit_id":"8eeab1f89cba7c62ad419023e336e9aa40708541"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"26cc4cf88eee28e6c3e7d626070b8e966d34ee22","unresolved":false,"context_lines":[{"line_number":612,"context_line":"        tcp_ports \u003d CONF.get(datastore_manager).tcp_ports"},{"line_number":613,"context_line":"        upd_ports \u003d CONF.get(datastore_manager).udp_ports"},{"line_number":614,"context_line":"        self._create_rules(security_group, tcp_ports, \u0027tcp\u0027)"},{"line_number":615,"context_line":"        self._create_rules(security_group, upd_ports, \u0027upd\u0027)"},{"line_number":616,"context_line":"        return [security_group[\"name\"]]"},{"line_number":617,"context_line":""},{"line_number":618,"context_line":"    def _create_rules(self, s_group, ports, protocol):"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUH%2F9t4g%3D","line":615,"updated":"2014-02-04 18:18:12.000000000","message":"upd should be udp (see two mistakes above).","commit_id":"71b7ef991606465f2a132ef789acdaac9c393dc2"},{"author":{"_account_id":5390,"name":"Steve Leon","username":"steve-leon","inactive":true},"change_message_id":"7144add16ae1af27581d09f33a0c46681c770b98","unresolved":false,"context_lines":[{"line_number":620,"context_line":"            # If ports list contains duplicated"},{"line_number":621,"context_line":"            # single port or port range"},{"line_number":622,"context_line":"            # they will be dropped"},{"line_number":623,"context_line":"            for port_or_range in list(set(ports)):"},{"line_number":624,"context_line":"                if \"-\" in port_or_range:"},{"line_number":625,"context_line":"                    from_, to_ \u003d port_or_range.split(\"-\")"},{"line_number":626,"context_line":"                    if len(from_) \u003d\u003d 0 or len(to_) \u003d\u003d 0:"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAUH%2F9m3E%3D","line":623,"updated":"2014-02-05 17:55:10.000000000","message":"Don\u0027t need to convert the set to a list object since you are just iterating over the set","commit_id":"f86af614c0e53d7587fe37e3a35056df2577822c"},{"author":{"_account_id":9683,"name":"Mat Lowery","email":"mlowery@ebaysf.com","username":"mat-lowery"},"change_message_id":"baeec247dcbd965a56e985465a477345824cf715","unresolved":false,"context_lines":[{"line_number":609,"context_line":"    def _create_secgroup(self, datastore_manager):"},{"line_number":610,"context_line":"        security_group \u003d SecurityGroup.create_for_instance(self.id,"},{"line_number":611,"context_line":"                                                           self.context)"},{"line_number":612,"context_line":"        tcp_ports \u003d CONF.get(datastore_manager).tcp_ports"},{"line_number":613,"context_line":"        upd_ports \u003d CONF.get(datastore_manager).udp_ports"},{"line_number":614,"context_line":"        self._create_rules(security_group, tcp_ports, \u0027tcp\u0027)"},{"line_number":615,"context_line":"        self._create_rules(security_group, upd_ports, \u0027udp\u0027)"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAUH%2F9jZw%3D","line":612,"updated":"2014-02-06 04:13:06.000000000","message":"FYI: You\u0027ll get oslo.config.cfg.NoSuchOptError if the datastore group isn\u0027t there. Is it useful to catch that and raise a more useful error message?","commit_id":"8e2bf647672e2ca187e18bc922fd453f99cdb21e"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"99e2a189b2423b98ad4740ec53403088fe217da1","unresolved":false,"context_lines":[{"line_number":609,"context_line":"    def _create_secgroup(self, datastore_manager):"},{"line_number":610,"context_line":"        security_group \u003d SecurityGroup.create_for_instance(self.id,"},{"line_number":611,"context_line":"                                                           self.context)"},{"line_number":612,"context_line":"        tcp_ports \u003d CONF.get(datastore_manager).tcp_ports"},{"line_number":613,"context_line":"        upd_ports \u003d CONF.get(datastore_manager).udp_ports"},{"line_number":614,"context_line":"        self._create_rules(security_group, tcp_ports, \u0027tcp\u0027)"},{"line_number":615,"context_line":"        self._create_rules(security_group, upd_ports, \u0027udp\u0027)"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAUH%2F9iyg%3D","line":612,"in_reply_to":"AAAAUH%2F9jZw%3D","updated":"2014-02-06 06:12:39.000000000","message":"No, because if you implement new datastore integration you will add new groups and this exception will be never raised. Also, all patches should be tested, and developer will see that he misses some configuration peaces.","commit_id":"8e2bf647672e2ca187e18bc922fd453f99cdb21e"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"8474dd272eee0fc3b3f79105a0fd4d1fa679b080","unresolved":false,"context_lines":[{"line_number":610,"context_line":"        security_group \u003d SecurityGroup.create_for_instance(self.id,"},{"line_number":611,"context_line":"                                                           self.context)"},{"line_number":612,"context_line":"        tcp_ports \u003d CONF.get(datastore_manager).tcp_ports"},{"line_number":613,"context_line":"        upd_ports \u003d CONF.get(datastore_manager).udp_ports"},{"line_number":614,"context_line":"        self._create_rules(security_group, tcp_ports, \u0027tcp\u0027)"},{"line_number":615,"context_line":"        self._create_rules(security_group, upd_ports, \u0027udp\u0027)"},{"line_number":616,"context_line":"        return [security_group[\"name\"]]"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAUH%2F9lfY%3D","line":613,"updated":"2014-02-05 21:05:28.000000000","message":"upd_ports should be udp_ports","commit_id":"8e2bf647672e2ca187e18bc922fd453f99cdb21e"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"8474dd272eee0fc3b3f79105a0fd4d1fa679b080","unresolved":false,"context_lines":[{"line_number":612,"context_line":"        tcp_ports \u003d CONF.get(datastore_manager).tcp_ports"},{"line_number":613,"context_line":"        upd_ports \u003d CONF.get(datastore_manager).udp_ports"},{"line_number":614,"context_line":"        self._create_rules(security_group, tcp_ports, \u0027tcp\u0027)"},{"line_number":615,"context_line":"        self._create_rules(security_group, upd_ports, \u0027udp\u0027)"},{"line_number":616,"context_line":"        return [security_group[\"name\"]]"},{"line_number":617,"context_line":""},{"line_number":618,"context_line":"    def _create_rules(self, s_group, ports, protocol):"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAUH%2F9lfc%3D","line":615,"updated":"2014-02-05 21:05:28.000000000","message":"upd_ports should be udp_ports","commit_id":"8e2bf647672e2ca187e18bc922fd453f99cdb21e"},{"author":{"_account_id":9683,"name":"Mat Lowery","email":"mlowery@ebaysf.com","username":"mat-lowery"},"change_message_id":"baeec247dcbd965a56e985465a477345824cf715","unresolved":false,"context_lines":[{"line_number":624,"context_line":"                if \"-\" in port_or_range:"},{"line_number":625,"context_line":"                    from_, to_ \u003d port_or_range.split(\"-\")"},{"line_number":626,"context_line":"                    if len(from_) \u003d\u003d 0 or len(to_) \u003d\u003d 0:"},{"line_number":627,"context_line":"                        raise TroveError("},{"line_number":628,"context_line":"                            \u0027Error creating security group rules. \u0027"},{"line_number":629,"context_line":"                            \u0027Wrong port range format.\u0027"},{"line_number":630,"context_line":"                            \u0027FromPort \u003d %(from)s, ToPort \u003d %(to)s\u0027 %"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAUH%2F9jdw%3D","line":627,"updated":"2014-02-06 04:13:06.000000000","message":"Nice to have: Richer exception types so that you don\u0027t have to parse error messages in unit tests.What about MalformedSecurityGroupRuleError(TroveError)?","commit_id":"8e2bf647672e2ca187e18bc922fd453f99cdb21e"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"99e2a189b2423b98ad4740ec53403088fe217da1","unresolved":false,"context_lines":[{"line_number":624,"context_line":"                if \"-\" in port_or_range:"},{"line_number":625,"context_line":"                    from_, to_ \u003d port_or_range.split(\"-\")"},{"line_number":626,"context_line":"                    if len(from_) \u003d\u003d 0 or len(to_) \u003d\u003d 0:"},{"line_number":627,"context_line":"                        raise TroveError("},{"line_number":628,"context_line":"                            \u0027Error creating security group rules. \u0027"},{"line_number":629,"context_line":"                            \u0027Wrong port range format.\u0027"},{"line_number":630,"context_line":"                            \u0027FromPort \u003d %(from)s, ToPort \u003d %(to)s\u0027 %"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAUH%2F9ixs%3D","line":627,"in_reply_to":"AAAAUH%2F9jdw%3D","updated":"2014-02-06 06:12:39.000000000","message":"Where have you seen message parsing in unit tests ??\nNegative unit tests just examins that raised exception was raised because of specific error.\nAnd i personaly don\u0027t like the idea of population tons of exception classes  which will be used once or twice. TroveError is enough","commit_id":"8e2bf647672e2ca187e18bc922fd453f99cdb21e"},{"author":{"_account_id":9683,"name":"Mat Lowery","email":"mlowery@ebaysf.com","username":"mat-lowery"},"change_message_id":"0813cc4f67c33b277e8326934e1d05e95dbb29bd","unresolved":false,"context_lines":[{"line_number":617,"context_line":"        self._create_rules(security_group, udp_ports, \u0027udp\u0027)"},{"line_number":618,"context_line":"        return [security_group[\"name\"]]"},{"line_number":619,"context_line":""},{"line_number":620,"context_line":"    def _create_rules(self, s_group, ports, protocol):"},{"line_number":621,"context_line":"        if ports:"},{"line_number":622,"context_line":"            # If ports list contains duplicated"},{"line_number":623,"context_line":"            # single port or port range"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUH%2F9e1Y%3D","line":620,"updated":"2014-02-06 16:25:06.000000000","message":"Perhaps it would be better to check all of the values \"up front\"-- prior to beginning rule creation. That way, you aren\u0027t left with a half-created set of rules. In other words, parse the config creating a new set of integer pairs then iterate over that creating the rules.","commit_id":"c51b337c4e8b9c9eb84981fae043bbef656ee52d"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"4b8591a5c672380238f3cc02cf34018b5cf32fa3","unresolved":false,"context_lines":[{"line_number":617,"context_line":"        self._create_rules(security_group, udp_ports, \u0027udp\u0027)"},{"line_number":618,"context_line":"        return [security_group[\"name\"]]"},{"line_number":619,"context_line":""},{"line_number":620,"context_line":"    def _create_rules(self, s_group, ports, protocol):"},{"line_number":621,"context_line":"        if ports:"},{"line_number":622,"context_line":"            # If ports list contains duplicated"},{"line_number":623,"context_line":"            # single port or port range"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUH%2F9els%3D","line":620,"in_reply_to":"AAAAUH%2F9e1Y%3D","updated":"2014-02-06 16:39:54.000000000","message":"I still think that this solution is enough, no need to invent a new wheel.\nThere are checks for all cases. In it\u0027s not bad case if you will fail with half build security group, you still be able to delete instance. So, i don\u0027t see an issue, at all.","commit_id":"c51b337c4e8b9c9eb84981fae043bbef656ee52d"},{"author":{"_account_id":9683,"name":"Mat Lowery","email":"mlowery@ebaysf.com","username":"mat-lowery"},"change_message_id":"0813cc4f67c33b277e8326934e1d05e95dbb29bd","unresolved":false,"context_lines":[{"line_number":653,"context_line":"                            self.update_db(task_status\u003derr)"},{"line_number":654,"context_line":"                            msg \u003d (_(\u0027Error creating security group rules. \u0027"},{"line_number":655,"context_line":"                                     \u0027Malformed port(s). Port mentioned in \u0027"},{"line_number":656,"context_line":"                                     \u0027irreducible type. FromPort \u003d %(from)s \u0027"},{"line_number":657,"context_line":"                                     \u0027greater than ToPort \u003d %(to)s\u0027) %"},{"line_number":658,"context_line":"                                   {\u0027from\u0027: from_, \u0027to\u0027: to_})"},{"line_number":659,"context_line":"                            raise MalformedSecurityGroupRuleError(message\u003dmsg)"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUH%2F9e0k%3D","line":656,"updated":"2014-02-06 16:25:06.000000000","message":"To me, the word \"irreducible\" doesn\u0027t immediately make it clear what the problem is. What you\u0027re trying to convey is something is \"not an integer\". Perhaps the simpler wording is better?","commit_id":"c51b337c4e8b9c9eb84981fae043bbef656ee52d"},{"author":{"_account_id":9683,"name":"Mat Lowery","email":"mlowery@ebaysf.com","username":"mat-lowery"},"change_message_id":"0813cc4f67c33b277e8326934e1d05e95dbb29bd","unresolved":false,"context_lines":[{"line_number":654,"context_line":"                            msg \u003d (_(\u0027Error creating security group rules. \u0027"},{"line_number":655,"context_line":"                                     \u0027Malformed port(s). Port mentioned in \u0027"},{"line_number":656,"context_line":"                                     \u0027irreducible type. FromPort \u003d %(from)s \u0027"},{"line_number":657,"context_line":"                                     \u0027greater than ToPort \u003d %(to)s\u0027) %"},{"line_number":658,"context_line":"                                   {\u0027from\u0027: from_, \u0027to\u0027: to_})"},{"line_number":659,"context_line":"                            raise MalformedSecurityGroupRuleError(message\u003dmsg)"},{"line_number":660,"context_line":"                else:"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUH%2F9eyU%3D","line":657,"updated":"2014-02-06 16:25:06.000000000","message":"The exception cause here is \"not an integer\" yet the message states that \"FromPort greater than ToPort\" which cannot be the case as the strings are not parseable to integers.","commit_id":"c51b337c4e8b9c9eb84981fae043bbef656ee52d"},{"author":{"_account_id":9683,"name":"Mat Lowery","email":"mlowery@ebaysf.com","username":"mat-lowery"},"change_message_id":"0813cc4f67c33b277e8326934e1d05e95dbb29bd","unresolved":false,"context_lines":[{"line_number":671,"context_line":"                        self.update_db(task_status\u003derr)"},{"line_number":672,"context_line":"                        msg \u003d (_(\u0027Error creating security group rules. \u0027"},{"line_number":673,"context_line":"                                 \u0027Malformed port(s). Port mentioned in \u0027"},{"line_number":674,"context_line":"                                 \u0027irreducible type. FromPort \u003d %(from)s \u0027"},{"line_number":675,"context_line":"                                 \u0027greater than ToPort \u003d %(to)s\u0027) %"},{"line_number":676,"context_line":"                               {\u0027from\u0027: from_, \u0027to\u0027: to_})"},{"line_number":677,"context_line":"                        raise MalformedSecurityGroupRuleError(message\u003dmsg)"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUH%2F9euM%3D","line":674,"updated":"2014-02-06 16:25:06.000000000","message":"See above comment about \"irreducible\".","commit_id":"c51b337c4e8b9c9eb84981fae043bbef656ee52d"},{"author":{"_account_id":9683,"name":"Mat Lowery","email":"mlowery@ebaysf.com","username":"mat-lowery"},"change_message_id":"0813cc4f67c33b277e8326934e1d05e95dbb29bd","unresolved":false,"context_lines":[{"line_number":672,"context_line":"                        msg \u003d (_(\u0027Error creating security group rules. \u0027"},{"line_number":673,"context_line":"                                 \u0027Malformed port(s). Port mentioned in \u0027"},{"line_number":674,"context_line":"                                 \u0027irreducible type. FromPort \u003d %(from)s \u0027"},{"line_number":675,"context_line":"                                 \u0027greater than ToPort \u003d %(to)s\u0027) %"},{"line_number":676,"context_line":"                               {\u0027from\u0027: from_, \u0027to\u0027: to_})"},{"line_number":677,"context_line":"                        raise MalformedSecurityGroupRuleError(message\u003dmsg)"},{"line_number":678,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUH%2F9e0I%3D","line":675,"updated":"2014-02-06 16:25:06.000000000","message":"The exception cause here is \"not an integer\" yet the message states that \"FromPort greater than ToPort\" which cannot be the case as the strings are not parseable to integers.","commit_id":"c51b337c4e8b9c9eb84981fae043bbef656ee52d"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"d5a67c4ec06fd13ccde8eaae68f00cdcb6a60a35","unresolved":false,"context_lines":[{"line_number":642,"context_line":"        self._create_rules(security_group, udp_ports, \u0027udp\u0027)"},{"line_number":643,"context_line":"        return [security_group[\"name\"]]"},{"line_number":644,"context_line":""},{"line_number":645,"context_line":"    def _create_rules(self, s_group, ports, protocol):"},{"line_number":646,"context_line":"        if ports:"},{"line_number":647,"context_line":"            # If ports list contains duplicated"},{"line_number":648,"context_line":"            # single port or port range"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAUX%2F%2Fj%2BQ%3D","line":645,"updated":"2014-02-12 10:28:33.000000000","message":"the try/except handling can be a bit cleaner here, but i\u0027ll let someone else chime in if they feel strongly about making this more elegant.","commit_id":"6e3ee67f892a0b18970f36f38ac289d754c87f95"},{"author":{"_account_id":739,"name":"Michael Basnight","email":"mbasnight@gmail.com","username":"hubcap"},"change_message_id":"e71bbd334c79f78467c3ed2938638d8f5efc4410","unresolved":false,"context_lines":[{"line_number":642,"context_line":"        self._create_rules(security_group, udp_ports, \u0027udp\u0027)"},{"line_number":643,"context_line":"        return [security_group[\"name\"]]"},{"line_number":644,"context_line":""},{"line_number":645,"context_line":"    def _create_rules(self, s_group, ports, protocol):"},{"line_number":646,"context_line":"        if ports:"},{"line_number":647,"context_line":"            # If ports list contains duplicated"},{"line_number":648,"context_line":"            # single port or port range"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAUX%2F%2Fc6E%3D","line":645,"in_reply_to":"AAAAUX%2F%2Fj%2BQ%3D","updated":"2014-02-13 04:35:30.000000000","message":"So, i think the code can be cleaned up. Please see [1] for my take on things. I didnt actually test this code, so plz dont just copy it, just use it as a guide.\n\nSo i dont think we need to worry about a different error message, since this is not something that a user will see, just an operator. They will be able to determine that 1-foot or 9999-2 are wrong with a generic message :P\n\n[1] https://gist.github.com/hub-cap/8969562","commit_id":"6e3ee67f892a0b18970f36f38ac289d754c87f95"}],"trove/tests/unittests/taskmanager/test_models.py":[{"author":{"_account_id":9683,"name":"Mat Lowery","email":"mlowery@ebaysf.com","username":"mat-lowery"},"change_message_id":"baeec247dcbd965a56e985465a477345824cf715","unresolved":false,"context_lines":[{"line_number":243,"context_line":"        taskmanager_models.CONF.get \u003d Mock(return_value\u003dFakeOptGroup())"},{"line_number":244,"context_line":"        taskmanager_models.SecurityGroupRule.create_sec_group_rule \u003d Mock()"},{"line_number":245,"context_line":"        sg_name \u003d self.freshinstancetasks._create_secgroup(datastore_manager)"},{"line_number":246,"context_line":"        self.assertIsNotNone(sg_name)"},{"line_number":247,"context_line":""},{"line_number":248,"context_line":"    def test_create_sg_rules_format_exception_raised(self):"},{"line_number":249,"context_line":"        datastore_manager \u003d \u0027mysql\u0027"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAUH%2F9jXY%3D","line":246,"updated":"2014-02-06 04:13:06.000000000","message":"I don\u0027t see why the following (from the test below) shouldn\u0027t be in this test:\n\n    self.assertEqual(2, taskmanager_models.SecurityGroupRule.\n                     create_sec_group_rule.call_count)\n\nAlso, seems like the inputs to the SecurityGroupRule.create_sec_group_rule function could be validated. There isn\u0027t a test case that validates these.","commit_id":"8e2bf647672e2ca187e18bc922fd453f99cdb21e"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"99e2a189b2423b98ad4740ec53403088fe217da1","unresolved":false,"context_lines":[{"line_number":243,"context_line":"        taskmanager_models.CONF.get \u003d Mock(return_value\u003dFakeOptGroup())"},{"line_number":244,"context_line":"        taskmanager_models.SecurityGroupRule.create_sec_group_rule \u003d Mock()"},{"line_number":245,"context_line":"        sg_name \u003d self.freshinstancetasks._create_secgroup(datastore_manager)"},{"line_number":246,"context_line":"        self.assertIsNotNone(sg_name)"},{"line_number":247,"context_line":""},{"line_number":248,"context_line":"    def test_create_sg_rules_format_exception_raised(self):"},{"line_number":249,"context_line":"        datastore_manager \u003d \u0027mysql\u0027"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAUH%2F9ixI%3D","line":246,"in_reply_to":"AAAAUH%2F9jXY%3D","updated":"2014-02-06 06:12:39.000000000","message":"Unit test below examins code with port list that contains duplicated values.\n\nAnd there are enough validations in nova, enough validations in implemented function (upper/lower range, duplicates, content validation), all cases are covered by tests.","commit_id":"8e2bf647672e2ca187e18bc922fd453f99cdb21e"},{"author":{"_account_id":9683,"name":"Mat Lowery","email":"mlowery@ebaysf.com","username":"mat-lowery"},"change_message_id":"0813cc4f67c33b277e8326934e1d05e95dbb29bd","unresolved":false,"context_lines":[{"line_number":249,"context_line":"        taskmanager_models.CONF.get \u003d Mock(return_value\u003dFakeOptGroup())"},{"line_number":250,"context_line":"        taskmanager_models.SecurityGroupRule.create_sec_group_rule \u003d Mock()"},{"line_number":251,"context_line":"        sg_name \u003d self.freshinstancetasks._create_secgroup(datastore_manager)"},{"line_number":252,"context_line":"        self.assertIsNotNone(sg_name)"},{"line_number":253,"context_line":""},{"line_number":254,"context_line":"    def test_create_sg_rules_format_exception_raised(self):"},{"line_number":255,"context_line":"        datastore_manager \u003d \u0027mysql\u0027"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUH%2F9e7k%3D","line":252,"updated":"2014-02-06 16:25:06.000000000","message":"I still think this should test the following (as is done below):\n\nself.assertEqual(2, taskmanager_models.SecurityGroupRule.\n                 create_sec_group_rule.call_count)","commit_id":"c51b337c4e8b9c9eb84981fae043bbef656ee52d"},{"author":{"_account_id":9683,"name":"Mat Lowery","email":"mlowery@ebaysf.com","username":"mat-lowery"},"change_message_id":"0813cc4f67c33b277e8326934e1d05e95dbb29bd","unresolved":false,"context_lines":[{"line_number":277,"context_line":"        err \u003d self.assertRaises(MalformedSecurityGroupRuleError,"},{"line_number":278,"context_line":"                                self.freshinstancetasks._create_secgroup,"},{"line_number":279,"context_line":"                                datastore_manager)"},{"line_number":280,"context_line":"        self.assertIn(\u0027greater than\u0027, err.message)"},{"line_number":281,"context_line":""},{"line_number":282,"context_line":"    def test_create_sg_rules_success_with_duplicated_port_or_range(self):"},{"line_number":283,"context_line":"        datastore_manager \u003d \u0027mysql\u0027"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUH%2F9e5U%3D","line":280,"updated":"2014-02-06 16:25:06.000000000","message":"The ultimate goal of suggesting MalformedSecurityGroupRuleError was to eliminate assertIn calls which seem fragile. Perhaps the best compromise between hundreds of exception types and one exception type (i.e. TroveError) is to have a MalformedSecurityGroupRuleError with a status code. One status code is \"parse error\". Another status code is \"range error\". Final status code is \"integer error\".","commit_id":"c51b337c4e8b9c9eb84981fae043bbef656ee52d"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"4b8591a5c672380238f3cc02cf34018b5cf32fa3","unresolved":false,"context_lines":[{"line_number":277,"context_line":"        err \u003d self.assertRaises(MalformedSecurityGroupRuleError,"},{"line_number":278,"context_line":"                                self.freshinstancetasks._create_secgroup,"},{"line_number":279,"context_line":"                                datastore_manager)"},{"line_number":280,"context_line":"        self.assertIn(\u0027greater than\u0027, err.message)"},{"line_number":281,"context_line":""},{"line_number":282,"context_line":"    def test_create_sg_rules_success_with_duplicated_port_or_range(self):"},{"line_number":283,"context_line":"        datastore_manager \u003d \u0027mysql\u0027"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUH%2F9en4%3D","line":280,"in_reply_to":"AAAAUH%2F9e5U%3D","updated":"2014-02-06 16:39:54.000000000","message":"I would not do this. Trove error doesn\u0027t have status code. \nProf: https://github.com/openstack/trove/blob/master/trove/common/exception.py#L39-L52\n\nIn any way, I\u0027ll leave assertIn, because messages could different.","commit_id":"c51b337c4e8b9c9eb84981fae043bbef656ee52d"}]}
