)]}'
{"akanda/rug/api/nova.py":[{"author":{"_account_id":1420,"name":"Adam Gandelman","email":"adamg@ubuntu.com","username":"gandelman-a"},"change_message_id":"b65ded291244381d2a2c4c5f543dd27a8a74ea86","unresolved":false,"context_lines":[{"line_number":94,"context_line":""},{"line_number":95,"context_line":"        LOG.debug(\u0027creating instance %s with image %s\u0027,"},{"line_number":96,"context_line":"                  id, image_uuid)"},{"line_number":97,"context_line":"        name \u003d \u0027ak-\u0027 + id"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"        server \u003d self.client.servers.create("},{"line_number":100,"context_line":"            name,"}],"source_content_type":"text/x-python","patch_set":8,"id":"da20952f_c33ef528","line":97,"updated":"2015-09-09 18:13:17.000000000","message":"so each router instance has a self.name, would it make sense to pass that in here and use it? it would probably make sense in the future to have the VM\u0027s function reflected in the name, along with id. ie, ak-router-$uuid, ak-lbaas-$uuid, etc.","commit_id":"226278a69b9380b4f65d9a80c7175f92714006ac"},{"author":{"_account_id":6287,"name":"David Lenwell","email":"dlenwell@gmail.com","username":"dlenwell"},"change_message_id":"81e5e9f533bc26afe4112b32042760854691caa5","unresolved":false,"context_lines":[{"line_number":94,"context_line":""},{"line_number":95,"context_line":"        LOG.debug(\u0027creating instance %s with image %s\u0027,"},{"line_number":96,"context_line":"                  id, image_uuid)"},{"line_number":97,"context_line":"        name \u003d \u0027ak-\u0027 + id"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"        server \u003d self.client.servers.create("},{"line_number":100,"context_line":"            name,"}],"source_content_type":"text/x-python","patch_set":8,"id":"da20952f_5225b6bf","line":97,"in_reply_to":"da20952f_c33ef528","updated":"2015-09-10 11:51:08.000000000","message":"Done","commit_id":"226278a69b9380b4f65d9a80c7175f92714006ac"},{"author":{"_account_id":1420,"name":"Adam Gandelman","email":"adamg@ubuntu.com","username":"gandelman-a"},"change_message_id":"da6f9b25640acb756cf6553de0deb6e0f3474639","unresolved":false,"context_lines":[{"line_number":135,"context_line":"                image_uuid\u003dinstance.image[\u0027id\u0027]"},{"line_number":136,"context_line":"            )"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"    def get_instance_for_obj(self, instance_id):"},{"line_number":139,"context_line":"        \"\"\"Retreives a nova server for a given router_id, based on instance"},{"line_number":140,"context_line":"        name."},{"line_number":141,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"da20952f_037b8d7c","line":138,"updated":"2015-09-09 18:09:14.000000000","message":"OK So the replacing the use of \u0027router_*\u0027 with \u0027instance_*\u0027 here is totally confusing. This is the reason I was not in favor of using \u0027instance\u0027 in place of \u0027router\u0027 earlier this cycle. IMO \u0027instance\u0027 should be a word reserved by nova.\n\nI\u0027d suggest, at least within the scope of this one file, any id that is isn\u0027t a nova server/instance ID be referred to as resource_id.","commit_id":"226278a69b9380b4f65d9a80c7175f92714006ac"},{"author":{"_account_id":6287,"name":"David Lenwell","email":"dlenwell@gmail.com","username":"dlenwell"},"change_message_id":"81e5e9f533bc26afe4112b32042760854691caa5","unresolved":false,"context_lines":[{"line_number":135,"context_line":"                image_uuid\u003dinstance.image[\u0027id\u0027]"},{"line_number":136,"context_line":"            )"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"    def get_instance_for_obj(self, instance_id):"},{"line_number":139,"context_line":"        \"\"\"Retreives a nova server for a given router_id, based on instance"},{"line_number":140,"context_line":"        name."},{"line_number":141,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"da20952f_a63653b2","line":138,"in_reply_to":"da20952f_037b8d7c","updated":"2015-09-10 11:51:08.000000000","message":"Done","commit_id":"226278a69b9380b4f65d9a80c7175f92714006ac"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"change_message_id":"c06226f29507ba7440abeb2f9dac012d880e24d4","unresolved":false,"context_lines":[{"line_number":247,"context_line":"        with open(key) as out:"},{"line_number":248,"context_line":"            return out.read()"},{"line_number":249,"context_line":"    except IOError:"},{"line_number":250,"context_line":"        LOG.warning(\u0027Could not load router ssh public key from %s\u0027 % key)"},{"line_number":251,"context_line":"        return \u0027\u0027"},{"line_number":252,"context_line":""},{"line_number":253,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"da20952f_f994b3e8","line":250,"updated":"2015-09-11 16:39:16.000000000","message":"Any reason for removing the i18n stuff here?","commit_id":"6985cda6888efc21ce3f4c373b4c37758a541a7f"}],"akanda/rug/drivers/__init__.py":[{"author":{"_account_id":1420,"name":"Adam Gandelman","email":"adamg@ubuntu.com","username":"gandelman-a"},"change_message_id":"242b9360dadb2c14dd68683f185bd9bee33eaca5","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"cfg.CONF.register_opts(DRIVER_OPTS)"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"AVAILABLE_DRIVERS \u003d {\u0027router\u0027, Router}"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"class InvalidDriverException(Exception):"}],"source_content_type":"text/x-python","patch_set":9,"id":"da20952f_8a2d40ff","line":23,"updated":"2015-09-10 19:56:06.000000000","message":"this dict is being incorrectly constructed as a set, should use : instead of ,\n\n{\u0027router\u0027: Router}","commit_id":"6985cda6888efc21ce3f4c373b4c37758a541a7f"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"change_message_id":"73718a32287280d84da1c19987f44f26464c2b56","unresolved":false,"context_lines":[{"line_number":58,"context_line":"            yield d"},{"line_number":59,"context_line":"        except InvalidDriverException as e:"},{"line_number":60,"context_line":"            LOG.exception(e)"},{"line_number":61,"context_line":"            pass"}],"source_content_type":"text/x-python","patch_set":30,"id":"7a2fa921_557f91aa","line":61,"updated":"2015-10-09 02:54:30.000000000","message":"The pass really isn\u0027t need here, but not a blocker to merging","commit_id":"c8f14d6e9d5127e63de76b10c109e27327642076"}],"akanda/rug/drivers/router.py":[{"author":{"_account_id":1420,"name":"Adam Gandelman","email":"adamg@ubuntu.com","username":"gandelman-a"},"change_message_id":"55276441deba292413b5ec907aa58a803986c593","unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"ROUTER_CONFIG \u003d cfg.IntOpt(\u0027router_image_uuid\u0027,"},{"line_number":20,"context_line":"                           default\u003d\u0027abc\u0027,"},{"line_number":21,"context_line":"                           help\u003d\u0027image_uuid for router instances.\u0027),"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"cfg.CONF.register_opts(ROUTER_CONFIG)"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa1b9901_e7762805","line":20,"updated":"2015-08-20 17:58:26.000000000","message":"This should have no default, allowing whatever uses it to check that its set","commit_id":"84e0ec82716678846f456f1788cbaa74b44c38e1"},{"author":{"_account_id":1420,"name":"Adam Gandelman","email":"adamg@ubuntu.com","username":"gandelman-a"},"change_message_id":"55276441deba292413b5ec907aa58a803986c593","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        \"\"\""},{"line_number":62,"context_line":"        return configuration.build_config("},{"line_number":63,"context_line":"            worker_context.neutron,"},{"line_number":64,"context_line":"            self,"},{"line_number":65,"context_line":"            instance_info.management_port,"},{"line_number":66,"context_line":"            meta"},{"line_number":67,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa1b9901_f93330f4","line":64,"updated":"2015-08-20 17:58:26.000000000","message":"same thing here I mentioned below re passing \u0027self\u0027","commit_id":"84e0ec82716678846f456f1788cbaa74b44c38e1"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"change_message_id":"1125a63a3644c8dbcd3d74c538e218d26bf9c88c","unresolved":false,"context_lines":[{"line_number":75,"context_line":"        \"\"\""},{"line_number":76,"context_line":"        if self.external_port is None:"},{"line_number":77,"context_line":"            # FIXME: Need to do some work to pick the right external"},{"line_number":78,"context_line":"            # network for a tenant."},{"line_number":79,"context_line":"            self.log.debug(\u0027Adding external port to router\u0027)"},{"line_number":80,"context_line":"            self.external_port \u003d \\"},{"line_number":81,"context_line":"                worker_context.neutron.create_router_external_port("}],"source_content_type":"text/x-python","patch_set":1,"id":"fa1b9901_cc322ba7","line":78,"updated":"2015-08-20 17:23:59.000000000","message":"The neutron class takes care of this.  Should we move that logic here?","commit_id":"84e0ec82716678846f456f1788cbaa74b44c38e1"},{"author":{"_account_id":1420,"name":"Adam Gandelman","email":"adamg@ubuntu.com","username":"gandelman-a"},"change_message_id":"55276441deba292413b5ec907aa58a803986c593","unresolved":false,"context_lines":[{"line_number":79,"context_line":"            self.log.debug(\u0027Adding external port to router\u0027)"},{"line_number":80,"context_line":"            self.external_port \u003d \\"},{"line_number":81,"context_line":"                worker_context.neutron.create_router_external_port("},{"line_number":82,"context_line":"                    self"},{"line_number":83,"context_line":"                )"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    def pre_boot(self, worker_context):"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa1b9901_b929388c","line":82,"updated":"2015-08-20 17:58:26.000000000","message":"I\u0027m not a fan of passing in \u0027self\u0027 like this here, I think it will too tightly couples the Neutron class to this Router driver.  IMO i think functions in akanda.rug.api.neutron that currently accept a \u0027router\u0027 as parameter (specifically create_router_external_port() and get_router_external_port()) should be changed to take the specific parameters required to do work and not the entire object (ie, just pass in in router.id, router.name, etc)","commit_id":"84e0ec82716678846f456f1788cbaa74b44c38e1"},{"author":{"_account_id":1420,"name":"Adam Gandelman","email":"adamg@ubuntu.com","username":"gandelman-a"},"change_message_id":"da6f9b25640acb756cf6553de0deb6e0f3474639","unresolved":false,"context_lines":[{"line_number":65,"context_line":"        \"\"\""},{"line_number":66,"context_line":"        self.image_uuid \u003d cfg.CONF.router_image_uuid"},{"line_number":67,"context_line":"        self.flavor \u003d cfg.CONF.router_flavor"},{"line_number":68,"context_line":"        self.details \u003d worker_context.neutron.get_router_detail(self.id)"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    def pre_boot(self, worker_context):"},{"line_number":71,"context_line":"        \"\"\"pre boot hook"}],"source_content_type":"text/x-python","patch_set":8,"id":"da20952f_a3ebc1db","line":68,"updated":"2015-09-09 18:09:14.000000000","message":"Where does self.id get set?","commit_id":"226278a69b9380b4f65d9a80c7175f92714006ac"},{"author":{"_account_id":1420,"name":"Adam Gandelman","email":"adamg@ubuntu.com","username":"gandelman-a"},"change_message_id":"44d721ec931c4f7bdc592dcfe2009dc1d08aafc8","unresolved":false,"context_lines":[{"line_number":65,"context_line":"        \"\"\""},{"line_number":66,"context_line":"        self.image_uuid \u003d cfg.CONF.router_image_uuid"},{"line_number":67,"context_line":"        self.flavor \u003d cfg.CONF.router_flavor"},{"line_number":68,"context_line":"        self.details \u003d worker_context.neutron.get_router_detail(self.id)"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    def pre_boot(self, worker_context):"},{"line_number":71,"context_line":"        \"\"\"pre boot hook"}],"source_content_type":"text/x-python","patch_set":8,"id":"da20952f_de400c38","line":68,"in_reply_to":"da20952f_a3ebc1db","updated":"2015-09-09 18:28:25.000000000","message":"And the \u0027details\u0027 field concerns me. If all it is doing is holding neutron router object, maybe it should just be  called self._neutron_router or something for clarity? \u0027details\u0027 impleies we\u0027re doing something special with it.  See notes corresponding instance_manager.py about concerns","commit_id":"226278a69b9380b4f65d9a80c7175f92714006ac"},{"author":{"_account_id":1420,"name":"Adam Gandelman","email":"adamg@ubuntu.com","username":"gandelman-a"},"change_message_id":"44d721ec931c4f7bdc592dcfe2009dc1d08aafc8","unresolved":false,"context_lines":[{"line_number":112,"context_line":"            # network for a tenant."},{"line_number":113,"context_line":"            self.log.debug(\u0027Adding external port to router\u0027)"},{"line_number":114,"context_line":"            self.external_port \u003d \\"},{"line_number":115,"context_line":"                worker_context.neutron.create_router_external_port()"}],"source_content_type":"text/x-python","patch_set":8,"id":"da20952f_c3da75e9","line":115,"updated":"2015-09-09 18:28:25.000000000","message":"Unless i\u0027ve missed a change to rug.api.neutron, create_router_external_port() needs a router object, or should be updated to take params from an instance of this object (conf.external_network_id, router.name, router.admin_stat_up)","commit_id":"226278a69b9380b4f65d9a80c7175f92714006ac"},{"author":{"_account_id":1420,"name":"Adam Gandelman","email":"adamg@ubuntu.com","username":"gandelman-a"},"change_message_id":"242b9360dadb2c14dd68683f185bd9bee33eaca5","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"ROUTER_CONFIG \u003d [cfg.IntOpt(\u0027router_image_uuid\u0027,"},{"line_number":30,"context_line":"                            help\u003d\u0027image_uuid for router instances.\u0027),"},{"line_number":31,"context_line":"                 cfg.IntOpt(\u0027router_flavor\u0027,"},{"line_number":32,"context_line":"                            help\u003d\u0027nova flavor to use for router instances\u0027), ]"}],"source_content_type":"text/x-python","patch_set":9,"id":"da20952f_d7d525e5","line":29,"updated":"2015-09-10 19:56:06.000000000","message":"This should be a StrOpt\n\nAlso, we should probably organize router options into their own [router] config section, without the redundant router_ prefix.  We can probably do this in a later patch and properly deprecate the original router_ opts","commit_id":"6985cda6888efc21ce3f4c373b4c37758a541a7f"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"change_message_id":"c06226f29507ba7440abeb2f9dac012d880e24d4","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"ROUTER_CONFIG \u003d [cfg.IntOpt(\u0027router_image_uuid\u0027,"},{"line_number":30,"context_line":"                            help\u003d\u0027image_uuid for router instances.\u0027),"},{"line_number":31,"context_line":"                 cfg.IntOpt(\u0027router_flavor\u0027,"},{"line_number":32,"context_line":"                            help\u003d\u0027nova flavor to use for router instances\u0027), ]"}],"source_content_type":"text/x-python","patch_set":9,"id":"da20952f_798983c9","line":29,"in_reply_to":"da20952f_d7d525e5","updated":"2015-09-11 16:39:16.000000000","message":"+1 to adding proper subsection in later patch.","commit_id":"6985cda6888efc21ce3f4c373b4c37758a541a7f"},{"author":{"_account_id":1420,"name":"Adam Gandelman","email":"adamg@ubuntu.com","username":"gandelman-a"},"change_message_id":"242b9360dadb2c14dd68683f185bd9bee33eaca5","unresolved":false,"context_lines":[{"line_number":29,"context_line":"ROUTER_CONFIG \u003d [cfg.IntOpt(\u0027router_image_uuid\u0027,"},{"line_number":30,"context_line":"                            help\u003d\u0027image_uuid for router instances.\u0027),"},{"line_number":31,"context_line":"                 cfg.IntOpt(\u0027router_flavor\u0027,"},{"line_number":32,"context_line":"                            help\u003d\u0027nova flavor to use for router instances\u0027), ]"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"cfg.CONF.register_opts(ROUTER_CONFIG)"},{"line_number":35,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"da20952f_370b417f","line":32,"updated":"2015-09-10 19:56:06.000000000","message":"Just a nit about style here, for lists like this I\"d prefer to have it laid out with each cfg.* on its own lines, it makes it easier to extend in the future, ie: https://git.openstack.org/cgit/stackforge/akanda-rug/tree/akanda/rug/service.py#n32","commit_id":"6985cda6888efc21ce3f4c373b4c37758a541a7f"}],"akanda/rug/drivers/states.py":[{"author":{"_account_id":1420,"name":"Adam Gandelman","email":"adamg@ubuntu.com","username":"gandelman-a"},"change_message_id":"da6f9b25640acb756cf6553de0deb6e0f3474639","unresolved":false,"context_lines":[{"line_number":26,"context_line":"ERROR \u003d \u0027error\u0027"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"# base list of ready states, driver can use its own list."},{"line_number":29,"context_line":"READY \u003d (UP, CONFIGURED)"}],"source_content_type":"text/x-python","patch_set":8,"id":"da20952f_60c91f25","line":29,"updated":"2015-09-09 18:09:14.000000000","message":"This was slightly confusing when looking through its usage elsewhere, it could be clarified by renaming to READY_STATES to denote this is some kind of iteratable","commit_id":"226278a69b9380b4f65d9a80c7175f92714006ac"},{"author":{"_account_id":6287,"name":"David Lenwell","email":"dlenwell@gmail.com","username":"dlenwell"},"change_message_id":"81e5e9f533bc26afe4112b32042760854691caa5","unresolved":false,"context_lines":[{"line_number":26,"context_line":"ERROR \u003d \u0027error\u0027"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"# base list of ready states, driver can use its own list."},{"line_number":29,"context_line":"READY \u003d (UP, CONFIGURED)"}],"source_content_type":"text/x-python","patch_set":8,"id":"da20952f_46f417ce","line":29,"in_reply_to":"da20952f_60c91f25","updated":"2015-09-10 11:51:08.000000000","message":"Done","commit_id":"226278a69b9380b4f65d9a80c7175f92714006ac"}],"akanda/rug/instance_manager.py":[{"author":{"_account_id":1420,"name":"Adam Gandelman","email":"adamg@ubuntu.com","username":"gandelman-a"},"change_message_id":"cc0c300fbb24b3fc93e837daf2f8113fbd69e602","unresolved":false,"context_lines":[{"line_number":80,"context_line":""},{"line_number":81,"context_line":"        if self.state \u003d\u003d states.GONE:"},{"line_number":82,"context_line":"            self.log.info(_LI(\u0027not booting deleted instance\u0027))"},{"line_number":83,"context_line":"            return"},{"line_number":84,"context_line":"        else:"},{"line_number":85,"context_line":"            return f(self, worker_context, *args, **kw)"},{"line_number":86,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"da20952f_901b9773","line":83,"updated":"2015-09-08 17:27:33.000000000","message":"This wrapper needs to be re-thought.  Returning None out of here meanes we never call the wrapped functions","commit_id":"dbb51352974529d3480db238365e5f99552565e6"},{"author":{"_account_id":1420,"name":"Adam Gandelman","email":"adamg@ubuntu.com","username":"gandelman-a"},"change_message_id":"da6f9b25640acb756cf6553de0deb6e0f3474639","unresolved":false,"context_lines":[{"line_number":307,"context_line":""},{"line_number":308,"context_line":"        start \u003d time.time()"},{"line_number":309,"context_line":"        while time.time() - start \u003c cfg.CONF.boot_timeout:"},{"line_number":310,"context_line":"            if not worker_context.nova_client.get_instance_by_id(self.id):"},{"line_number":311,"context_line":"                if self.state !\u003d states.GONE:"},{"line_number":312,"context_line":"                    self.state \u003d states.DOWN"},{"line_number":313,"context_line":"                return self.state"}],"source_content_type":"text/x-python","patch_set":8,"id":"da20952f_636049a5","line":310,"updated":"2015-09-09 18:09:14.000000000","message":"get_instance_by_id() accepts a nova server uuid.  You\u0027re now passing in the driver/router id instead.  This\u0027ll cause this code to never actually stop any instances.\n\nFurthermore, I don\u0027t see where a driver instance ever gets its id set to anything. Is that coming in another patch?","commit_id":"226278a69b9380b4f65d9a80c7175f92714006ac"},{"author":{"_account_id":6287,"name":"David Lenwell","email":"dlenwell@gmail.com","username":"dlenwell"},"change_message_id":"81e5e9f533bc26afe4112b32042760854691caa5","unresolved":false,"context_lines":[{"line_number":307,"context_line":""},{"line_number":308,"context_line":"        start \u003d time.time()"},{"line_number":309,"context_line":"        while time.time() - start \u003c cfg.CONF.boot_timeout:"},{"line_number":310,"context_line":"            if not worker_context.nova_client.get_instance_by_id(self.id):"},{"line_number":311,"context_line":"                if self.state !\u003d states.GONE:"},{"line_number":312,"context_line":"                    self.state \u003d states.DOWN"},{"line_number":313,"context_line":"                return self.state"}],"source_content_type":"text/x-python","patch_set":8,"id":"da20952f_464f37be","line":310,"in_reply_to":"da20952f_636049a5","updated":"2015-09-10 11:51:08.000000000","message":"Done","commit_id":"226278a69b9380b4f65d9a80c7175f92714006ac"},{"author":{"_account_id":1420,"name":"Adam Gandelman","email":"adamg@ubuntu.com","username":"gandelman-a"},"change_message_id":"da6f9b25640acb756cf6553de0deb6e0f3474639","unresolved":false,"context_lines":[{"line_number":314,"context_line":"            self.log.debug(\u0027Router has not finished stopping\u0027)"},{"line_number":315,"context_line":"            time.sleep(cfg.CONF.retry_delay)"},{"line_number":316,"context_line":"        self.log.error("},{"line_number":317,"context_line":"            \u0027Router failed to stop within %d secs\u0027,"},{"line_number":318,"context_line":"            cfg.CONF.boot_timeout)"},{"line_number":319,"context_line":""},{"line_number":320,"context_line":"    @ensure_cache"}],"source_content_type":"text/x-python","patch_set":8,"id":"da20952f_a0a4174b","line":317,"updated":"2015-09-09 18:09:14.000000000","message":"Why are we removing translation markers?","commit_id":"226278a69b9380b4f65d9a80c7175f92714006ac"},{"author":{"_account_id":6287,"name":"David Lenwell","email":"dlenwell@gmail.com","username":"dlenwell"},"change_message_id":"81e5e9f533bc26afe4112b32042760854691caa5","unresolved":false,"context_lines":[{"line_number":314,"context_line":"            self.log.debug(\u0027Router has not finished stopping\u0027)"},{"line_number":315,"context_line":"            time.sleep(cfg.CONF.retry_delay)"},{"line_number":316,"context_line":"        self.log.error("},{"line_number":317,"context_line":"            \u0027Router failed to stop within %d secs\u0027,"},{"line_number":318,"context_line":"            cfg.CONF.boot_timeout)"},{"line_number":319,"context_line":""},{"line_number":320,"context_line":"    @ensure_cache"}],"source_content_type":"text/x-python","patch_set":8,"id":"da20952f_06bfffaa","line":317,"in_reply_to":"da20952f_a0a4174b","updated":"2015-09-10 11:51:08.000000000","message":"Done","commit_id":"226278a69b9380b4f65d9a80c7175f92714006ac"},{"author":{"_account_id":1420,"name":"Adam Gandelman","email":"adamg@ubuntu.com","username":"gandelman-a"},"change_message_id":"44d721ec931c4f7bdc592dcfe2009dc1d08aafc8","unresolved":false,"context_lines":[{"line_number":336,"context_line":"            cfg.CONF.akanda_mgt_service_port"},{"line_number":337,"context_line":"        )"},{"line_number":338,"context_line":""},{"line_number":339,"context_line":"        if not self._verify_interfaces(self.driver.details, interfaces):"},{"line_number":340,"context_line":"            # FIXME: Need a states.REPLUG state when we support hot-plugging"},{"line_number":341,"context_line":"            # interfaces."},{"line_number":342,"context_line":"            self.log.debug(\"Interfaces aren\u0027t plugged as expected.\")"}],"source_content_type":"text/x-python","patch_set":8,"id":"da20952f_1e5764cb","line":339,"updated":"2015-09-09 18:28:25.000000000","message":"So ATM \u0027details\u0027 looks like an implementation detail of the router driver (hell, its even called details :p) Its use is not captured as part of the base reference driver, and things here shouldn\u0027t be dependent on it if its not something all drivers are exposing.  But since details currently just hold a neutron router object, I can\u0027t see them being used the same way for a neutron load balancer, so thats an issue.\n\nI see \u0027details\u0027 used in 3 places in this file, would it be possible to move whatever tasks need access to those details into the router driver itself, so that things like _verify_interfaces() and _ensure_provider_ports() happen as part of the driver\u0027s post_boot hook?\n\nAnother alternative woul dbe to figure out which details are actually needed to use _verify_interfaces() + _ensure_provider_ports() here, and expose them off the driver as properties that would be common to all drivers.\n\nThoughts?","commit_id":"226278a69b9380b4f65d9a80c7175f92714006ac"},{"author":{"_account_id":6287,"name":"David Lenwell","email":"dlenwell@gmail.com","username":"dlenwell"},"change_message_id":"81e5e9f533bc26afe4112b32042760854691caa5","unresolved":false,"context_lines":[{"line_number":336,"context_line":"            cfg.CONF.akanda_mgt_service_port"},{"line_number":337,"context_line":"        )"},{"line_number":338,"context_line":""},{"line_number":339,"context_line":"        if not self._verify_interfaces(self.driver.details, interfaces):"},{"line_number":340,"context_line":"            # FIXME: Need a states.REPLUG state when we support hot-plugging"},{"line_number":341,"context_line":"            # interfaces."},{"line_number":342,"context_line":"            self.log.debug(\"Interfaces aren\u0027t plugged as expected.\")"}],"source_content_type":"text/x-python","patch_set":8,"id":"da20952f_a97864f9","line":339,"in_reply_to":"da20952f_1e5764cb","updated":"2015-09-10 11:51:08.000000000","message":"so good catch here.. I had originally miss-understood what _verify_interfaces was doing.. \n\nI think it needs to stay in instance_manager and be called the way that it is.. because any instance we boot will need both _ensure_provider_ports and _verify_interfaces.. behavior should remain consistent between drivers.. So unless we can think of some new driver that might not need a provider port or that doesn\u0027t have interfaces that need to be verified.. this code should stay where it is.. \n\nHowever the use of details in general was specifically designed so that I could have a similar object with some different stuff in it for lb\u0027s to use with a common name.. so a router driver would populate it with worker.neutron.get_router_detail(id) and in the lbaas driver it could populate by calling a new function in the neutron api wrapper that is designed to deal with lbaas v2 neutron calls.  I might have been over thinking this or making it too meta.. but those where my thoughts.","commit_id":"226278a69b9380b4f65d9a80c7175f92714006ac"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"change_message_id":"c06226f29507ba7440abeb2f9dac012d880e24d4","unresolved":false,"context_lines":[{"line_number":14,"context_line":"# License for the specific language governing permissions and limitations"},{"line_number":15,"context_line":"# under the License."},{"line_number":16,"context_line":"import time"},{"line_number":17,"context_line":"from datetime import datetime"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from oslo_config import cfg"},{"line_number":20,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"da20952f_598cbfd6","line":17,"updated":"2015-09-11 16:39:16.000000000","message":"import ordering is incorrect","commit_id":"6985cda6888efc21ce3f4c373b4c37758a541a7f"}],"akanda/rug/state.py":[{"author":{"_account_id":1420,"name":"Adam Gandelman","email":"adamg@ubuntu.com","username":"gandelman-a"},"change_message_id":"242b9360dadb2c14dd68683f185bd9bee33eaca5","unresolved":false,"context_lines":[{"line_number":230,"context_line":"            return action"},{"line_number":231,"context_line":"        self.instance.boot(worker_context, self.router_image_uuid)"},{"line_number":232,"context_line":"        self.driver.log.debug(\u0027CreateInstance attempt %s/%s\u0027,"},{"line_number":233,"context_line":"                              self.instance.attempts,"},{"line_number":234,"context_line":"                              self.params.reboot_error_threshold)"},{"line_number":235,"context_line":"        return action"},{"line_number":236,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"da20952f_a8e4ccab","line":233,"updated":"2015-09-10 19:56:06.000000000","message":"The State object doesnt have a \u0027driver\u0027 attribute, you should add it to the StateParams and update these to be self.params.driver.log ?","commit_id":"6985cda6888efc21ce3f4c373b4c37758a541a7f"},{"author":{"_account_id":1420,"name":"Adam Gandelman","email":"adamg@ubuntu.com","username":"gandelman-a"},"change_message_id":"242b9360dadb2c14dd68683f185bd9bee33eaca5","unresolved":false,"context_lines":[{"line_number":235,"context_line":"        return action"},{"line_number":236,"context_line":""},{"line_number":237,"context_line":"    def transition(self, action, worker_context):"},{"line_number":238,"context_line":"        if self.instance.state \u003d\u003d instance_manager.GONE:"},{"line_number":239,"context_line":"            return StopInstance(self.params)"},{"line_number":240,"context_line":"        elif self.instance.state \u003d\u003d instance_manager.ERROR:"},{"line_number":241,"context_line":"            return CalcAction(self.params)"}],"source_content_type":"text/x-python","patch_set":9,"id":"da20952f_48adf099","line":238,"updated":"2015-09-10 19:56:06.000000000","message":"You\u0027ve moved all of these states to akanda.rug.drivers.states, all references in this file need to be updated.","commit_id":"6985cda6888efc21ce3f4c373b4c37758a541a7f"}],"akanda/rug/worker.py":[{"author":{"_account_id":1420,"name":"Adam Gandelman","email":"adamg@ubuntu.com","username":"gandelman-a"},"change_message_id":"242b9360dadb2c14dd68683f185bd9bee33eaca5","unresolved":false,"context_lines":[{"line_number":88,"context_line":"                return None"},{"line_number":89,"context_line":"            self._tenant_resources[tenant_uuid] \u003d router.id"},{"line_number":90,"context_line":"        return self._tenant_resources[tenant_uuid]"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"class WorkerContext(object):"},{"line_number":94,"context_line":"    \"\"\"Holds resources owned by the worker and used by the Automaton."}],"source_content_type":"text/x-python","patch_set":9,"id":"da20952f_a82e0ca3","line":91,"updated":"2015-09-10 19:56:06.000000000","message":"This needs to be updated to hold resource_ids instead of router ids.\n\nAlso, the user of this thing (_populate_router_id()) needs to be updated to operate on the generic resource_ids.","commit_id":"6985cda6888efc21ce3f4c373b4c37758a541a7f"},{"author":{"_account_id":1420,"name":"Adam Gandelman","email":"adamg@ubuntu.com","username":"gandelman-a"},"change_message_id":"242b9360dadb2c14dd68683f185bd9bee33eaca5","unresolved":false,"context_lines":[{"line_number":170,"context_line":""},{"line_number":171,"context_line":"            # Make sure we didn\u0027t already have some updates under way"},{"line_number":172,"context_line":"            # for a router we\u0027ve been told to ignore for debug mode."},{"line_number":173,"context_line":"            should_ignore, reason \u003d self.db_api.router_in_debug(sm.router_id)"},{"line_number":174,"context_line":"            if should_ignore:"},{"line_number":175,"context_line":"                LOG.debug(\u0027Skipping update of resource %s in debug mode. \u0027"},{"line_number":176,"context_line":"                          \u0027(reason: %s)\u0027, sm.router_id, reason)"}],"source_content_type":"text/x-python","patch_set":9,"id":"da20952f_0884d8ae","line":173,"updated":"2015-09-10 19:56:06.000000000","message":"sm.router_id is sm.resource_id now.\n\nThe db api needs to be updated to be non-router specific. Luckily, the schema is pretty dumb and you can get away with simply renaming all the functions s/router/resource","commit_id":"6985cda6888efc21ce3f4c373b4c37758a541a7f"},{"author":{"_account_id":1420,"name":"Adam Gandelman","email":"adamg@ubuntu.com","username":"gandelman-a"},"change_message_id":"242b9360dadb2c14dd68683f185bd9bee33eaca5","unresolved":false,"context_lines":[{"line_number":450,"context_line":"                # at the same time as the thread trying to decide if"},{"line_number":451,"context_line":"                # the router is done."},{"line_number":452,"context_line":"                if sm.send_message(message):"},{"line_number":453,"context_line":"                    self._add_router_to_work_queue(sm)"},{"line_number":454,"context_line":""},{"line_number":455,"context_line":"    def _add_resource_to_work_queue(self, sm):"},{"line_number":456,"context_line":"        \"\"\"Queue up the state machine by resource name."}],"source_content_type":"text/x-python","patch_set":9,"id":"da20952f_03359bd9","line":453,"updated":"2015-09-10 19:56:06.000000000","message":"^ needs to be updated to match the rename just below here.","commit_id":"6985cda6888efc21ce3f4c373b4c37758a541a7f"},{"author":{"_account_id":1420,"name":"Adam Gandelman","email":"adamg@ubuntu.com","username":"gandelman-a"},"change_message_id":"242b9360dadb2c14dd68683f185bd9bee33eaca5","unresolved":false,"context_lines":[{"line_number":457,"context_line":""},{"line_number":458,"context_line":"        The work queue lock should be held before calling this method."},{"line_number":459,"context_line":"        \"\"\""},{"line_number":460,"context_line":"        l \u003d self._router_locks[sm.name]"},{"line_number":461,"context_line":"        locked \u003d l.acquire(False)"},{"line_number":462,"context_line":"        if locked:"},{"line_number":463,"context_line":"            self.work_queue.put(sm)"}],"source_content_type":"text/x-python","patch_set":9,"id":"da20952f_2843dc6d","line":460,"updated":"2015-09-10 19:56:06.000000000","message":"_router_locks should be renamed to _resource_locks\n\nAlso, sm.name doesnt actually exist as an attribute.  But it probably makes more sense to continue to use the ID of the thing for identifying locks, since names are not unique","commit_id":"6985cda6888efc21ce3f4c373b4c37758a541a7f"}]}
