)]}'
{"octavia/common/constants.py":[{"author":{"_account_id":11685,"name":"Stephen Balukoff","email":"stephen@balukoff.com","username":"sbalukoff"},"change_message_id":"af2914cdd1b0bb0395e94faeab707713ea65f8cf","unresolved":false,"context_lines":[{"line_number":24,"context_line":"SESSION_PERSISTENCE_APP_COOKIE \u003d \u0027APP_COOKIE\u0027"},{"line_number":25,"context_line":"SUPPORTED_SP_TYPES \u003d (SESSION_PERSISTENCE_SOURCE_IP,"},{"line_number":26,"context_line":"                      SESSION_PERSISTENCE_HTTP_COOKIE,"},{"line_number":27,"context_line":"                      SESSION_PERSISTENCE_APP_COOKIE)"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"HEALTH_MONITOR_PING \u003d \u0027PING\u0027"},{"line_number":30,"context_line":"HEALTH_MONITOR_TCP \u003d \u0027TCP\u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"1abeadc6_dfbfd7a8","line":27,"updated":"2014-08-27 03:38:55.000000000","message":"Does it make sense to have a SESSION_PERSISTENCE_NONE type here to indicate that no session persistence is desired / required by the back-end? (I would hope that with most types of HTTP connections, session persistence should not be required.)\n\nAlso, what\u0027s the difference between HTTP_COOKIE and APP_COOKIE here?","commit_id":"26743bc32c26d5aadced8b5859fe15877d06171a"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"574c99418b12475623333a4a69ff818e3340cf17","unresolved":false,"context_lines":[{"line_number":24,"context_line":"SESSION_PERSISTENCE_APP_COOKIE \u003d \u0027APP_COOKIE\u0027"},{"line_number":25,"context_line":"SUPPORTED_SP_TYPES \u003d (SESSION_PERSISTENCE_SOURCE_IP,"},{"line_number":26,"context_line":"                      SESSION_PERSISTENCE_HTTP_COOKIE,"},{"line_number":27,"context_line":"                      SESSION_PERSISTENCE_APP_COOKIE)"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"HEALTH_MONITOR_PING \u003d \u0027PING\u0027"},{"line_number":30,"context_line":"HEALTH_MONITOR_TCP \u003d \u0027TCP\u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"1abeadc6_728a5665","line":27,"in_reply_to":"1abeadc6_dfbfd7a8","updated":"2014-08-27 23:10:48.000000000","message":"Wouldn\u0027t that mean then that for every table we\u0027d have to have a corresponding row in the session_persistence table that has the type set to SESSION_PERSISTENCE_NONE?  Seems like just not having an entry in the table is meaningful enough to say it doesn\u0027t have session persistence.\n\nAs for the difference between HTTP_COOKIE and APP_COOKIE, that is a good question.  My understanding was that the HTTP_COOKIE was strictly client side, the APP_COOKIE used appsession setting in haproxy, and was done by the loadbalancer.  However, it appears appsession is being deprecated and stick-tables should be used.","commit_id":"26743bc32c26d5aadced8b5859fe15877d06171a"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"c24f9a23c91e5b6c365a745dbe70f83920c53e78","unresolved":false,"context_lines":[{"line_number":46,"context_line":"PENDING_CREATE \u003d \u0027PENDING_CREATE\u0027"},{"line_number":47,"context_line":"DELETED \u003d \u0027DELETED\u0027"},{"line_number":48,"context_line":"SUPPORTED_PROVISIONING_STATUSES \u003d (ACTIVE, PENDING_DELETE, PENDING_CREATE,"},{"line_number":49,"context_line":"                                   PENDING_UPDATE, DELETED)"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"ONLINE \u003d \u0027ONLINE\u0027"},{"line_number":52,"context_line":"OFFLINE \u003d \u0027OFFLINE\u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"1abeadc6_a9f4db87","line":49,"updated":"2014-08-26 03:37:51.000000000","message":"Need to add ERROR","commit_id":"26743bc32c26d5aadced8b5859fe15877d06171a"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"028b22df208ed0a22064ba691dbed04e9c77a958","unresolved":false,"context_lines":[{"line_number":51,"context_line":"ONLINE \u003d \u0027ONLINE\u0027"},{"line_number":52,"context_line":"OFFLINE \u003d \u0027OFFLINE\u0027"},{"line_number":53,"context_line":"DEGRADED \u003d \u0027DEGRADED\u0027"},{"line_number":54,"context_line":"SUPPORTED_OPERATING_STATUSES \u003d (ONLINE, OFFLINE, DEGRADED)"}],"source_content_type":"text/x-python","patch_set":1,"id":"1abeadc6_f623b155","line":54,"updated":"2014-08-29 04:08:09.000000000","message":"Need to add ERROR","commit_id":"26743bc32c26d5aadced8b5859fe15877d06171a"},{"author":{"_account_id":11685,"name":"Stephen Balukoff","email":"stephen@balukoff.com","username":"sbalukoff"},"change_message_id":"7026400bb6d49821677b40bb6c26c81d546d7ec0","unresolved":false,"context_lines":[{"line_number":24,"context_line":"SESSION_PERSISTENCE_APP_COOKIE \u003d \u0027APP_COOKIE\u0027"},{"line_number":25,"context_line":"SUPPORTED_SP_TYPES \u003d (SESSION_PERSISTENCE_SOURCE_IP,"},{"line_number":26,"context_line":"                      SESSION_PERSISTENCE_HTTP_COOKIE,"},{"line_number":27,"context_line":"                      SESSION_PERSISTENCE_APP_COOKIE)"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"HEALTH_MONITOR_PING \u003d \u0027PING\u0027"},{"line_number":30,"context_line":"HEALTH_MONITOR_TCP \u003d \u0027TCP\u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"1abeadc6_640a2ad3","line":27,"updated":"2014-08-30 01:38:53.000000000","message":"Continuing last discussion:\n\nI\u0027m in favor of getting rid of the \u0027APP_COOKIE\u0027 session persistence type since it seems redundant with HTTP_COOKIE (which would be implemented in almost the same way, correct?)\n\nAlso, as for SESSION_PERSISTENCE_NONE:  If we\u0027re treating an empty field here as that, I suppose that\u0027s fine. We\u0027ll want to double-check that that field is actually nullable (I didn\u0027t think it was).","commit_id":"91c9ea4bc147825c4d4bbe8335b3be4e4f1ad4ef"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"2c72e18020f81fcbff6eb6aa27d3298d547b9b13","unresolved":false,"context_lines":[{"line_number":24,"context_line":"SESSION_PERSISTENCE_APP_COOKIE \u003d \u0027APP_COOKIE\u0027"},{"line_number":25,"context_line":"SUPPORTED_SP_TYPES \u003d (SESSION_PERSISTENCE_SOURCE_IP,"},{"line_number":26,"context_line":"                      SESSION_PERSISTENCE_HTTP_COOKIE,"},{"line_number":27,"context_line":"                      SESSION_PERSISTENCE_APP_COOKIE)"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"HEALTH_MONITOR_PING \u003d \u0027PING\u0027"},{"line_number":30,"context_line":"HEALTH_MONITOR_TCP \u003d \u0027TCP\u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"1abeadc6_f0e4303d","line":27,"in_reply_to":"1abeadc6_640a2ad3","updated":"2014-08-30 07:23:11.000000000","message":"Should we use an alternative to APP_COOKIE?  Only reason I ask is because neutron lbaas does have that (even in v2).  So if we remove it here I\u0027d push for removing it in neutron lbaas.  I\u0027d rather Octavia support everything Neutron LBaaS needs and more.\n\nSo session persistence is linked to a pool by the column pool_id in the session_persistence table.  If a pool doesn\u0027t have session persistence then there won\u0027t be a row in that table.  the type column is indeed not nullable, but session persistence is not required for a pool.","commit_id":"91c9ea4bc147825c4d4bbe8335b3be4e4f1ad4ef"},{"author":{"_account_id":11685,"name":"Stephen Balukoff","email":"stephen@balukoff.com","username":"sbalukoff"},"change_message_id":"a0a175e258f501920df59e7f002bd1e031f1c303","unresolved":false,"context_lines":[{"line_number":22,"context_line":"SESSION_PERSISTENCE_SOURCE_IP \u003d \u0027SOURCE_IP\u0027"},{"line_number":23,"context_line":"SESSION_PERSISTENCE_HTTP_COOKIE \u003d \u0027HTTP_COOKIE\u0027"},{"line_number":24,"context_line":"SUPPORTED_SP_TYPES \u003d (SESSION_PERSISTENCE_SOURCE_IP,"},{"line_number":25,"context_line":"                      SESSION_PERSISTENCE_HTTP_COOKIE)"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"HEALTH_MONITOR_PING \u003d \u0027PING\u0027"},{"line_number":28,"context_line":"HEALTH_MONITOR_TCP \u003d \u0027TCP\u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa98f980_9c728d0f","line":25,"updated":"2014-09-03 02:46:23.000000000","message":"Continuing comment from last time--  I\u0027d push for removing APP_COOKIE from Neutron LBaaS unless someone interested in keeping it can explain the justification for having it in light of HTTP_COOKIE already being there.\n\nAlso, thanks for the explanation of how session persistence ends up being effectively an optional attribute of the pool.","commit_id":"d705cfcb8aefd82e5e4d042a9ce2bc29ec823b4b"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"a082ccb8793f4e236b0a808e4a4d98b92bb7f17c","unresolved":false,"context_lines":[{"line_number":22,"context_line":"SESSION_PERSISTENCE_SOURCE_IP \u003d \u0027SOURCE_IP\u0027"},{"line_number":23,"context_line":"SESSION_PERSISTENCE_HTTP_COOKIE \u003d \u0027HTTP_COOKIE\u0027"},{"line_number":24,"context_line":"SUPPORTED_SP_TYPES \u003d (SESSION_PERSISTENCE_SOURCE_IP,"},{"line_number":25,"context_line":"                      SESSION_PERSISTENCE_HTTP_COOKIE)"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"HEALTH_MONITOR_PING \u003d \u0027PING\u0027"},{"line_number":28,"context_line":"HEALTH_MONITOR_TCP \u003d \u0027TCP\u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa98f980_777fc2ab","line":25,"in_reply_to":"fa98f980_9c728d0f","updated":"2014-09-03 03:45:30.000000000","message":"I think the only real reason to keep it, right now, is because neutron lbaas has it.  It\u0027s a terrible reason, but it doesn\u0027t handle a driver not allowing a particular feature it exposes very well.  However, we\u0027ve taken it out for now because it can easily be put back in later if needed.","commit_id":"d705cfcb8aefd82e5e4d042a9ce2bc29ec823b4b"},{"author":{"_account_id":10980,"name":"Doug Wiegley","email":"dougwig@parkside.io","username":"dougw"},"change_message_id":"69288b07a713bf708b5e516d0890c0696186f685","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2012-2014 OpenStack Foundation."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\");"},{"line_number":4,"context_line":"# you may not use this file except in compliance with the License."},{"line_number":5,"context_line":"# You may obtain a copy of the License at"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa98f980_450edae6","side":"PARENT","line":2,"updated":"2014-09-17 20:22:10.000000000","message":"I don\u0027t think you can legally undo an old copyright like this.  In fact, I\u0027m sure of it.","commit_id":"13b015daea7d4a7c9487859e22dcaa326ecc2d1b"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"48af4f2fa2d2ade576268b73bfd79dccba74935a","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2012-2014 OpenStack Foundation."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\");"},{"line_number":4,"context_line":"# you may not use this file except in compliance with the License."},{"line_number":5,"context_line":"# You may obtain a copy of the License at"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa98f980_1c7b487c","side":"PARENT","line":2,"in_reply_to":"fa98f980_450edae6","updated":"2014-09-18 04:59:42.000000000","message":"you\u0027re probably right, I just went robotic with changing all Openstack Foundation headers to Rackspace that we worked on because most of them were new files.","commit_id":"13b015daea7d4a7c9487859e22dcaa326ecc2d1b"},{"author":{"_account_id":10980,"name":"Doug Wiegley","email":"dougwig@parkside.io","username":"dougw"},"change_message_id":"69288b07a713bf708b5e516d0890c0696186f685","unresolved":false,"context_lines":[{"line_number":34,"context_line":"PROTOCOL_TCP \u003d \u0027TCP\u0027"},{"line_number":35,"context_line":"PROTOCOL_HTTP \u003d \u0027HTTP\u0027"},{"line_number":36,"context_line":"PROTOCOL_HTTPS \u003d \u0027HTTPS\u0027"},{"line_number":37,"context_line":"PROTOCOL_TERMINATED_HTTPS \u003d \u0027TERMINATED_HTTPS\u0027"},{"line_number":38,"context_line":"SUPPORTED_PROTOCOLS \u003d (PROTOCOL_TCP, PROTOCOL_HTTPS, PROTOCOL_HTTP,"},{"line_number":39,"context_line":"                       PROTOCOL_TERMINATED_HTTPS)"},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"fa98f980_85f7e2d3","line":37,"updated":"2014-09-17 20:22:10.000000000","message":"We\u0027re not using TERMINATED_HTTPS.  And where\u0027s my UDP go?1?","commit_id":"9d47259b68fa00ceaf52750f3bd41c448c8ca67a"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"48af4f2fa2d2ade576268b73bfd79dccba74935a","unresolved":false,"context_lines":[{"line_number":34,"context_line":"PROTOCOL_TCP \u003d \u0027TCP\u0027"},{"line_number":35,"context_line":"PROTOCOL_HTTP \u003d \u0027HTTP\u0027"},{"line_number":36,"context_line":"PROTOCOL_HTTPS \u003d \u0027HTTPS\u0027"},{"line_number":37,"context_line":"PROTOCOL_TERMINATED_HTTPS \u003d \u0027TERMINATED_HTTPS\u0027"},{"line_number":38,"context_line":"SUPPORTED_PROTOCOLS \u003d (PROTOCOL_TCP, PROTOCOL_HTTPS, PROTOCOL_HTTP,"},{"line_number":39,"context_line":"                       PROTOCOL_TERMINATED_HTTPS)"},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"fa98f980_bce23c2d","line":37,"in_reply_to":"fa98f980_85f7e2d3","updated":"2014-09-18 04:59:42.000000000","message":"UDP is going the way of TERMINATED_HTTPS.","commit_id":"9d47259b68fa00ceaf52750f3bd41c448c8ca67a"}],"octavia/common/data_models.py":[{"author":{"_account_id":11685,"name":"Stephen Balukoff","email":"stephen@balukoff.com","username":"sbalukoff"},"change_message_id":"7026400bb6d49821677b40bb6c26c81d546d7ec0","unresolved":false,"context_lines":[{"line_number":32,"context_line":"# defined here because there aren\u0027t any data_models defined in core neutron"},{"line_number":33,"context_line":"# or neutron services.  Instead of jumping through the hoops to create those"},{"line_number":34,"context_line":"# I\u0027ve just defined them here.  If ever data_models or similar are defined"},{"line_number":35,"context_line":"# in those packages, those should be used instead of these."},{"line_number":36,"context_line":"class IPAllocation(BaseDataModel):"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    def __init__(self, port_id\u003dNone, ip_address\u003dNone, subnet_id\u003dNone,"}],"source_content_type":"text/x-python","patch_set":2,"id":"1abeadc6_e4f55acb","line":35,"updated":"2014-08-30 01:38:53.000000000","message":"+1 to the explanatory comment, eh!","commit_id":"91c9ea4bc147825c4d4bbe8335b3be4e4f1ad4ef"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"2c72e18020f81fcbff6eb6aa27d3298d547b9b13","unresolved":false,"context_lines":[{"line_number":32,"context_line":"# defined here because there aren\u0027t any data_models defined in core neutron"},{"line_number":33,"context_line":"# or neutron services.  Instead of jumping through the hoops to create those"},{"line_number":34,"context_line":"# I\u0027ve just defined them here.  If ever data_models or similar are defined"},{"line_number":35,"context_line":"# in those packages, those should be used instead of these."},{"line_number":36,"context_line":"class IPAllocation(BaseDataModel):"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    def __init__(self, port_id\u003dNone, ip_address\u003dNone, subnet_id\u003dNone,"}],"source_content_type":"text/x-python","patch_set":2,"id":"1abeadc6_90cbfca2","line":35,"in_reply_to":"1abeadc6_e4f55acb","updated":"2014-08-30 07:23:11.000000000","message":"This is originates in neutron lbaas.  I\u0027m not sure these will be needed for Octavia.  If they are I\u0027d put them in a different module.  I actually thought I removed them.","commit_id":"91c9ea4bc147825c4d4bbe8335b3be4e4f1ad4ef"},{"author":{"_account_id":11685,"name":"Stephen Balukoff","email":"stephen@balukoff.com","username":"sbalukoff"},"change_message_id":"7026400bb6d49821677b40bb6c26c81d546d7ec0","unresolved":false,"context_lines":[{"line_number":202,"context_line":"                 status\u003dNone, load_balancer\u003dNone):"},{"line_number":203,"context_line":"        self.node_id \u003d node_id"},{"line_number":204,"context_line":"        self.host_id \u003d host_id"},{"line_number":205,"context_line":"        self.load_balancer_id \u003d load_balancer_id"},{"line_number":206,"context_line":"        self.status \u003d status"},{"line_number":207,"context_line":"        self.load_balancer \u003d load_balancer"},{"line_number":208,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"1abeadc6_648dca30","line":205,"updated":"2014-08-30 01:38:53.000000000","message":"This seem to imply that a node can only contain one load balancer, instead of several load balancers from a single tenant. That\u0027s going to be broken pretty quickly by colocation requirements, I would think.","commit_id":"91c9ea4bc147825c4d4bbe8335b3be4e4f1ad4ef"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"2c72e18020f81fcbff6eb6aa27d3298d547b9b13","unresolved":false,"context_lines":[{"line_number":202,"context_line":"                 status\u003dNone, load_balancer\u003dNone):"},{"line_number":203,"context_line":"        self.node_id \u003d node_id"},{"line_number":204,"context_line":"        self.host_id \u003d host_id"},{"line_number":205,"context_line":"        self.load_balancer_id \u003d load_balancer_id"},{"line_number":206,"context_line":"        self.status \u003d status"},{"line_number":207,"context_line":"        self.load_balancer \u003d load_balancer"},{"line_number":208,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"1abeadc6_104e0c38","line":205,"in_reply_to":"1abeadc6_648dca30","updated":"2014-08-30 07:23:11.000000000","message":"you\u0027re right.  This actually sounds like its a many-to-many relationship.  Sometimes I slip back into my old thinking of 1 load balancer per VM.\n\nThis will at least solve a comment you had below as we only need one \"node\" (or whatever it will be called) table and then a join table for load_balancer to \"node\"","commit_id":"91c9ea4bc147825c4d4bbe8335b3be4e4f1ad4ef"},{"author":{"_account_id":11685,"name":"Stephen Balukoff","email":"stephen@balukoff.com","username":"sbalukoff"},"change_message_id":"588818636c30d04b54d606af67513c15828ccf81","unresolved":false,"context_lines":[{"line_number":207,"context_line":"        self.load_balancer \u003d load_balancer"},{"line_number":208,"context_line":""},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"class SpareNode(BaseDataModel):"},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"    def __init__(self, node_id\u003dNone, host_id\u003dNone, status\u003dNone):"},{"line_number":213,"context_line":"        self.node_id \u003d node_id"}],"source_content_type":"text/x-python","patch_set":2,"id":"1abeadc6_877ae874","line":210,"updated":"2014-08-30 02:01:38.000000000","message":"Also, since the only real difference here between an active node and a spare node is that the active node has a load balancer assigned to it, it feels very not DRY to have these models so similar...  Maybe we could do one of the following:\n\nA. Have the SpareNode be a base class for the ActiveNode?\nB. Have a single \u0027OctaviaAppliance\u0027 model that has a nullable load_balancer attribute (ie. null attribute there implies the node is spare)?\nC. Like \"B\" above, but have a boolean \u0027active\u0027 attribute so that it\u0027s both more explicit and more capable of handling weird edge cases (eg. during spin up or shut down, a \u0027spare\u0027 node might get a load balancer assigned to it just before the haproxy configs for the same are pushed out to the actual appliance.)\n\nI\u0027m in favor of \"C\" as well because it makes things more explicit when (if?) the \u0027controller\u0027 role gets split into \u0027active node controller\u0027 and \u0027spare node controller\u0027 in Octavia v1.","commit_id":"91c9ea4bc147825c4d4bbe8335b3be4e4f1ad4ef"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"2c72e18020f81fcbff6eb6aa27d3298d547b9b13","unresolved":false,"context_lines":[{"line_number":207,"context_line":"        self.load_balancer \u003d load_balancer"},{"line_number":208,"context_line":""},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"class SpareNode(BaseDataModel):"},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"    def __init__(self, node_id\u003dNone, host_id\u003dNone, status\u003dNone):"},{"line_number":213,"context_line":"        self.node_id \u003d node_id"}],"source_content_type":"text/x-python","patch_set":2,"id":"1abeadc6_705660cf","line":210,"in_reply_to":"1abeadc6_877ae874","updated":"2014-08-30 07:23:11.000000000","message":"Now we\u0027ll have option \"D\", which is like \"B\" but no loadbalancer_id on the node at all.  Join table to link many load balancers to many nodes.  Let me know if that works.","commit_id":"91c9ea4bc147825c4d4bbe8335b3be4e4f1ad4ef"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"57db21f5a39aa89611053a85d9fdc0c6cdcdbd42","unresolved":false,"context_lines":[{"line_number":33,"context_line":"# or neutron services.  Instead of jumping through the hoops to create those"},{"line_number":34,"context_line":"# I\u0027ve just defined them here.  If ever data_models or similar are defined"},{"line_number":35,"context_line":"# in those packages, those should be used instead of these."},{"line_number":36,"context_line":"class IPAllocation(BaseDataModel):"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    def __init__(self, port_id\u003dNone, ip_address\u003dNone, subnet_id\u003dNone,"},{"line_number":39,"context_line":"                 network_id\u003dNone):"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa98f980_bf1ad5c3","line":36,"updated":"2014-09-11 15:50:50.000000000","message":"This model shoudl be removed.  No need for it yet","commit_id":"1137070c867fe484c8b92690d5d4d5182811c36e"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"57db21f5a39aa89611053a85d9fdc0c6cdcdbd42","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        self.network_id \u003d network_id"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"class Port(BaseDataModel):"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    def __init__(self, id\u003dNone, tenant_id\u003dNone, name\u003dNone, network_id\u003dNone,"},{"line_number":49,"context_line":"                 mac_address\u003dNone, admin_state_up\u003dNone, status\u003dNone,"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa98f980_3f86e5db","line":46,"updated":"2014-09-11 15:50:50.000000000","message":"This model should be removed. No need for it yet.","commit_id":"1137070c867fe484c8b92690d5d4d5182811c36e"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"991e6704ea98b363cdad1d97f832a5f69e890e97","unresolved":false,"context_lines":[{"line_number":114,"context_line":"        self.tenant_id \u003d tenant_id"},{"line_number":115,"context_line":"        self.name \u003d name"},{"line_number":116,"context_line":"        self.description \u003d description"},{"line_number":117,"context_line":"        self.health_monitor_id \u003d health_monitor_id"},{"line_number":118,"context_line":"        self.protocol \u003d protocol"},{"line_number":119,"context_line":"        self.lb_algorithm \u003d lb_algorithm"},{"line_number":120,"context_line":"        self.enabled \u003d enabled"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa98f980_ea7032de","line":117,"updated":"2014-09-10 22:55:39.000000000","message":"this isn\u0027t needed anymore. should be removed.","commit_id":"1137070c867fe484c8b92690d5d4d5182811c36e"},{"author":{"_account_id":10806,"name":"Trevor Vardeman","email":"tvardema@redhat.com","username":"tvardeman"},"change_message_id":"1cce31ffa5cece3169048614c471ed7a54bf908b","unresolved":false,"context_lines":[{"line_number":180,"context_line":"class Amphora(BaseDataModel):"},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"    def __init__(self, id\u003dNone, host_id\u003dNone, status\u003dNone, load_balancer\u003dNone):"},{"line_number":183,"context_line":"        self.id \u003d id"},{"line_number":184,"context_line":"        self.host_id \u003d host_id"},{"line_number":185,"context_line":"        self.status \u003d status"},{"line_number":186,"context_line":"        self.load_balancer \u003d load_balancer"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa98f980_dcec6bf6","line":183,"updated":"2014-09-17 18:05:17.000000000","message":"Forgot to add load_balancer_id in here.","commit_id":"2913cceef5315a6f6068553c4bc9952a7d5b6a33"},{"author":{"_account_id":10980,"name":"Doug Wiegley","email":"dougwig@parkside.io","username":"dougw"},"change_message_id":"69288b07a713bf708b5e516d0890c0696186f685","unresolved":false,"context_lines":[{"line_number":17,"context_line":"class BaseDataModel(object):"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"    # NOTE(brandon-logan) This does not discover dicts for relationship"},{"line_number":20,"context_line":"    # attributes."},{"line_number":21,"context_line":"    def to_dict(self):"},{"line_number":22,"context_line":"        ret \u003d {}"},{"line_number":23,"context_line":"        for attr in self.__dict__:"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa98f980_c5f00a94","line":20,"updated":"2014-09-17 20:22:10.000000000","message":"Isn\u0027t that a pretty big bug?","commit_id":"9d47259b68fa00ceaf52750f3bd41c448c8ca67a"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"48af4f2fa2d2ade576268b73bfd79dccba74935a","unresolved":false,"context_lines":[{"line_number":17,"context_line":"class BaseDataModel(object):"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"    # NOTE(brandon-logan) This does not discover dicts for relationship"},{"line_number":20,"context_line":"    # attributes."},{"line_number":21,"context_line":"    def to_dict(self):"},{"line_number":22,"context_line":"        ret \u003d {}"},{"line_number":23,"context_line":"        for attr in self.__dict__:"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa98f980_7c3534da","line":20,"in_reply_to":"fa98f980_c5f00a94","updated":"2014-09-18 04:59:42.000000000","message":"not really a bug, just haven\u0027t needed it yet.  I\u0027m sure I eventually will though, but it can be implemented when that time comes.","commit_id":"9d47259b68fa00ceaf52750f3bd41c448c8ca67a"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"daaa12b67494a61a5e231b6a26436d1629edb83b","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        self.pool \u003d pool"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"class ListenerStatistics(BaseDataModel):"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    def __init__(self, listener_id\u003dNone, bytes_in\u003dNone, bytes_out\u003dNone,"},{"line_number":44,"context_line":"                 active_connections\u003dNone, total_connections\u003dNone,"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa98f980_ac6111d6","line":41,"updated":"2014-09-18 21:00:30.000000000","message":"Since we are shipping the info to ceilometer I am wondering if we need that table. It\u0027s even more questionable when we follow https://etherpad.openstack.org/p/octavia-pending-reviews and make the amphora post directly to ceilometer...","commit_id":"9d47259b68fa00ceaf52750f3bd41c448c8ca67a"},{"author":{"_account_id":10980,"name":"Doug Wiegley","email":"dougwig@parkside.io","username":"dougw"},"change_message_id":"6a5212294d7c98a963c0246b8dd790948e9eea31","unresolved":false,"context_lines":[{"line_number":155,"context_line":"        self.enabled \u003d enabled"},{"line_number":156,"context_line":"        self.vip \u003d vip"},{"line_number":157,"context_line":"        self.listeners \u003d listeners or []"},{"line_number":158,"context_line":"        self.amphorae \u003d amphorae or []"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"class Vip(BaseDataModel):"}],"source_content_type":"text/x-python","patch_set":11,"id":"da9df570_cb3689e7","line":158,"updated":"2014-09-20 05:17:18.000000000","message":"I was going to say this was simpler if the default argument value was [], but this completely sidesteps the python wart of that being a shared global variable.  Nice.","commit_id":"f482487c8c5aa446c00f5eb001a576c67a026f42"}],"octavia/db/base_models.py":[{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"902dc43593def2f6a5cbe7a4278879f88553acf7","unresolved":false,"context_lines":[{"line_number":58,"context_line":"    \"\"\"Id mixin, add to subclasses that have a tenant.\"\"\""},{"line_number":59,"context_line":"    id \u003d sa.Column(sa.String(36), primary_key\u003dTrue)"},{"line_number":60,"context_line":"    # TODO(brandon-logan): use uuidutils with oslo-incubator is in tree"},{"line_number":61,"context_line":"    # default\u003duuidutils.generate_uuid)"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"class TenantMixin(object):"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa98f980_1dfd263c","line":61,"updated":"2014-09-17 03:12:22.000000000","message":"this needs to be added back in","commit_id":"2913cceef5315a6f6068553c4bc9952a7d5b6a33"},{"author":{"_account_id":10980,"name":"Doug Wiegley","email":"dougwig@parkside.io","username":"dougw"},"change_message_id":"69288b07a713bf708b5e516d0890c0696186f685","unresolved":false,"context_lines":[{"line_number":53,"context_line":"class LookupTableMixin(object):"},{"line_number":54,"context_line":"    \"\"\"Mixin to add to classes that are lookup tables.\"\"\""},{"line_number":55,"context_line":"    name \u003d sa.Column(sa.String(16), primary_key\u003dTrue, nullable\u003dFalse)"},{"line_number":56,"context_line":"    description \u003d sa.Column(sa.String(255), nullable\u003dTrue)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"class IdMixin(object):"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa98f980_8524420f","line":56,"updated":"2014-09-17 20:22:10.000000000","message":"Those byte counts seem pretty low to me.","commit_id":"9d47259b68fa00ceaf52750f3bd41c448c8ca67a"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"48af4f2fa2d2ade576268b73bfd79dccba74935a","unresolved":false,"context_lines":[{"line_number":53,"context_line":"class LookupTableMixin(object):"},{"line_number":54,"context_line":"    \"\"\"Mixin to add to classes that are lookup tables.\"\"\""},{"line_number":55,"context_line":"    name \u003d sa.Column(sa.String(16), primary_key\u003dTrue, nullable\u003dFalse)"},{"line_number":56,"context_line":"    description \u003d sa.Column(sa.String(255), nullable\u003dTrue)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"class IdMixin(object):"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa98f980_dc72a0af","line":56,"in_reply_to":"fa98f980_8524420f","updated":"2014-09-18 04:59:42.000000000","message":"I hope the lookup table values will be pretty small 16 chars actually, but you\u0027re probably right.  I\u0027d hate to just see long names for Protocols, Algorithms, and statuses.\n\nI dont see a problem with the 255 limit on description though.","commit_id":"9d47259b68fa00ceaf52750f3bd41c448c8ca67a"},{"author":{"_account_id":10806,"name":"Trevor Vardeman","email":"tvardema@redhat.com","username":"tvardeman"},"change_message_id":"3ba661981625c67b8c43250e8af585a34b7d936b","unresolved":false,"context_lines":[{"line_number":53,"context_line":"class LookupTableMixin(object):"},{"line_number":54,"context_line":"    \"\"\"Mixin to add to classes that are lookup tables.\"\"\""},{"line_number":55,"context_line":"    name \u003d sa.Column(sa.String(16), primary_key\u003dTrue, nullable\u003dFalse)"},{"line_number":56,"context_line":"    description \u003d sa.Column(sa.String(255), nullable\u003dTrue)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"class IdMixin(object):"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa98f980_583a27e8","line":56,"in_reply_to":"fa98f980_dc72a0af","updated":"2014-09-18 18:48:16.000000000","message":"Not sure what these should be if you think they\u0027re low.  Any suggestions?","commit_id":"9d47259b68fa00ceaf52750f3bd41c448c8ca67a"}],"octavia/db/migration/alembic_migrations/versions/4c094013699a_update_load_balancer_amphora.py":[{"author":{"_account_id":11685,"name":"Stephen Balukoff","email":"stephen@balukoff.com","username":"sbalukoff"},"change_message_id":"dbbd3d0c2e19143147e9be618afa3965b653be10","unresolved":false,"context_lines":[{"line_number":28,"context_line":"import sqlalchemy as sa"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"def upgrade():"},{"line_number":32,"context_line":"    op.add_column("},{"line_number":33,"context_line":"        u\u0027amphora\u0027,"},{"line_number":34,"context_line":"        sa.Column(u\u0027load_balancer_id\u0027, sa.String(36),"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa98f980_beb0b743","line":31,"updated":"2014-09-16 00:02:51.000000000","message":"So, it looks like we\u0027re going to enforce a 1:N relationship between LB and Amphora at this time in the database. That\u0027s definitely what we want to do initially, and revisit the question / possibility of doing M:N in the future if we so desire. By removing the load_balancer_amphora table here, do we potentially paint ourselves into a corner other places in the code by letting said code assume that there will only ever be one load balancer per amphora?  (Or is this relationship removal a subtle hint on the part of the author that he doesn\u0027t think we\u0027ll ever actually do M:N in the future... which might actually be the case. ;) )","commit_id":"2913cceef5315a6f6068553c4bc9952a7d5b6a33"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"7ec4528a6de6a21b16b2eda02614ce3f294324d9","unresolved":false,"context_lines":[{"line_number":28,"context_line":"import sqlalchemy as sa"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"def upgrade():"},{"line_number":32,"context_line":"    op.add_column("},{"line_number":33,"context_line":"        u\u0027amphora\u0027,"},{"line_number":34,"context_line":"        sa.Column(u\u0027load_balancer_id\u0027, sa.String(36),"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa98f980_cbf4d888","line":31,"in_reply_to":"fa98f980_19eb9da4","updated":"2014-09-16 02:29:21.000000000","message":"But is it worth the risk of always having that M:N table structure and (you bring up a good point) code that references that structure if we always stay 1:N?  I\u0027m not sure it is worth the risk, but I do not have a strong objection.  If this is something Blue Box absolutely needs then we should do it with the M:N table structure.","commit_id":"2913cceef5315a6f6068553c4bc9952a7d5b6a33"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"7f24163cd3f6732a3cd49fced169f3c095ad6c93","unresolved":false,"context_lines":[{"line_number":28,"context_line":"import sqlalchemy as sa"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"def upgrade():"},{"line_number":32,"context_line":"    op.add_column("},{"line_number":33,"context_line":"        u\u0027amphora\u0027,"},{"line_number":34,"context_line":"        sa.Column(u\u0027load_balancer_id\u0027, sa.String(36),"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa98f980_fe2cffad","line":31,"in_reply_to":"fa98f980_1e19c3d0","updated":"2014-09-16 00:45:12.000000000","message":"I don\u0027t think the DB tables being set up as 1:N will be painting us in a corner.  If we ever decide to go to M:N then thats an easy migration to do, for the tables and any data in the tables.  If we went with the M:N table structure then wouldn\u0027t we want to put in artificial constraints to ensure 1:N at first?  Then once we moved to M:N we\u0027d remove those constraints.  So, in my mind it, just my opinion, we\u0027re going to have to do a db migration anyway so may as well have it be done the correct 1:N way so we\u0027re not ever stuck with a table structure that may not make sense if we never move to M:N.","commit_id":"2913cceef5315a6f6068553c4bc9952a7d5b6a33"},{"author":{"_account_id":10806,"name":"Trevor Vardeman","email":"tvardema@redhat.com","username":"tvardeman"},"change_message_id":"d85c941a6e62e79cbbfa13b47e61e6db07d14319","unresolved":false,"context_lines":[{"line_number":28,"context_line":"import sqlalchemy as sa"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"def upgrade():"},{"line_number":32,"context_line":"    op.add_column("},{"line_number":33,"context_line":"        u\u0027amphora\u0027,"},{"line_number":34,"context_line":"        sa.Column(u\u0027load_balancer_id\u0027, sa.String(36),"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa98f980_1e19c3d0","line":31,"in_reply_to":"fa98f980_beb0b743","updated":"2014-09-16 00:30:58.000000000","message":"The conversation between german brandon and I covered the reason for M:N and we agreed it might not ever be needed.  The reason was to save money or for \"colocation\" which we\u0027re going to use a different tool for.  However, I\u0027m not opposed to the M:N (or at least I\u0027m not)","commit_id":"2913cceef5315a6f6068553c4bc9952a7d5b6a33"},{"author":{"_account_id":11685,"name":"Stephen Balukoff","email":"stephen@balukoff.com","username":"sbalukoff"},"change_message_id":"25775b89a054c5d93084a8b6d664f276a0eb38e0","unresolved":false,"context_lines":[{"line_number":28,"context_line":"import sqlalchemy as sa"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"def upgrade():"},{"line_number":32,"context_line":"    op.add_column("},{"line_number":33,"context_line":"        u\u0027amphora\u0027,"},{"line_number":34,"context_line":"        sa.Column(u\u0027load_balancer_id\u0027, sa.String(36),"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa98f980_9472c80f","line":31,"in_reply_to":"fa98f980_cbf4d888","updated":"2014-09-17 09:33:37.000000000","message":"You\u0027re right--  I think I can successfully convince my team that we don\u0027t have a strong need or case for supporting colocation of load balancers, and cloud operators are better off without that constraint. (Though, we will definitely still have a need for apolocation--  though we don\u0027t need this table for that.)\n\nI\u0027ll withdraw my half-assed objection to dropping the load_balancer_amphora table in light of this.","commit_id":"2913cceef5315a6f6068553c4bc9952a7d5b6a33"},{"author":{"_account_id":11685,"name":"Stephen Balukoff","email":"stephen@balukoff.com","username":"sbalukoff"},"change_message_id":"98c89cf705b771e94faee4c7cf75a6fe0bff00de","unresolved":false,"context_lines":[{"line_number":28,"context_line":"import sqlalchemy as sa"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"def upgrade():"},{"line_number":32,"context_line":"    op.add_column("},{"line_number":33,"context_line":"        u\u0027amphora\u0027,"},{"line_number":34,"context_line":"        sa.Column(u\u0027load_balancer_id\u0027, sa.String(36),"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa98f980_19eb9da4","line":31,"in_reply_to":"fa98f980_fe2cffad","updated":"2014-09-16 01:19:31.000000000","message":"I guess what I was concerned about was the difference between having an ID that\u0027s simply an attribute of the object in a raw form, as opposed to a list of IDs with one element in it. Code to handle either case is necessarily slightly different, and the latter seems more adaptable to M:N if we ever go there. (Which, if we have colocation requirements... we will.)\n\nI do agree that if we keep a DB structure that allows M:N right now, we would want to add the additional artificial uniqueness constraint right now, and moving to M:N would (among other things) simply remove this constraint.","commit_id":"2913cceef5315a6f6068553c4bc9952a7d5b6a33"}],"octavia/db/models.py":[{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"c24f9a23c91e5b6c365a745dbe70f83920c53e78","unresolved":false,"context_lines":[{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    __tablename__ \u003d \"session_persistence\""},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    pool_id \u003d sa.Column(sa.String(36), sa.ForeignKey(\"pool.id\"),"},{"line_number":57,"context_line":"                        nullable\u003dFalse, primary_key\u003dTrue)"},{"line_number":58,"context_line":"    type \u003d sa.Column(sa.String(36),"},{"line_number":59,"context_line":"                     sa.ForeignKey(\"session_persistence_type.name\"),"}],"source_content_type":"text/x-python","patch_set":1,"id":"1abeadc6_09122fb4","line":56,"updated":"2014-08-26 03:37:51.000000000","message":"Foreign Key names and Unique Constraint names were added in the migration.  They should be added in the models as well.","commit_id":"26743bc32c26d5aadced8b5859fe15877d06171a"},{"author":{"_account_id":11685,"name":"Stephen Balukoff","email":"stephen@balukoff.com","username":"sbalukoff"},"change_message_id":"af2914cdd1b0bb0395e94faeab707713ea65f8cf","unresolved":false,"context_lines":[{"line_number":58,"context_line":"    type \u003d sa.Column(sa.String(36),"},{"line_number":59,"context_line":"                     sa.ForeignKey(\"session_persistence_type.name\"),"},{"line_number":60,"context_line":"                     nullable\u003dFalse)"},{"line_number":61,"context_line":"    cookie_name \u003d sa.Column(sa.String(1024), nullable\u003dTrue)"},{"line_number":62,"context_line":"    description \u003d sa.Column(sa.String(255), nullable\u003dTrue)"},{"line_number":63,"context_line":"    pool \u003d orm.relationship(\"Pool\", uselist\u003dFalse,"},{"line_number":64,"context_line":"                            backref\u003dorm.backref(\"session_persistence\","}],"source_content_type":"text/x-python","patch_set":1,"id":"1abeadc6_bffcdb3f","line":61,"updated":"2014-08-27 03:38:55.000000000","message":"Holy moly-- can cookies really have 1024-character names?  (Or are we dealing with a multibyte character issue here?)","commit_id":"26743bc32c26d5aadced8b5859fe15877d06171a"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"028b22df208ed0a22064ba691dbed04e9c77a958","unresolved":false,"context_lines":[{"line_number":58,"context_line":"    type \u003d sa.Column(sa.String(36),"},{"line_number":59,"context_line":"                     sa.ForeignKey(\"session_persistence_type.name\"),"},{"line_number":60,"context_line":"                     nullable\u003dFalse)"},{"line_number":61,"context_line":"    cookie_name \u003d sa.Column(sa.String(1024), nullable\u003dTrue)"},{"line_number":62,"context_line":"    description \u003d sa.Column(sa.String(255), nullable\u003dTrue)"},{"line_number":63,"context_line":"    pool \u003d orm.relationship(\"Pool\", uselist\u003dFalse,"},{"line_number":64,"context_line":"                            backref\u003dorm.backref(\"session_persistence\","}],"source_content_type":"text/x-python","patch_set":1,"id":"1abeadc6_96999d7b","line":61,"in_reply_to":"1abeadc6_12c5a28d","updated":"2014-08-29 04:08:09.000000000","message":"Changed to 255, matching name and description.","commit_id":"26743bc32c26d5aadced8b5859fe15877d06171a"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"574c99418b12475623333a4a69ff818e3340cf17","unresolved":false,"context_lines":[{"line_number":58,"context_line":"    type \u003d sa.Column(sa.String(36),"},{"line_number":59,"context_line":"                     sa.ForeignKey(\"session_persistence_type.name\"),"},{"line_number":60,"context_line":"                     nullable\u003dFalse)"},{"line_number":61,"context_line":"    cookie_name \u003d sa.Column(sa.String(1024), nullable\u003dTrue)"},{"line_number":62,"context_line":"    description \u003d sa.Column(sa.String(255), nullable\u003dTrue)"},{"line_number":63,"context_line":"    pool \u003d orm.relationship(\"Pool\", uselist\u003dFalse,"},{"line_number":64,"context_line":"                            backref\u003dorm.backref(\"session_persistence\","}],"source_content_type":"text/x-python","patch_set":1,"id":"1abeadc6_12c5a28d","line":61,"in_reply_to":"1abeadc6_bffcdb3f","updated":"2014-08-27 23:10:48.000000000","message":"People will appreciate the verbose capability.\n\nKidding, it\u0027ll be changed.","commit_id":"26743bc32c26d5aadced8b5859fe15877d06171a"},{"author":{"_account_id":11685,"name":"Stephen Balukoff","email":"stephen@balukoff.com","username":"sbalukoff"},"change_message_id":"af2914cdd1b0bb0395e94faeab707713ea65f8cf","unresolved":false,"context_lines":[{"line_number":73,"context_line":"                            primary_key\u003dTrue, nullable\u003dFalse)"},{"line_number":74,"context_line":"    bytes_in \u003d sa.Column(sa.BigInteger, nullable\u003dFalse)"},{"line_number":75,"context_line":"    bytes_out \u003d sa.Column(sa.BigInteger, nullable\u003dFalse)"},{"line_number":76,"context_line":"    active_connections \u003d sa.Column(sa.BigInteger, nullable\u003dFalse)"},{"line_number":77,"context_line":"    total_connections \u003d sa.Column(sa.BigInteger, nullable\u003dFalse)"},{"line_number":78,"context_line":"    listener \u003d orm.relationship(\"Listener\", uselist\u003dFalse,"},{"line_number":79,"context_line":"                                backref\u003dorm.backref(\"stats\", uselist\u003dFalse))"}],"source_content_type":"text/x-python","patch_set":1,"id":"1abeadc6_bf813b91","line":76,"updated":"2014-08-27 03:38:55.000000000","message":"Probably don\u0027t need something as large as a BigInteger for active_connections. Unless (maybe) you\u0027re load-balancing google using Octavia.","commit_id":"26743bc32c26d5aadced8b5859fe15877d06171a"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"574c99418b12475623333a4a69ff818e3340cf17","unresolved":false,"context_lines":[{"line_number":73,"context_line":"                            primary_key\u003dTrue, nullable\u003dFalse)"},{"line_number":74,"context_line":"    bytes_in \u003d sa.Column(sa.BigInteger, nullable\u003dFalse)"},{"line_number":75,"context_line":"    bytes_out \u003d sa.Column(sa.BigInteger, nullable\u003dFalse)"},{"line_number":76,"context_line":"    active_connections \u003d sa.Column(sa.BigInteger, nullable\u003dFalse)"},{"line_number":77,"context_line":"    total_connections \u003d sa.Column(sa.BigInteger, nullable\u003dFalse)"},{"line_number":78,"context_line":"    listener \u003d orm.relationship(\"Listener\", uselist\u003dFalse,"},{"line_number":79,"context_line":"                                backref\u003dorm.backref(\"stats\", uselist\u003dFalse))"}],"source_content_type":"text/x-python","patch_set":1,"id":"1abeadc6_f25ae6f0","line":76,"in_reply_to":"1abeadc6_bf813b91","updated":"2014-08-27 23:10:48.000000000","message":"Aim for the moon, if you miss at least you\u0027ll hit the stars!  I don\u0027t see this being an issue either.  I\u0027d like to keep total_connections and bytes as BigIntegers though.","commit_id":"26743bc32c26d5aadced8b5859fe15877d06171a"},{"author":{"_account_id":11685,"name":"Stephen Balukoff","email":"stephen@balukoff.com","username":"sbalukoff"},"change_message_id":"af2914cdd1b0bb0395e94faeab707713ea65f8cf","unresolved":false,"context_lines":[{"line_number":109,"context_line":"                                 sa.ForeignKey(\"operating_status.name\"),"},{"line_number":110,"context_line":"                                 nullable\u003dFalse)"},{"line_number":111,"context_line":"    enabled \u003d sa.Column(sa.Boolean(), nullable\u003dFalse)"},{"line_number":112,"context_line":"    pool \u003d orm.relationship(\"Pool\", backref\u003d\"members\")"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"class HealthMonitor(base_models.BASE, base_models.IdMixin,"}],"source_content_type":"text/x-python","patch_set":1,"id":"1abeadc6_62246caf","line":112,"updated":"2014-08-27 03:38:55.000000000","message":"What do you think of adding an \u0027is_backup\u0027 attribute as well?  (This would allow users to specify a given member is a backup, and should only be used if all of the non-backup members of the pool are down.)","commit_id":"26743bc32c26d5aadced8b5859fe15877d06171a"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"574c99418b12475623333a4a69ff818e3340cf17","unresolved":false,"context_lines":[{"line_number":109,"context_line":"                                 sa.ForeignKey(\"operating_status.name\"),"},{"line_number":110,"context_line":"                                 nullable\u003dFalse)"},{"line_number":111,"context_line":"    enabled \u003d sa.Column(sa.Boolean(), nullable\u003dFalse)"},{"line_number":112,"context_line":"    pool \u003d orm.relationship(\"Pool\", backref\u003d\"members\")"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"class HealthMonitor(base_models.BASE, base_models.IdMixin,"}],"source_content_type":"text/x-python","patch_set":1,"id":"1abeadc6_92bb72e4","line":112,"in_reply_to":"1abeadc6_62246caf","updated":"2014-08-27 23:10:48.000000000","message":"I\u0027m totally fine with that, and a feature we have in our current lbaas.  Do you think it is something we should put focus on right now? I was thinking we could add features like this later after having a more define codebase, and feature/bug workflow.  This seems like something can be easily added after.","commit_id":"26743bc32c26d5aadced8b5859fe15877d06171a"},{"author":{"_account_id":11685,"name":"Stephen Balukoff","email":"stephen@balukoff.com","username":"sbalukoff"},"change_message_id":"af2914cdd1b0bb0395e94faeab707713ea65f8cf","unresolved":false,"context_lines":[{"line_number":125,"context_line":"    http_method \u003d sa.Column(sa.String(16), nullable\u003dTrue)"},{"line_number":126,"context_line":"    url_path \u003d sa.Column(sa.String(255), nullable\u003dTrue)"},{"line_number":127,"context_line":"    expected_codes \u003d sa.Column(sa.String(64), nullable\u003dTrue)"},{"line_number":128,"context_line":"    enabled \u003d sa.Column(sa.Boolean, nullable\u003dFalse)"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"class Pool(base_models.BASE, base_models.IdMixin, base_models.TenantMixin):"}],"source_content_type":"text/x-python","patch_set":1,"id":"1abeadc6_229fd4b5","line":128,"updated":"2014-08-27 03:38:55.000000000","message":"Should probably have a rise_threshold and fall_threshold, which describe the number of sequential health checks that must pass or fail for the member to be considered UP or DOWN, respectively.  (It\u0027s a bit more specific than \u0027max_retries\u0027).\n\nAlso, we almost certainly want to be able to specify the \u0027hostname\u0027 to be used in the HTTP/1.1 health requests, too.","commit_id":"26743bc32c26d5aadced8b5859fe15877d06171a"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"574c99418b12475623333a4a69ff818e3340cf17","unresolved":false,"context_lines":[{"line_number":125,"context_line":"    http_method \u003d sa.Column(sa.String(16), nullable\u003dTrue)"},{"line_number":126,"context_line":"    url_path \u003d sa.Column(sa.String(255), nullable\u003dTrue)"},{"line_number":127,"context_line":"    expected_codes \u003d sa.Column(sa.String(64), nullable\u003dTrue)"},{"line_number":128,"context_line":"    enabled \u003d sa.Column(sa.Boolean, nullable\u003dFalse)"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"class Pool(base_models.BASE, base_models.IdMixin, base_models.TenantMixin):"}],"source_content_type":"text/x-python","patch_set":1,"id":"1abeadc6_32cc5e89","line":128,"in_reply_to":"1abeadc6_229fd4b5","updated":"2014-08-27 23:10:48.000000000","message":"Same comment about this above.","commit_id":"26743bc32c26d5aadced8b5859fe15877d06171a"},{"author":{"_account_id":11685,"name":"Stephen Balukoff","email":"stephen@balukoff.com","username":"sbalukoff"},"change_message_id":"af2914cdd1b0bb0395e94faeab707713ea65f8cf","unresolved":false,"context_lines":[{"line_number":151,"context_line":"    enabled \u003d sa.Column(sa.Boolean, nullable\u003dFalse)"},{"line_number":152,"context_line":"    health_monitor \u003d orm.relationship(\"HealthMonitor\", uselist\u003dFalse,"},{"line_number":153,"context_line":"                                      backref\u003dorm.backref(\"pool\","},{"line_number":154,"context_line":"                                                          uselist\u003dFalse))"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"class LoadBalancer(base_models.BASE, base_models.IdMixin,"}],"source_content_type":"text/x-python","patch_set":1,"id":"1abeadc6_226274ad","line":154,"updated":"2014-08-27 03:38:55.000000000","message":"Should probably have session persistence here as well?","commit_id":"26743bc32c26d5aadced8b5859fe15877d06171a"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"574c99418b12475623333a4a69ff818e3340cf17","unresolved":false,"context_lines":[{"line_number":151,"context_line":"    enabled \u003d sa.Column(sa.Boolean, nullable\u003dFalse)"},{"line_number":152,"context_line":"    health_monitor \u003d orm.relationship(\"HealthMonitor\", uselist\u003dFalse,"},{"line_number":153,"context_line":"                                      backref\u003dorm.backref(\"pool\","},{"line_number":154,"context_line":"                                                          uselist\u003dFalse))"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"class LoadBalancer(base_models.BASE, base_models.IdMixin,"}],"source_content_type":"text/x-python","patch_set":1,"id":"1abeadc6_127da21c","line":154,"in_reply_to":"1abeadc6_226274ad","updated":"2014-08-27 23:10:48.000000000","message":"the backref of the pool relationship in the SessionPersistence model gives it to this model.  Though, I would like this to be much more explicit.","commit_id":"26743bc32c26d5aadced8b5859fe15877d06171a"},{"author":{"_account_id":11685,"name":"Stephen Balukoff","email":"stephen@balukoff.com","username":"sbalukoff"},"change_message_id":"af2914cdd1b0bb0395e94faeab707713ea65f8cf","unresolved":false,"context_lines":[{"line_number":161,"context_line":""},{"line_number":162,"context_line":"    name \u003d sa.Column(sa.String(255), nullable\u003dTrue)"},{"line_number":163,"context_line":"    description \u003d sa.Column(sa.String(255), nullable\u003dTrue)"},{"line_number":164,"context_line":"    vip_port_id \u003d sa.Column(sa.String(36), nullable\u003dTrue)"},{"line_number":165,"context_line":"    vip_subnet_id \u003d sa.Column(sa.String(36), nullable\u003dFalse)"},{"line_number":166,"context_line":"    vip_address \u003d sa.Column(sa.String(36), nullable\u003dTrue)"},{"line_number":167,"context_line":"    provisioning_status \u003d sa.Column(sa.String(16),"}],"source_content_type":"text/x-python","patch_set":1,"id":"1abeadc6_823fc824","line":164,"updated":"2014-08-27 03:38:55.000000000","message":"Ok--  do we want to track the vip_address here instead, and leave resolving that to a vip_port to the networking driver?  What seems to be the least backward way to do this?","commit_id":"26743bc32c26d5aadced8b5859fe15877d06171a"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"028b22df208ed0a22064ba691dbed04e9c77a958","unresolved":false,"context_lines":[{"line_number":161,"context_line":""},{"line_number":162,"context_line":"    name \u003d sa.Column(sa.String(255), nullable\u003dTrue)"},{"line_number":163,"context_line":"    description \u003d sa.Column(sa.String(255), nullable\u003dTrue)"},{"line_number":164,"context_line":"    vip_port_id \u003d sa.Column(sa.String(36), nullable\u003dTrue)"},{"line_number":165,"context_line":"    vip_subnet_id \u003d sa.Column(sa.String(36), nullable\u003dFalse)"},{"line_number":166,"context_line":"    vip_address \u003d sa.Column(sa.String(36), nullable\u003dTrue)"},{"line_number":167,"context_line":"    provisioning_status \u003d sa.Column(sa.String(16),"}],"source_content_type":"text/x-python","patch_set":1,"id":"1abeadc6_31e980b7","line":164,"in_reply_to":"1abeadc6_126e822f","updated":"2014-08-29 04:08:09.000000000","message":"I still think storing the vip_port_id here is the best way to go for now.  Maybe calling it network_resource_id if we want.  Still keeping vip_address and vip_subnet_id for now as well because I don\u0027t want to have to make a request to the network driver everytime we want to get that information.","commit_id":"26743bc32c26d5aadced8b5859fe15877d06171a"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"574c99418b12475623333a4a69ff818e3340cf17","unresolved":false,"context_lines":[{"line_number":161,"context_line":""},{"line_number":162,"context_line":"    name \u003d sa.Column(sa.String(255), nullable\u003dTrue)"},{"line_number":163,"context_line":"    description \u003d sa.Column(sa.String(255), nullable\u003dTrue)"},{"line_number":164,"context_line":"    vip_port_id \u003d sa.Column(sa.String(36), nullable\u003dTrue)"},{"line_number":165,"context_line":"    vip_subnet_id \u003d sa.Column(sa.String(36), nullable\u003dFalse)"},{"line_number":166,"context_line":"    vip_address \u003d sa.Column(sa.String(36), nullable\u003dTrue)"},{"line_number":167,"context_line":"    provisioning_status \u003d sa.Column(sa.String(16),"}],"source_content_type":"text/x-python","patch_set":1,"id":"1abeadc6_126e822f","line":164,"in_reply_to":"1abeadc6_823fc824","updated":"2014-08-27 23:10:48.000000000","message":"You mean a combination of the vip_subnet_id and vip_address giving us the port?  Is there an easy way to get a neutron port with that information?  Same with nova-networks.  But this does bring up other issues with having vip_subnet_id, since nova-networks doesn\u0027t use subnet_ids, it just uses networks.  I suppose just naming this field to vip_net_id would be sufficient and network driver knows what to do with that id.\n\nI definitely need to do some more research on this.  Please chime in on this too if you have an original thought I overlooked.","commit_id":"26743bc32c26d5aadced8b5859fe15877d06171a"},{"author":{"_account_id":11685,"name":"Stephen Balukoff","email":"stephen@balukoff.com","username":"sbalukoff"},"change_message_id":"af2914cdd1b0bb0395e94faeab707713ea65f8cf","unresolved":false,"context_lines":[{"line_number":166,"context_line":"    vip_address \u003d sa.Column(sa.String(36), nullable\u003dTrue)"},{"line_number":167,"context_line":"    provisioning_status \u003d sa.Column(sa.String(16),"},{"line_number":168,"context_line":"                                    sa.ForeignKey(\"provisioning_status.name\"),"},{"line_number":169,"context_line":"                                    nullable\u003dFalse)"},{"line_number":170,"context_line":"    enabled \u003d sa.Column(sa.Boolean, nullable\u003dFalse)"},{"line_number":171,"context_line":"    host_id \u003d sa.Column(sa.String(36), nullable\u003dTrue)"},{"line_number":172,"context_line":"    colocation_hint \u003d sa.Column(sa.String(36), nullable\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":1,"id":"1abeadc6_c24e20c1","line":169,"updated":"2014-08-27 03:38:55.000000000","message":"Worthwhile to have an operational status here as well, given previous discussions of status?","commit_id":"26743bc32c26d5aadced8b5859fe15877d06171a"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"574c99418b12475623333a4a69ff818e3340cf17","unresolved":false,"context_lines":[{"line_number":166,"context_line":"    vip_address \u003d sa.Column(sa.String(36), nullable\u003dTrue)"},{"line_number":167,"context_line":"    provisioning_status \u003d sa.Column(sa.String(16),"},{"line_number":168,"context_line":"                                    sa.ForeignKey(\"provisioning_status.name\"),"},{"line_number":169,"context_line":"                                    nullable\u003dFalse)"},{"line_number":170,"context_line":"    enabled \u003d sa.Column(sa.Boolean, nullable\u003dFalse)"},{"line_number":171,"context_line":"    host_id \u003d sa.Column(sa.String(36), nullable\u003dTrue)"},{"line_number":172,"context_line":"    colocation_hint \u003d sa.Column(sa.String(36), nullable\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":1,"id":"1abeadc6_7271760b","line":169,"in_reply_to":"1abeadc6_c24e20c1","updated":"2014-08-27 23:10:48.000000000","message":"Yep, will add that in the mgirations and this in the next PS.","commit_id":"26743bc32c26d5aadced8b5859fe15877d06171a"},{"author":{"_account_id":11685,"name":"Stephen Balukoff","email":"stephen@balukoff.com","username":"sbalukoff"},"change_message_id":"af2914cdd1b0bb0395e94faeab707713ea65f8cf","unresolved":false,"context_lines":[{"line_number":168,"context_line":"                                    sa.ForeignKey(\"provisioning_status.name\"),"},{"line_number":169,"context_line":"                                    nullable\u003dFalse)"},{"line_number":170,"context_line":"    enabled \u003d sa.Column(sa.Boolean, nullable\u003dFalse)"},{"line_number":171,"context_line":"    host_id \u003d sa.Column(sa.String(36), nullable\u003dTrue)"},{"line_number":172,"context_line":"    colocation_hint \u003d sa.Column(sa.String(36), nullable\u003dTrue)"},{"line_number":173,"context_line":"    apolocation_hint \u003d sa.Column(sa.String(36), nullable\u003dTrue)"},{"line_number":174,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"1abeadc6_e244fcb8","line":171,"updated":"2014-08-27 03:38:55.000000000","message":"Er...  what is the host_id used for?","commit_id":"26743bc32c26d5aadced8b5859fe15877d06171a"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"028b22df208ed0a22064ba691dbed04e9c77a958","unresolved":false,"context_lines":[{"line_number":168,"context_line":"                                    sa.ForeignKey(\"provisioning_status.name\"),"},{"line_number":169,"context_line":"                                    nullable\u003dFalse)"},{"line_number":170,"context_line":"    enabled \u003d sa.Column(sa.Boolean, nullable\u003dFalse)"},{"line_number":171,"context_line":"    host_id \u003d sa.Column(sa.String(36), nullable\u003dTrue)"},{"line_number":172,"context_line":"    colocation_hint \u003d sa.Column(sa.String(36), nullable\u003dTrue)"},{"line_number":173,"context_line":"    apolocation_hint \u003d sa.Column(sa.String(36), nullable\u003dTrue)"},{"line_number":174,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"1abeadc6_d4be7a64","line":171,"in_reply_to":"1abeadc6_b2f4ee5b","updated":"2014-08-29 04:08:09.000000000","message":"since I am a moron sometimes, I didn\u0027t even think about the active node and spare node pool.  So I created the active node which serves as a good table to hold the loadbalancer to vm mapping, and a spare node table which of course has no loadbalancer mapping.","commit_id":"26743bc32c26d5aadced8b5859fe15877d06171a"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"574c99418b12475623333a4a69ff818e3340cf17","unresolved":false,"context_lines":[{"line_number":168,"context_line":"                                    sa.ForeignKey(\"provisioning_status.name\"),"},{"line_number":169,"context_line":"                                    nullable\u003dFalse)"},{"line_number":170,"context_line":"    enabled \u003d sa.Column(sa.Boolean, nullable\u003dFalse)"},{"line_number":171,"context_line":"    host_id \u003d sa.Column(sa.String(36), nullable\u003dTrue)"},{"line_number":172,"context_line":"    colocation_hint \u003d sa.Column(sa.String(36), nullable\u003dTrue)"},{"line_number":173,"context_line":"    apolocation_hint \u003d sa.Column(sa.String(36), nullable\u003dTrue)"},{"line_number":174,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"1abeadc6_b2f4ee5b","line":171,"in_reply_to":"1abeadc6_e244fcb8","updated":"2014-08-27 23:10:48.000000000","message":"As discussed on IRC, this need to be another table listing out all the host_id for every VM/Container spun up for a loadbalancer.","commit_id":"26743bc32c26d5aadced8b5859fe15877d06171a"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"574c99418b12475623333a4a69ff818e3340cf17","unresolved":false,"context_lines":[{"line_number":169,"context_line":"                                    nullable\u003dFalse)"},{"line_number":170,"context_line":"    enabled \u003d sa.Column(sa.Boolean, nullable\u003dFalse)"},{"line_number":171,"context_line":"    host_id \u003d sa.Column(sa.String(36), nullable\u003dTrue)"},{"line_number":172,"context_line":"    colocation_hint \u003d sa.Column(sa.String(36), nullable\u003dTrue)"},{"line_number":173,"context_line":"    apolocation_hint \u003d sa.Column(sa.String(36), nullable\u003dTrue)"},{"line_number":174,"context_line":""},{"line_number":175,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"1abeadc6_1203e242","line":172,"updated":"2014-08-27 23:10:48.000000000","message":"This needs to be antoher table as well mapping.","commit_id":"26743bc32c26d5aadced8b5859fe15877d06171a"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"028b22df208ed0a22064ba691dbed04e9c77a958","unresolved":false,"context_lines":[{"line_number":169,"context_line":"                                    nullable\u003dFalse)"},{"line_number":170,"context_line":"    enabled \u003d sa.Column(sa.Boolean, nullable\u003dFalse)"},{"line_number":171,"context_line":"    host_id \u003d sa.Column(sa.String(36), nullable\u003dTrue)"},{"line_number":172,"context_line":"    colocation_hint \u003d sa.Column(sa.String(36), nullable\u003dTrue)"},{"line_number":173,"context_line":"    apolocation_hint \u003d sa.Column(sa.String(36), nullable\u003dTrue)"},{"line_number":174,"context_line":""},{"line_number":175,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"1abeadc6_36cb6954","line":172,"in_reply_to":"1abeadc6_1203e242","updated":"2014-08-29 04:08:09.000000000","message":"Actually, going to leave this out of this iteration as it can be added in later","commit_id":"26743bc32c26d5aadced8b5859fe15877d06171a"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"574c99418b12475623333a4a69ff818e3340cf17","unresolved":false,"context_lines":[{"line_number":170,"context_line":"    enabled \u003d sa.Column(sa.Boolean, nullable\u003dFalse)"},{"line_number":171,"context_line":"    host_id \u003d sa.Column(sa.String(36), nullable\u003dTrue)"},{"line_number":172,"context_line":"    colocation_hint \u003d sa.Column(sa.String(36), nullable\u003dTrue)"},{"line_number":173,"context_line":"    apolocation_hint \u003d sa.Column(sa.String(36), nullable\u003dTrue)"},{"line_number":174,"context_line":""},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"class Listener(base_models.BASE, base_models.IdMixin, base_models.TenantMixin):"}],"source_content_type":"text/x-python","patch_set":1,"id":"1abeadc6_2fcb1454","line":173,"updated":"2014-08-27 23:10:48.000000000","message":"A user can specify a list of loadbalancers for this.  Sounds like we need the concept of clusters (which I believe is the same as group logic).  A cluster/group being a set of VMs/Containers that can host haproxy.  A loadbalancer can only have haproxy instances on one cluster/group.  This will make colocation and apolocation easier, so another table defining clusters/group is needed and then we can just storet he cluster_id/group_id on the loadbalancer.  But then this makes the assumption that an haproxy instance is on every VM/Container in that cluster, which may not be wanted.","commit_id":"26743bc32c26d5aadced8b5859fe15877d06171a"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"028b22df208ed0a22064ba691dbed04e9c77a958","unresolved":false,"context_lines":[{"line_number":170,"context_line":"    enabled \u003d sa.Column(sa.Boolean, nullable\u003dFalse)"},{"line_number":171,"context_line":"    host_id \u003d sa.Column(sa.String(36), nullable\u003dTrue)"},{"line_number":172,"context_line":"    colocation_hint \u003d sa.Column(sa.String(36), nullable\u003dTrue)"},{"line_number":173,"context_line":"    apolocation_hint \u003d sa.Column(sa.String(36), nullable\u003dTrue)"},{"line_number":174,"context_line":""},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"class Listener(base_models.BASE, base_models.IdMixin, base_models.TenantMixin):"}],"source_content_type":"text/x-python","patch_set":1,"id":"1abeadc6_76c1612e","line":173,"in_reply_to":"1abeadc6_2fcb1454","updated":"2014-08-29 04:08:09.000000000","message":"Same as colocation, removing until it can be added in later.","commit_id":"26743bc32c26d5aadced8b5859fe15877d06171a"},{"author":{"_account_id":11685,"name":"Stephen Balukoff","email":"stephen@balukoff.com","username":"sbalukoff"},"change_message_id":"af2914cdd1b0bb0395e94faeab707713ea65f8cf","unresolved":false,"context_lines":[{"line_number":198,"context_line":"    operating_status \u003d sa.Column(sa.String(16),"},{"line_number":199,"context_line":"                                 sa.ForeignKey(\"operating_status.name\"),"},{"line_number":200,"context_line":"                                 nullable\u003dFalse)"},{"line_number":201,"context_line":"    enabled \u003d sa.Column(sa.Boolean(), nullable\u003dFalse)"},{"line_number":202,"context_line":"    load_balancer \u003d orm.relationship(\"LoadBalancer\", backref\u003d\"listeners\")"},{"line_number":203,"context_line":"    default_pool \u003d orm.relationship(\"Pool\", uselist\u003dFalse,"},{"line_number":204,"context_line":"                                    backref\u003dorm.backref(\"listener\","}],"source_content_type":"text/x-python","patch_set":1,"id":"1abeadc6_029658f0","line":201,"updated":"2014-08-27 03:38:55.000000000","message":"Do we want to specify timeout values here as well?  (connection, server, client)\n\nHow about keepalive timeout?  (Note that being able to have a non-zero keepalive is going to be essential for performance when TLS termination is being used!)","commit_id":"26743bc32c26d5aadced8b5859fe15877d06171a"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"028b22df208ed0a22064ba691dbed04e9c77a958","unresolved":false,"context_lines":[{"line_number":198,"context_line":"    operating_status \u003d sa.Column(sa.String(16),"},{"line_number":199,"context_line":"                                 sa.ForeignKey(\"operating_status.name\"),"},{"line_number":200,"context_line":"                                 nullable\u003dFalse)"},{"line_number":201,"context_line":"    enabled \u003d sa.Column(sa.Boolean(), nullable\u003dFalse)"},{"line_number":202,"context_line":"    load_balancer \u003d orm.relationship(\"LoadBalancer\", backref\u003d\"listeners\")"},{"line_number":203,"context_line":"    default_pool \u003d orm.relationship(\"Pool\", uselist\u003dFalse,"},{"line_number":204,"context_line":"                                    backref\u003dorm.backref(\"listener\","}],"source_content_type":"text/x-python","patch_set":1,"id":"1abeadc6_36d28900","line":201,"in_reply_to":"1abeadc6_029658f0","updated":"2014-08-29 04:08:09.000000000","message":"I think these can be added features later.","commit_id":"26743bc32c26d5aadced8b5859fe15877d06171a"},{"author":{"_account_id":11685,"name":"Stephen Balukoff","email":"stephen@balukoff.com","username":"sbalukoff"},"change_message_id":"af2914cdd1b0bb0395e94faeab707713ea65f8cf","unresolved":false,"context_lines":[{"line_number":200,"context_line":"                                 nullable\u003dFalse)"},{"line_number":201,"context_line":"    enabled \u003d sa.Column(sa.Boolean(), nullable\u003dFalse)"},{"line_number":202,"context_line":"    load_balancer \u003d orm.relationship(\"LoadBalancer\", backref\u003d\"listeners\")"},{"line_number":203,"context_line":"    default_pool \u003d orm.relationship(\"Pool\", uselist\u003dFalse,"},{"line_number":204,"context_line":"                                    backref\u003dorm.backref(\"listener\","},{"line_number":205,"context_line":"                                                        uselist\u003dFalse))"}],"source_content_type":"text/x-python","patch_set":1,"id":"1abeadc6_c2e7003f","line":203,"updated":"2014-08-27 03:38:55.000000000","message":"I\u0027m not sure I follow why we\u0027ve got \u0027load_balancer\u0027 and \u0027default_pool\u0027 here when we\u0027ve got \u0027load_balancer_id\u0027 and \u0027default_pool_id\u0027 above.","commit_id":"26743bc32c26d5aadced8b5859fe15877d06171a"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"574c99418b12475623333a4a69ff818e3340cf17","unresolved":false,"context_lines":[{"line_number":200,"context_line":"                                 nullable\u003dFalse)"},{"line_number":201,"context_line":"    enabled \u003d sa.Column(sa.Boolean(), nullable\u003dFalse)"},{"line_number":202,"context_line":"    load_balancer \u003d orm.relationship(\"LoadBalancer\", backref\u003d\"listeners\")"},{"line_number":203,"context_line":"    default_pool \u003d orm.relationship(\"Pool\", uselist\u003dFalse,"},{"line_number":204,"context_line":"                                    backref\u003dorm.backref(\"listener\","},{"line_number":205,"context_line":"                                                        uselist\u003dFalse))"}],"source_content_type":"text/x-python","patch_set":1,"id":"1abeadc6_0501d969","line":203,"in_reply_to":"1abeadc6_c2e7003f","updated":"2014-08-27 23:10:48.000000000","message":"It\u0027s a sqlalchemy relationship.  Not what is going to be in the table itself.  SqlAlchemy will automatically populate the attributes with a load_balancer object and a default_pool object based on the LoadBalancer model and Pool model respectively.","commit_id":"26743bc32c26d5aadced8b5859fe15877d06171a"},{"author":{"_account_id":11685,"name":"Stephen Balukoff","email":"stephen@balukoff.com","username":"sbalukoff"},"change_message_id":"7026400bb6d49821677b40bb6c26c81d546d7ec0","unresolved":false,"context_lines":[{"line_number":130,"context_line":"                      name\u003d\"fk_member_operating_status_name\"),"},{"line_number":131,"context_line":"        nullable\u003dFalse)"},{"line_number":132,"context_line":"    enabled \u003d sa.Column(sa.Boolean(), nullable\u003dFalse)"},{"line_number":133,"context_line":"    pool \u003d orm.relationship(\"Pool\", backref\u003d\"members\")"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"class HealthMonitor(base_models.BASE, base_models.IdMixin,"}],"source_content_type":"text/x-python","patch_set":2,"id":"1abeadc6_a4b1a2e1","line":133,"updated":"2014-08-30 01:38:53.000000000","message":"I think the \u0027is_backup\u0027 attribute affects literally one line in the haproxy template.  (Though, I guess it\u0027ll have more implications for the UI).  Eh... I\u0027m fine leaving it out for now because it really ought to be a simple addition later on.","commit_id":"91c9ea4bc147825c4d4bbe8335b3be4e4f1ad4ef"},{"author":{"_account_id":11685,"name":"Stephen Balukoff","email":"stephen@balukoff.com","username":"sbalukoff"},"change_message_id":"7026400bb6d49821677b40bb6c26c81d546d7ec0","unresolved":false,"context_lines":[{"line_number":151,"context_line":"    http_method \u003d sa.Column(sa.String(16), nullable\u003dTrue)"},{"line_number":152,"context_line":"    url_path \u003d sa.Column(sa.String(255), nullable\u003dTrue)"},{"line_number":153,"context_line":"    expected_codes \u003d sa.Column(sa.String(64), nullable\u003dTrue)"},{"line_number":154,"context_line":"    enabled \u003d sa.Column(sa.Boolean, nullable\u003dFalse)"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"class Pool(base_models.BASE, base_models.IdMixin, base_models.TenantMixin):"}],"source_content_type":"text/x-python","patch_set":2,"id":"1abeadc6_a4e8c2b3","line":154,"updated":"2014-08-30 01:38:53.000000000","message":"Ok, so rise_threshold and fall_threshold seem like slightly more common (and important) than is_backup, especially if we\u0027re fudging that right now with a max_retries attribute that will have to be split into those two attributes later on. If it\u0027s simple to do, why not do it right from the start in this case?","commit_id":"91c9ea4bc147825c4d4bbe8335b3be4e4f1ad4ef"},{"author":{"_account_id":11685,"name":"Stephen Balukoff","email":"stephen@balukoff.com","username":"sbalukoff"},"change_message_id":"85ad22fabcbc36c35f51057e0a15f0fe670eb8bd","unresolved":false,"context_lines":[{"line_number":151,"context_line":"    http_method \u003d sa.Column(sa.String(16), nullable\u003dTrue)"},{"line_number":152,"context_line":"    url_path \u003d sa.Column(sa.String(255), nullable\u003dTrue)"},{"line_number":153,"context_line":"    expected_codes \u003d sa.Column(sa.String(64), nullable\u003dTrue)"},{"line_number":154,"context_line":"    enabled \u003d sa.Column(sa.Boolean, nullable\u003dFalse)"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"class Pool(base_models.BASE, base_models.IdMixin, base_models.TenantMixin):"}],"source_content_type":"text/x-python","patch_set":2,"id":"1abeadc6_b678f0c4","line":154,"in_reply_to":"1abeadc6_50bfa4cf","updated":"2014-08-30 10:20:56.000000000","message":"The \u0027rise\u0027 and \u0027fall\u0027 terminology come form haproxy\u0027s documentation. I think I\u0027ve seen similar terminology used for similar concepts in nginx as well--  so it\u0027s possible that\u0027s effectively a standard term to describe such things.\n\nAlso, it would be a \u0027min_success_attempts\u0027 ;)  But I think mentioning \u0027max\u0027 and \u0027min\u0027 here are probably more confusing than simply calling these thresholds.\n\nAnd yes, if someone has a better name, I\u0027m fine with that, eh! I just think if we\u0027re going to allow one of these values to be adjusted here, we need to allow both of them to be adjusted. :/","commit_id":"91c9ea4bc147825c4d4bbe8335b3be4e4f1ad4ef"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"2c72e18020f81fcbff6eb6aa27d3298d547b9b13","unresolved":false,"context_lines":[{"line_number":151,"context_line":"    http_method \u003d sa.Column(sa.String(16), nullable\u003dTrue)"},{"line_number":152,"context_line":"    url_path \u003d sa.Column(sa.String(255), nullable\u003dTrue)"},{"line_number":153,"context_line":"    expected_codes \u003d sa.Column(sa.String(64), nullable\u003dTrue)"},{"line_number":154,"context_line":"    enabled \u003d sa.Column(sa.Boolean, nullable\u003dFalse)"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"class Pool(base_models.BASE, base_models.IdMixin, base_models.TenantMixin):"}],"source_content_type":"text/x-python","patch_set":2,"id":"1abeadc6_50bfa4cf","line":154,"in_reply_to":"1abeadc6_a4e8c2b3","updated":"2014-08-30 07:23:11.000000000","message":"I guess I\u0027m being of the mindset that yes it is simple to add right now but the more simple things that are added in the longer it will take and less focus on the more important things.  However since max_retries is the same as fall_threshold (at least in neutron lbaas\u0027s case, and probably the most common case) then adding a rise_threshold would make sense.  I\u0027m not a big fan of rise and fall. Then again I abhor what we use at RAX: attemptsBeforeDeactivation, so I can definitely deal with rise and fall.  The other option would be \"max_fail_attempts\" and \"max_success_attempts\" but not a fan of those either.  Have I mentioned I hate naming things?","commit_id":"91c9ea4bc147825c4d4bbe8335b3be4e4f1ad4ef"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"0b2c829159c8b759e5e5a2c213b909ecd7fe8e30","unresolved":false,"context_lines":[{"line_number":151,"context_line":"    http_method \u003d sa.Column(sa.String(16), nullable\u003dTrue)"},{"line_number":152,"context_line":"    url_path \u003d sa.Column(sa.String(255), nullable\u003dTrue)"},{"line_number":153,"context_line":"    expected_codes \u003d sa.Column(sa.String(64), nullable\u003dTrue)"},{"line_number":154,"context_line":"    enabled \u003d sa.Column(sa.Boolean, nullable\u003dFalse)"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"class Pool(base_models.BASE, base_models.IdMixin, base_models.TenantMixin):"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa98f980_01c02629","line":154,"in_reply_to":"1abeadc6_b678f0c4","updated":"2014-09-02 04:47:22.000000000","message":"Quit correcting me! me dumb like rock.\n\nso you\u0027re saying you\u0027d be fine with fail_attempts and success_attempts? :)\n\ni\u0027m just going to go with rise_threshold and fall_threshold.","commit_id":"91c9ea4bc147825c4d4bbe8335b3be4e4f1ad4ef"},{"author":{"_account_id":11685,"name":"Stephen Balukoff","email":"stephen@balukoff.com","username":"sbalukoff"},"change_message_id":"7026400bb6d49821677b40bb6c26c81d546d7ec0","unresolved":false,"context_lines":[{"line_number":187,"context_line":"    enabled \u003d sa.Column(sa.Boolean, nullable\u003dFalse)"},{"line_number":188,"context_line":"    health_monitor \u003d orm.relationship(\"HealthMonitor\", uselist\u003dFalse,"},{"line_number":189,"context_line":"                                      backref\u003dorm.backref(\"pool\","},{"line_number":190,"context_line":"                                                          uselist\u003dFalse))"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"class LoadBalancer(base_models.BASE, base_models.IdMixin,"}],"source_content_type":"text/x-python","patch_set":2,"id":"1abeadc6_24d4b2e7","line":190,"updated":"2014-08-30 01:38:53.000000000","message":"How could we make it more explicit that SessionPersistence gives to this model here (and therefore shows up as an attribute)?","commit_id":"91c9ea4bc147825c4d4bbe8335b3be4e4f1ad4ef"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"2c72e18020f81fcbff6eb6aa27d3298d547b9b13","unresolved":false,"context_lines":[{"line_number":187,"context_line":"    enabled \u003d sa.Column(sa.Boolean, nullable\u003dFalse)"},{"line_number":188,"context_line":"    health_monitor \u003d orm.relationship(\"HealthMonitor\", uselist\u003dFalse,"},{"line_number":189,"context_line":"                                      backref\u003dorm.backref(\"pool\","},{"line_number":190,"context_line":"                                                          uselist\u003dFalse))"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"class LoadBalancer(base_models.BASE, base_models.IdMixin,"}],"source_content_type":"text/x-python","patch_set":2,"id":"1abeadc6_708020f7","line":190,"in_reply_to":"1abeadc6_24d4b2e7","updated":"2014-08-30 07:23:11.000000000","message":"Actually this one puts pool on the HealthMonitor model.  But I get what you\u0027re saying.  One way to be explicit is to not use backref and define the relationships on both.  I don\u0027t like this though because then you have to maintain two relationships, whereas with the backref its just one.  backrefs are very common with any projects using sqlalchemy, so I don\u0027t think we should move away from them.","commit_id":"91c9ea4bc147825c4d4bbe8335b3be4e4f1ad4ef"},{"author":{"_account_id":11685,"name":"Stephen Balukoff","email":"stephen@balukoff.com","username":"sbalukoff"},"change_message_id":"85ad22fabcbc36c35f51057e0a15f0fe670eb8bd","unresolved":false,"context_lines":[{"line_number":187,"context_line":"    enabled \u003d sa.Column(sa.Boolean, nullable\u003dFalse)"},{"line_number":188,"context_line":"    health_monitor \u003d orm.relationship(\"HealthMonitor\", uselist\u003dFalse,"},{"line_number":189,"context_line":"                                      backref\u003dorm.backref(\"pool\","},{"line_number":190,"context_line":"                                                          uselist\u003dFalse))"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"class LoadBalancer(base_models.BASE, base_models.IdMixin,"}],"source_content_type":"text/x-python","patch_set":2,"id":"1abeadc6_d65acc4e","line":190,"in_reply_to":"1abeadc6_708020f7","updated":"2014-08-30 10:20:56.000000000","message":"Two relationships smells like it would be less DRY as well, if all we really need is one relationship.\n\nMostly, though, what I meant was more \"how do we make it obvious to someone looking at this code that SessionPersistence will add things to this model? Should we put a comment here to that effect or something?\"","commit_id":"91c9ea4bc147825c4d4bbe8335b3be4e4f1ad4ef"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"0b2c829159c8b759e5e5a2c213b909ecd7fe8e30","unresolved":false,"context_lines":[{"line_number":187,"context_line":"    enabled \u003d sa.Column(sa.Boolean, nullable\u003dFalse)"},{"line_number":188,"context_line":"    health_monitor \u003d orm.relationship(\"HealthMonitor\", uselist\u003dFalse,"},{"line_number":189,"context_line":"                                      backref\u003dorm.backref(\"pool\","},{"line_number":190,"context_line":"                                                          uselist\u003dFalse))"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"class LoadBalancer(base_models.BASE, base_models.IdMixin,"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa98f980_41994e1e","line":190,"in_reply_to":"1abeadc6_d65acc4e","updated":"2014-09-02 04:47:22.000000000","message":"A comment would be one way.  However, I don\u0027t think that is the right thing to do because its a slippery slope of putting comments in just in case someone reading it is not familiar with a piece of technology.  Don\u0027t get me wrong, I do prefer explicitness, but I\u0027m now rethinking whether this case warrants it.","commit_id":"91c9ea4bc147825c4d4bbe8335b3be4e4f1ad4ef"},{"author":{"_account_id":11685,"name":"Stephen Balukoff","email":"stephen@balukoff.com","username":"sbalukoff"},"change_message_id":"7026400bb6d49821677b40bb6c26c81d546d7ec0","unresolved":false,"context_lines":[{"line_number":199,"context_line":""},{"line_number":200,"context_line":"    name \u003d sa.Column(sa.String(255), nullable\u003dTrue)"},{"line_number":201,"context_line":"    description \u003d sa.Column(sa.String(255), nullable\u003dTrue)"},{"line_number":202,"context_line":"    vip_port_id \u003d sa.Column(sa.String(36), nullable\u003dTrue)"},{"line_number":203,"context_line":"    vip_subnet_id \u003d sa.Column(sa.String(36), nullable\u003dFalse)"},{"line_number":204,"context_line":"    vip_address \u003d sa.Column(sa.String(36), nullable\u003dTrue)"},{"line_number":205,"context_line":"    provisioning_status \u003d sa.Column("}],"source_content_type":"text/x-python","patch_set":2,"id":"1abeadc6_6465ca43","line":202,"updated":"2014-08-30 01:38:53.000000000","message":"It still feels like naming this vip_port_id is locking us into definitely using Neutron concepts (and this is one I don\u0027t think they got right).  Binding the address to a port feels too much like the VIP is assigned to a single server/node which definitely won\u0027t be the case with active-active mode topologies, and mostly isn\u0027t the case in active-standby.  network_resource_id is slightly better, but not very descriptive. (My first impulse is to say \"network_resource_id? What the hell is that?\")\n\nI do like \u0027vip_net_id\u0027 the best so far, since I think the difference between what is a \u0027network\u0027 and what is a \u0027subnet\u0027 should be immaterial.\n\nSo, thinking out-loud as it were:\nWhat are we really describing here?  I think it\u0027s essentially a logical layer-2 network segment on which this VIP is supposed to reside. However, if we\u0027re using routed-mode for front-end connectivity, the vip_address becomes a layer-3 route presumably ultimately leading to one or more Octavia VMs... and the real question is where does this layer-3 route exist?  (ie. does it make sense to limit scope to the tenant\u0027s networks if its an \"internal\" address?  If it\u0027s an \"external\" address it probably needs to go into a global routing table for the whole cloud, right? And \u0027internal\u0027 versus \u0027external\u0027 can be determined from the network or subnet id associated with the address, assuming there is one...)\n\nI may have just totally confused myself on that point. :P  I think having some entity describing the layer-2 network segment on which the vip_address resides is going to be important for layer-2 type front-end connectivity. But I have a sinking feeling we\u0027re going to need something else for layer-3 front-end connectivity.  I\u0027mma have to noodle on this a bit and/or consult a network engineer...","commit_id":"91c9ea4bc147825c4d4bbe8335b3be4e4f1ad4ef"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"2c72e18020f81fcbff6eb6aa27d3298d547b9b13","unresolved":false,"context_lines":[{"line_number":199,"context_line":""},{"line_number":200,"context_line":"    name \u003d sa.Column(sa.String(255), nullable\u003dTrue)"},{"line_number":201,"context_line":"    description \u003d sa.Column(sa.String(255), nullable\u003dTrue)"},{"line_number":202,"context_line":"    vip_port_id \u003d sa.Column(sa.String(36), nullable\u003dTrue)"},{"line_number":203,"context_line":"    vip_subnet_id \u003d sa.Column(sa.String(36), nullable\u003dFalse)"},{"line_number":204,"context_line":"    vip_address \u003d sa.Column(sa.String(36), nullable\u003dTrue)"},{"line_number":205,"context_line":"    provisioning_status \u003d sa.Column("}],"source_content_type":"text/x-python","patch_set":2,"id":"1abeadc6_f02c30ae","line":202,"in_reply_to":"1abeadc6_6465ca43","updated":"2014-08-30 07:23:11.000000000","message":"Yeah I\u0027m not sure yet what is best for this.  Which is why I didn\u0027t attempt to change it.  I\u0027m pretty sure we are going to need to track a floating ip as well.  Probably end up have 2 different ways to set it up with optional fields.  I too will need to spend more time on this, but I you\u0027ve got a better grasp on it than I do.","commit_id":"91c9ea4bc147825c4d4bbe8335b3be4e4f1ad4ef"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"0b2c829159c8b759e5e5a2c213b909ecd7fe8e30","unresolved":false,"context_lines":[{"line_number":199,"context_line":""},{"line_number":200,"context_line":"    name \u003d sa.Column(sa.String(255), nullable\u003dTrue)"},{"line_number":201,"context_line":"    description \u003d sa.Column(sa.String(255), nullable\u003dTrue)"},{"line_number":202,"context_line":"    vip_port_id \u003d sa.Column(sa.String(36), nullable\u003dTrue)"},{"line_number":203,"context_line":"    vip_subnet_id \u003d sa.Column(sa.String(36), nullable\u003dFalse)"},{"line_number":204,"context_line":"    vip_address \u003d sa.Column(sa.String(36), nullable\u003dTrue)"},{"line_number":205,"context_line":"    provisioning_status \u003d sa.Column("}],"source_content_type":"text/x-python","patch_set":2,"id":"fa98f980_61273265","line":202,"in_reply_to":"1abeadc6_b62630cc","updated":"2014-09-02 04:47:22.000000000","message":"I think this brings to light another possible issue (i believe I\u0027ve brought it up before but put it on the back burner).  Neutron LBaaS will automatically create a neutron port for the vip and pass that to the driver.  Octavia needs to be able to handle this as well.  So maybe accepting a neutron_port_id on the frontend would be beneficial.  \n\nI think we should talk about possible solutions in IRC tomorrow (Tuesay) if possible.  Our main networking contact is on vacation as well, but should be back this week.  I\u0027ll still try to get other people\u0027s ideas on this as well.  I have a feeling that it will actually make other things much more clear in what we are expecting.","commit_id":"91c9ea4bc147825c4d4bbe8335b3be4e4f1ad4ef"},{"author":{"_account_id":11685,"name":"Stephen Balukoff","email":"stephen@balukoff.com","username":"sbalukoff"},"change_message_id":"85ad22fabcbc36c35f51057e0a15f0fe670eb8bd","unresolved":false,"context_lines":[{"line_number":199,"context_line":""},{"line_number":200,"context_line":"    name \u003d sa.Column(sa.String(255), nullable\u003dTrue)"},{"line_number":201,"context_line":"    description \u003d sa.Column(sa.String(255), nullable\u003dTrue)"},{"line_number":202,"context_line":"    vip_port_id \u003d sa.Column(sa.String(36), nullable\u003dTrue)"},{"line_number":203,"context_line":"    vip_subnet_id \u003d sa.Column(sa.String(36), nullable\u003dFalse)"},{"line_number":204,"context_line":"    vip_address \u003d sa.Column(sa.String(36), nullable\u003dTrue)"},{"line_number":205,"context_line":"    provisioning_status \u003d sa.Column("}],"source_content_type":"text/x-python","patch_set":2,"id":"1abeadc6_b62630cc","line":202,"in_reply_to":"1abeadc6_f02c30ae","updated":"2014-08-30 10:20:56.000000000","message":"I\u0027ll definitely keep noodling and hope to have an idea of how to best model this sometime next week (which will probably become part of the abstraction in our networking driver, regardless of how it\u0027s implemented on neutron or nova-networking).\n\nAnd actually, Dustin is usually much better at reasoning out networking models than I am-- but he just flew to Iceland for 10 days, so it might be a while before I can bounce ideas off him. :P\n\nIf anyone on your team(s) has (specific) suggestions here, I\u0027d love to hear about them, eh!","commit_id":"91c9ea4bc147825c4d4bbe8335b3be4e4f1ad4ef"},{"author":{"_account_id":11685,"name":"Stephen Balukoff","email":"stephen@balukoff.com","username":"sbalukoff"},"change_message_id":"a0a175e258f501920df59e7f002bd1e031f1c303","unresolved":false,"context_lines":[{"line_number":161,"context_line":"    http_method \u003d sa.Column(sa.String(16), nullable\u003dTrue)"},{"line_number":162,"context_line":"    url_path \u003d sa.Column(sa.String(255), nullable\u003dTrue)"},{"line_number":163,"context_line":"    expected_codes \u003d sa.Column(sa.String(64), nullable\u003dTrue)"},{"line_number":164,"context_line":"    enabled \u003d sa.Column(sa.Boolean, nullable\u003dFalse)"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"class Pool(base_models.BASE, base_models.IdMixin, base_models.TenantMixin):"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa98f980_5cdae5e8","line":164,"updated":"2014-09-03 02:46:23.000000000","message":"Continuing conversation from last time:  Yes, I would be fine with fail_attempts and success_attempts, though I think \u0027rise\u0027 and \u0027fall\u0027 are a bit more descriptive.  *shrug* Though, it doesn\u0027t look like the latest code here actually adds either.  Could you please add one of the other?","commit_id":"d705cfcb8aefd82e5e4d042a9ce2bc29ec823b4b"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"a082ccb8793f4e236b0a808e4a4d98b92bb7f17c","unresolved":false,"context_lines":[{"line_number":161,"context_line":"    http_method \u003d sa.Column(sa.String(16), nullable\u003dTrue)"},{"line_number":162,"context_line":"    url_path \u003d sa.Column(sa.String(255), nullable\u003dTrue)"},{"line_number":163,"context_line":"    expected_codes \u003d sa.Column(sa.String(64), nullable\u003dTrue)"},{"line_number":164,"context_line":"    enabled \u003d sa.Column(sa.Boolean, nullable\u003dFalse)"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"class Pool(base_models.BASE, base_models.IdMixin, base_models.TenantMixin):"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa98f980_7756e22b","line":164,"in_reply_to":"fa98f980_5cdae5e8","updated":"2014-09-03 03:45:30.000000000","message":"Argh! I forgot to add it in the migration.  Will add it there and this will be updated once a name for that pesky vm shit gets solidified.","commit_id":"d705cfcb8aefd82e5e4d042a9ce2bc29ec823b4b"},{"author":{"_account_id":11685,"name":"Stephen Balukoff","email":"stephen@balukoff.com","username":"sbalukoff"},"change_message_id":"a0a175e258f501920df59e7f002bd1e031f1c303","unresolved":false,"context_lines":[{"line_number":197,"context_line":"    enabled \u003d sa.Column(sa.Boolean, nullable\u003dFalse)"},{"line_number":198,"context_line":"    health_monitor \u003d orm.relationship(\"HealthMonitor\", uselist\u003dFalse,"},{"line_number":199,"context_line":"                                      backref\u003dorm.backref(\"pool\","},{"line_number":200,"context_line":"                                                          uselist\u003dFalse))"},{"line_number":201,"context_line":""},{"line_number":202,"context_line":""},{"line_number":203,"context_line":"class LoadBalancer(base_models.BASE, base_models.IdMixin,"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa98f980_fc9d590b","line":200,"updated":"2014-09-03 02:46:23.000000000","message":"Responding here:  FWIW, I don\u0027t have a problem with comments when they actually help disambiguate something. In this case, you have to look at a couple other files to realize that session_persistence ends up effectively being an optional attribute of this object, and it\u0027s not obvious that someone has to go looking elsewhere to notice that.  (I really wish the code were more self-documenting in this respect, but it doesn\u0027t look like it is.)\n\nThis is just my preference in this case, if others feel differently, I\u0027ll defer to them, eh.","commit_id":"d705cfcb8aefd82e5e4d042a9ce2bc29ec823b4b"},{"author":{"_account_id":11685,"name":"Stephen Balukoff","email":"stephen@balukoff.com","username":"sbalukoff"},"change_message_id":"a0a175e258f501920df59e7f002bd1e031f1c303","unresolved":false,"context_lines":[{"line_number":209,"context_line":""},{"line_number":210,"context_line":"    name \u003d sa.Column(sa.String(255), nullable\u003dTrue)"},{"line_number":211,"context_line":"    description \u003d sa.Column(sa.String(255), nullable\u003dTrue)"},{"line_number":212,"context_line":"    vip_port_id \u003d sa.Column(sa.String(36), nullable\u003dTrue)"},{"line_number":213,"context_line":"    vip_subnet_id \u003d sa.Column(sa.String(36), nullable\u003dFalse)"},{"line_number":214,"context_line":"    vip_address \u003d sa.Column(sa.String(36), nullable\u003dTrue)"},{"line_number":215,"context_line":"    provisioning_status \u003d sa.Column("}],"source_content_type":"text/x-python","patch_set":3,"id":"fa98f980_9ca52d49","line":212,"updated":"2014-09-03 02:46:23.000000000","message":"Continuing from last time:  Yes, we definitely need to get a better grasp of the specifics of how to do the front-end connectivity for the different types of topology.","commit_id":"d705cfcb8aefd82e5e4d042a9ce2bc29ec823b4b"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"a082ccb8793f4e236b0a808e4a4d98b92bb7f17c","unresolved":false,"context_lines":[{"line_number":209,"context_line":""},{"line_number":210,"context_line":"    name \u003d sa.Column(sa.String(255), nullable\u003dTrue)"},{"line_number":211,"context_line":"    description \u003d sa.Column(sa.String(255), nullable\u003dTrue)"},{"line_number":212,"context_line":"    vip_port_id \u003d sa.Column(sa.String(36), nullable\u003dTrue)"},{"line_number":213,"context_line":"    vip_subnet_id \u003d sa.Column(sa.String(36), nullable\u003dFalse)"},{"line_number":214,"context_line":"    vip_address \u003d sa.Column(sa.String(36), nullable\u003dTrue)"},{"line_number":215,"context_line":"    provisioning_status \u003d sa.Column("}],"source_content_type":"text/x-python","patch_set":3,"id":"fa98f980_a918ee75","line":212,"in_reply_to":"fa98f980_9ca52d49","updated":"2014-09-03 03:45:30.000000000","message":"I\u0027ll have to wait until our networking guy gets back from vacation.  No one I\u0027ve asked knows the answer to my question.  The basic part of my question is that for external vips we will just need a floating ip (one the customer provides, or one octavia will create on their behalf).  However, I am not certain how we will handle VIPs on a tenant\u0027s private network.  Floating IPs may or may not work there for us.  I just need to get it clear.","commit_id":"d705cfcb8aefd82e5e4d042a9ce2bc29ec823b4b"},{"author":{"_account_id":10806,"name":"Trevor Vardeman","email":"tvardema@redhat.com","username":"tvardeman"},"change_message_id":"1cce31ffa5cece3169048614c471ed7a54bf908b","unresolved":false,"context_lines":[{"line_number":315,"context_line":"                   autoincrement\u003dFalse)"},{"line_number":316,"context_line":"    load_balancer_id \u003d sa.Column("},{"line_number":317,"context_line":"        sa.String(36),"},{"line_number":318,"context_line":"        sa.ForeignKey(\"load_balancer.id\", name\u003d\"fk_amphora_load_balancer_id\"))"},{"line_number":319,"context_line":"    host_id \u003d sa.Column(sa.String(36), nullable\u003dFalse)"},{"line_number":320,"context_line":"    status \u003d sa.Column("},{"line_number":321,"context_line":"        sa.String(36),"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa98f980_5caf9b94","line":318,"updated":"2014-09-17 18:05:17.000000000","message":"Need to specify nullable is true here","commit_id":"2913cceef5315a6f6068553c4bc9952a7d5b6a33"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"d5b37cb8004eea20a3ba9023d3b1053f4d2f766f","unresolved":false,"context_lines":[{"line_number":123,"context_line":"        sa.ForeignKey(\"pool.id\", name\u003d\"fk_member_pool_id\"),"},{"line_number":124,"context_line":"        nullable\u003dFalse)"},{"line_number":125,"context_line":"    subnet_id \u003d sa.Column(sa.String(36), nullable\u003dTrue)"},{"line_number":126,"context_line":"    address \u003d sa.Column(sa.String(64), nullable\u003dFalse)"},{"line_number":127,"context_line":"    protocol_port \u003d sa.Column(sa.Integer, nullable\u003dFalse)"},{"line_number":128,"context_line":"    weight \u003d sa.Column(sa.Integer, nullable\u003dTrue)"},{"line_number":129,"context_line":"    operating_status \u003d sa.Column("}],"source_content_type":"text/x-python","patch_set":8,"id":"fa98f980_b2b42336","line":126,"updated":"2014-09-18 06:34:48.000000000","message":"we should change this to ip_address and add a migration to do so in the table","commit_id":"9d47259b68fa00ceaf52750f3bd41c448c8ca67a"},{"author":{"_account_id":10980,"name":"Doug Wiegley","email":"dougwig@parkside.io","username":"dougw"},"change_message_id":"69288b07a713bf708b5e516d0890c0696186f685","unresolved":false,"context_lines":[{"line_number":158,"context_line":"    fall_threshold \u003d sa.Column(sa.Integer, nullable\u003dFalse)"},{"line_number":159,"context_line":"    rise_threshold \u003d sa.Column(sa.Integer, nullable\u003dFalse)"},{"line_number":160,"context_line":"    http_method \u003d sa.Column(sa.String(16), nullable\u003dTrue)"},{"line_number":161,"context_line":"    url_path \u003d sa.Column(sa.String(255), nullable\u003dTrue)"},{"line_number":162,"context_line":"    expected_codes \u003d sa.Column(sa.String(64), nullable\u003dTrue)"},{"line_number":163,"context_line":"    enabled \u003d sa.Column(sa.Boolean, nullable\u003dFalse)"},{"line_number":164,"context_line":"    pool \u003d orm.relationship(\"Pool\", uselist\u003dFalse,"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa98f980_65d59eb8","line":161,"updated":"2014-09-17 20:22:10.000000000","message":"This is way lower than rfc limits for URLs","commit_id":"9d47259b68fa00ceaf52750f3bd41c448c8ca67a"},{"author":{"_account_id":10850,"name":"German Eichberger","email":"german.eichberger@gmail.com","username":"german"},"change_message_id":"daaa12b67494a61a5e231b6a26436d1629edb83b","unresolved":false,"context_lines":[{"line_number":158,"context_line":"    fall_threshold \u003d sa.Column(sa.Integer, nullable\u003dFalse)"},{"line_number":159,"context_line":"    rise_threshold \u003d sa.Column(sa.Integer, nullable\u003dFalse)"},{"line_number":160,"context_line":"    http_method \u003d sa.Column(sa.String(16), nullable\u003dTrue)"},{"line_number":161,"context_line":"    url_path \u003d sa.Column(sa.String(255), nullable\u003dTrue)"},{"line_number":162,"context_line":"    expected_codes \u003d sa.Column(sa.String(64), nullable\u003dTrue)"},{"line_number":163,"context_line":"    enabled \u003d sa.Column(sa.Boolean, nullable\u003dFalse)"},{"line_number":164,"context_line":"    pool \u003d orm.relationship(\"Pool\", uselist\u003dFalse,"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa98f980_ac8f5175","line":161,"in_reply_to":"fa98f980_3cf72cf7","updated":"2014-09-18 21:00:30.000000000","message":"+1 for DOUG we want to follow RFC","commit_id":"9d47259b68fa00ceaf52750f3bd41c448c8ca67a"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"48af4f2fa2d2ade576268b73bfd79dccba74935a","unresolved":false,"context_lines":[{"line_number":158,"context_line":"    fall_threshold \u003d sa.Column(sa.Integer, nullable\u003dFalse)"},{"line_number":159,"context_line":"    rise_threshold \u003d sa.Column(sa.Integer, nullable\u003dFalse)"},{"line_number":160,"context_line":"    http_method \u003d sa.Column(sa.String(16), nullable\u003dTrue)"},{"line_number":161,"context_line":"    url_path \u003d sa.Column(sa.String(255), nullable\u003dTrue)"},{"line_number":162,"context_line":"    expected_codes \u003d sa.Column(sa.String(64), nullable\u003dTrue)"},{"line_number":163,"context_line":"    enabled \u003d sa.Column(sa.Boolean, nullable\u003dFalse)"},{"line_number":164,"context_line":"    pool \u003d orm.relationship(\"Pool\", uselist\u003dFalse,"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa98f980_3cf72cf7","line":161,"in_reply_to":"fa98f980_65d59eb8","updated":"2014-09-18 04:59:42.000000000","message":"i\u0027d hate to deal with a url 255 chars long, but what does it hurt to bump it up to 2k?  I have no real reason to stay with 255 other than shuddering at the sight of that url.  Will have to do a migration change as well.","commit_id":"9d47259b68fa00ceaf52750f3bd41c448c8ca67a"},{"author":{"_account_id":10806,"name":"Trevor Vardeman","email":"tvardema@redhat.com","username":"tvardeman"},"change_message_id":"263b41895d14412e2355b043559b5694fc6a6be8","unresolved":false,"context_lines":[{"line_number":277,"context_line":"                      name\u003d\"fk_listener_operating_status_name\"),"},{"line_number":278,"context_line":"        nullable\u003dFalse)"},{"line_number":279,"context_line":"    enabled \u003d sa.Column(sa.Boolean(), nullable\u003dFalse)"},{"line_number":280,"context_line":"    load_balancer \u003d orm.relationship(\"LoadBalancer\", backref\u003d\"listeners\")"},{"line_number":281,"context_line":"    default_pool \u003d orm.relationship(\"Pool\", uselist\u003dFalse,"},{"line_number":282,"context_line":"                                    backref\u003dorm.backref(\"listener\","},{"line_number":283,"context_line":"                                                        uselist\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":9,"id":"fa98f980_c6361bb4","line":280,"updated":"2014-09-19 15:29:21.000000000","message":"Need to add cascade deletion of the listeners when deleting the load balancer","commit_id":"c1c8906fe4775729a1d707fea8fe3397c59563ee"},{"author":{"_account_id":10806,"name":"Trevor Vardeman","email":"tvardema@redhat.com","username":"tvardeman"},"change_message_id":"c188a5ac5dcec3eec1514901cd3b17902af2d7e3","unresolved":false,"context_lines":[{"line_number":281,"context_line":"    default_pool \u003d orm.relationship(\"Pool\", uselist\u003dFalse,"},{"line_number":282,"context_line":"                                    backref\u003dorm.backref(\"listener\","},{"line_number":283,"context_line":"                                                        uselist\u003dFalse),"},{"line_number":284,"context_line":"                                    cascade\u003d\"delete\")"},{"line_number":285,"context_line":""},{"line_number":286,"context_line":""},{"line_number":287,"context_line":"class SNI(base_models.BASE):"}],"source_content_type":"text/x-python","patch_set":9,"id":"fa98f980_7071a9dd","line":284,"updated":"2014-09-19 14:53:43.000000000","message":"Should this cascade delete a pool?  I\u0027m not so sure now.","commit_id":"c1c8906fe4775729a1d707fea8fe3397c59563ee"}],"octavia/tests/unit/common/test_constants.py":[{"author":{"_account_id":10980,"name":"Doug Wiegley","email":"dougwig@parkside.io","username":"dougw"},"change_message_id":"69288b07a713bf708b5e516d0890c0696186f685","unresolved":false,"context_lines":[{"line_number":20,"context_line":"    # Rough sanity test of module import; not meant to be exhaustive"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"    def test_import(self):"},{"line_number":23,"context_line":"        self.assertEqual(constants.PROTOCOL_TCP, \u0027TCP\u0027)"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa98f980_85d9a2f6","line":23,"updated":"2014-09-17 20:22:10.000000000","message":"Dangit!","commit_id":"9d47259b68fa00ceaf52750f3bd41c448c8ca67a"},{"author":{"_account_id":10980,"name":"Doug Wiegley","email":"dougwig@parkside.io","username":"dougw"},"change_message_id":"6a5212294d7c98a963c0246b8dd790948e9eea31","unresolved":false,"context_lines":[{"line_number":20,"context_line":"    # Rough sanity test of module import; not meant to be exhaustive"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"    def test_import(self):"},{"line_number":23,"context_line":"        self.assertEqual(constants.PROTOCOL_TCP, \u0027TCP\u0027)"}],"source_content_type":"text/x-python","patch_set":11,"id":"da9df570_eb334df4","line":23,"updated":"2014-09-20 05:17:18.000000000","message":"Bah.","commit_id":"f482487c8c5aa446c00f5eb001a576c67a026f42"}],"octavia/tests/unit/db/base.py":[{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"48af4f2fa2d2ade576268b73bfd79dccba74935a","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        self.session \u003d self._get_session()"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    def _get_session(self):"},{"line_number":40,"context_line":"        return self.sessionmaker(bind\u003dself.engine)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def _seed_lookup_tables(self):"},{"line_number":43,"context_line":"        session \u003d self._get_session()"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa98f980_9c53b8e1","line":40,"updated":"2014-09-18 04:59:42.000000000","message":"add expire_on_commit\u003dTrue as a kwarg.  This keeps the session clean and fresh and since we are converting to data models then we don\u0027t need the session to keep state.","commit_id":"9d47259b68fa00ceaf52750f3bd41c448c8ca67a"}],"octavia/tests/unit/db/test_models.py":[{"author":{"_account_id":11685,"name":"Stephen Balukoff","email":"stephen@balukoff.com","username":"sbalukoff"},"change_message_id":"af2914cdd1b0bb0395e94faeab707713ea65f8cf","unresolved":false,"context_lines":[{"line_number":20,"context_line":"class ModelTestMixin(object):"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"    FAKE_UUID_1 \u003d \u00270123456789012345678901234567890123456\u0027"},{"line_number":23,"context_line":"    FAKE_UUID_2 \u003d \u00271234567890123456789012345678901234567\u0027"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    def _insert(self, session, model_cls, model_kwargs):"},{"line_number":26,"context_line":"        with session.begin():"}],"source_content_type":"text/x-python","patch_set":1,"id":"1abeadc6_62a38c4f","line":23,"updated":"2014-08-27 03:38:55.000000000","message":"Noting of course that the UUIDs here aren\u0027t actually in the form of UUIDs.  But hey-- if tests pass because we\u0027re not checking that the UUID is actually a UUID, I\u0027m OK with that. XD","commit_id":"26743bc32c26d5aadced8b5859fe15877d06171a"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"574c99418b12475623333a4a69ff818e3340cf17","unresolved":false,"context_lines":[{"line_number":20,"context_line":"class ModelTestMixin(object):"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"    FAKE_UUID_1 \u003d \u00270123456789012345678901234567890123456\u0027"},{"line_number":23,"context_line":"    FAKE_UUID_2 \u003d \u00271234567890123456789012345678901234567\u0027"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    def _insert(self, session, model_cls, model_kwargs):"},{"line_number":26,"context_line":"        with session.begin():"}],"source_content_type":"text/x-python","patch_set":1,"id":"1abeadc6_65460dc2","line":23,"in_reply_to":"1abeadc6_62a38c4f","updated":"2014-08-27 23:10:48.000000000","message":"DB just cares about 36 chars.  Thats all we cared about.  Though I guess I could have just put it in as a single char, but NO!","commit_id":"26743bc32c26d5aadced8b5859fe15877d06171a"}]}
