)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":13289,"name":"Taylor Peoples","email":"tpeoples@us.ibm.com","username":"tpeoples"},"change_message_id":"a912f28c6067ab8feaaaab8d5cbfd419ab28b1d8","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     junjie huang \u003cjunjie.huang@intel.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2015-12-14 23:15:09 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"outlet Temperature based migration strategy"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"It implements one of the algorithm of Intel thermal POC."},{"line_number":10,"context_line":"It extends the BaseStrategy class, getting the Outlet"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"5a710552_09c1652e","line":7,"updated":"2015-12-16 06:59:48.000000000","message":"Migration strategy based on outlet temperature","commit_id":"0e6db43ebb0f052a572229eddbf8edf997f55b77"},{"author":{"_account_id":13289,"name":"Taylor Peoples","email":"tpeoples@us.ibm.com","username":"tpeoples"},"change_message_id":"a912f28c6067ab8feaaaab8d5cbfd419ab28b1d8","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"outlet Temperature based migration strategy"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"It implements one of the algorithm of Intel thermal POC."},{"line_number":10,"context_line":"It extends the BaseStrategy class, getting the Outlet"},{"line_number":11,"context_line":"metrics of servers via Ceilometer, and generates solutions"},{"line_number":12,"context_line":"when the outlet Temperature is greater than threshold."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"5a710552_09ef25b1","line":9,"updated":"2015-12-16 06:59:48.000000000","message":"Implements an Intel algorithm for migrating based on outlet temperature.  The outlet temperature metrics are obtained via Ceilometer and a Solution is generated when the temperature is greater than a threshold.\n\nNote that the current threshold is hard-coded but will be made configurable in a future patch.","commit_id":"0e6db43ebb0f052a572229eddbf8edf997f55b77"}],"setup.cfg":[{"author":{"_account_id":13289,"name":"Taylor Peoples","email":"tpeoples@us.ibm.com","username":"tpeoples"},"change_message_id":"a912f28c6067ab8feaaaab8d5cbfd419ab28b1d8","unresolved":false,"context_lines":[{"line_number":44,"context_line":"watcher_strategies \u003d"},{"line_number":45,"context_line":"    dummy \u003d watcher.decision_engine.strategy.strategies.dummy_strategy:DummyStrategy"},{"line_number":46,"context_line":"    basic \u003d watcher.decision_engine.strategy.strategies.basic_consolidation:BasicConsolidation"},{"line_number":47,"context_line":"    outlet_t_strategy \u003d watcher.decision_engine.strategy.strategies.outlet_t_strategy:OutletTemperatureStrategy"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"[build_sphinx]"},{"line_number":50,"context_line":"source-dir \u003d doc/source"}],"source_content_type":"text/x-ttcn-cfg","patch_set":5,"id":"5a710552_094645bf","line":47,"updated":"2015-12-16 06:59:48.000000000","message":"s/outlet_t_strategy/outlet_temp","commit_id":"0e6db43ebb0f052a572229eddbf8edf997f55b77"}],"watcher/common/keystone.py":[{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"ff93bf6b8f46df82d0ca089b346639a869f8aef8","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        if kwargs.get(\u0027region_name\u0027):"},{"line_number":64,"context_line":"            attr \u003d \u0027region\u0027"},{"line_number":65,"context_line":"            filter_value \u003d kwargs.get(\u0027region_name\u0027)"},{"line_number":66,"context_line":"        return self.get_ksclient().service_catalog.url_for("},{"line_number":67,"context_line":"            service_type\u003dkwargs.get(\u0027service_type\u0027) or \u0027metering\u0027,"},{"line_number":68,"context_line":"            attr\u003dattr,"},{"line_number":69,"context_line":"            filter_value\u003dfilter_value,"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a710552_4bd1ddcc","line":66,"updated":"2015-12-15 09:42:43.000000000","message":"nit: Why not reusing the \u0027kc\u0027 variable here instead of calling get_ksclient() ?","commit_id":"0e6db43ebb0f052a572229eddbf8edf997f55b77"},{"author":{"_account_id":13289,"name":"Taylor Peoples","email":"tpeoples@us.ibm.com","username":"tpeoples"},"change_message_id":"a912f28c6067ab8feaaaab8d5cbfd419ab28b1d8","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        if kwargs.get(\u0027region_name\u0027):"},{"line_number":64,"context_line":"            attr \u003d \u0027region\u0027"},{"line_number":65,"context_line":"            filter_value \u003d kwargs.get(\u0027region_name\u0027)"},{"line_number":66,"context_line":"        return self.get_ksclient().service_catalog.url_for("},{"line_number":67,"context_line":"            service_type\u003dkwargs.get(\u0027service_type\u0027) or \u0027metering\u0027,"},{"line_number":68,"context_line":"            attr\u003dattr,"},{"line_number":69,"context_line":"            filter_value\u003dfilter_value,"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a710552_2928e1e1","line":66,"in_reply_to":"5a710552_4bd1ddcc","updated":"2015-12-16 06:59:48.000000000","message":"+1","commit_id":"0e6db43ebb0f052a572229eddbf8edf997f55b77"},{"author":{"_account_id":13289,"name":"Taylor Peoples","email":"tpeoples@us.ibm.com","username":"tpeoples"},"change_message_id":"a912f28c6067ab8feaaaab8d5cbfd419ab28b1d8","unresolved":false,"context_lines":[{"line_number":99,"context_line":"        # ksclient \u003d client.Client(version\u003dapi_version,"},{"line_number":100,"context_line":"        # session\u003dsession,**ks_args)"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"        return client.Client(**ks_args)"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    def _get_credentials(self, api_v3):"},{"line_number":105,"context_line":"        if api_v3:"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a710552_6945896e","line":102,"updated":"2015-12-16 06:59:48.000000000","message":"This is probably out of scope for this patchset, but for keystoneclient v3, a session should be passed to client.Client instead of passing the credentials separately:\n\nhttp://docs.openstack.org/developer/python-keystoneclient/using-api-v3.html#authenticating-using-sessions","commit_id":"0e6db43ebb0f052a572229eddbf8edf997f55b77"},{"author":{"_account_id":13289,"name":"Taylor Peoples","email":"tpeoples@us.ibm.com","username":"tpeoples"},"change_message_id":"a912f28c6067ab8feaaaab8d5cbfd419ab28b1d8","unresolved":false,"context_lines":[{"line_number":108,"context_line":"                 \u0027username\u0027: CONF.keystone_authtoken.admin_user,"},{"line_number":109,"context_line":"                 \u0027password\u0027: CONF.keystone_authtoken.admin_password,"},{"line_number":110,"context_line":"                 \u0027project_name\u0027: CONF.keystone_authtoken.admin_tenant_name,"},{"line_number":111,"context_line":"                 \u0027user_domain_name\u0027: \"default\","},{"line_number":112,"context_line":"                 \u0027project_domain_name\u0027: \"default\"}"},{"line_number":113,"context_line":"        else:"},{"line_number":114,"context_line":"            creds \u003d \\"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a710552_69e90980","line":111,"updated":"2015-12-16 06:59:48.000000000","message":"These should probably be configurable?","commit_id":"0e6db43ebb0f052a572229eddbf8edf997f55b77"},{"author":{"_account_id":13289,"name":"Taylor Peoples","email":"tpeoples@us.ibm.com","username":"tpeoples"},"change_message_id":"a912f28c6067ab8feaaaab8d5cbfd419ab28b1d8","unresolved":false,"context_lines":[{"line_number":112,"context_line":"                 \u0027project_domain_name\u0027: \"default\"}"},{"line_number":113,"context_line":"        else:"},{"line_number":114,"context_line":"            creds \u003d \\"},{"line_number":115,"context_line":"                {\u0027auth_url\u0027: CONF.keystone_authtoken.auth_uri,"},{"line_number":116,"context_line":"                 \u0027username\u0027: CONF.keystone_authtoken.admin_user,"},{"line_number":117,"context_line":"                 \u0027password\u0027: CONF.keystone_authtoken.admin_password,"},{"line_number":118,"context_line":"                 \u0027tenant_name\u0027: CONF.keystone_authtoken.admin_tenant_name}"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a710552_c9c03de3","line":115,"updated":"2015-12-16 06:59:48.000000000","message":"These are all duplicate - could initialize the creds dictionary with the common entries.","commit_id":"0e6db43ebb0f052a572229eddbf8edf997f55b77"},{"author":{"_account_id":16495,"name":"Jean-Emile DARTOIS","email":"jean-emile.dartois@b-com.com","username":"JeD"},"change_message_id":"392612d30d097ba4a8c39fdf8b680272fd7abbdd","unresolved":false,"context_lines":[{"line_number":70,"context_line":"            endpoint_type\u003dkwargs.get(\u0027endpoint_type\u0027) or \u0027publicURL\u0027)"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    def _is_apiv3(self, auth_url, auth_version):"},{"line_number":73,"context_line":"        # For unit test, assume v3 if no auth_url"},{"line_number":74,"context_line":"        if auth_url is None:"},{"line_number":75,"context_line":"            return True"},{"line_number":76,"context_line":"        return auth_version \u003d\u003d \u0027v3.0\u0027 or \u0027/v3\u0027 in urlparse(auth_url).path"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a7e1126_2086a4b9","line":73,"updated":"2015-12-18 08:20:17.000000000","message":"This is a bad idea to add a specific code for unit test.\nIf you need to change the behavior for unit test you can use mock the function.","commit_id":"5ae9b8b0139a62d964c1b889766786a84d5e6a56"}],"watcher/decision_engine/strategy/outlet_t_strategy.py":[{"author":{"_account_id":16495,"name":"Jean-Emile DARTOIS","email":"jean-emile.dartois@b-com.com","username":"JeD"},"change_message_id":"4ece9a020c3a23dfa877891476ceaf174a0235a7","unresolved":false,"context_lines":[{"line_number":33,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"class OutletTemperatureStrategy(BaseStrategy):"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    DEFAULT_NAME \u003d \"outlettemp\""},{"line_number":39,"context_line":"    DEFAULT_DESCRIPTION \u003d \"outlet temperature based migration strategy\""}],"source_content_type":"text/x-python","patch_set":4,"id":"7a740942_3e21839e","line":36,"updated":"2015-12-14 11:10:35.000000000","message":"Can you please add a unit test to check OutletTemperatureStrategy ? \nThanks","commit_id":"11913b7b350492d3abc23a2af9290109b51b5116"},{"author":{"_account_id":16495,"name":"Jean-Emile DARTOIS","email":"jean-emile.dartois@b-com.com","username":"JeD"},"change_message_id":"4ece9a020c3a23dfa877891476ceaf174a0235a7","unresolved":false,"context_lines":[{"line_number":99,"context_line":"                period\u003d\"30\","},{"line_number":100,"context_line":"                aggregate\u003d\u0027avg\u0027)"},{"line_number":101,"context_line":"            # some hosts may not have PTAS meters, remove from target"},{"line_number":102,"context_line":"            if outletT is None:"},{"line_number":103,"context_line":"                continue"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"            LOG.debug(\"%s: outlet temperature %f\" % (resource_id, outletT))"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a740942_7eee2b23","line":102,"updated":"2015-12-14 11:10:35.000000000","message":"IMHO, we can a warning message to let the users know that this resource_id has not PTAS meters.","commit_id":"11913b7b350492d3abc23a2af9290109b51b5116"}],"watcher/decision_engine/strategy/strategies/outlet_t_strategy.py":[{"author":{"_account_id":13289,"name":"Taylor Peoples","email":"tpeoples@us.ibm.com","username":"tpeoples"},"change_message_id":"a912f28c6067ab8feaaaab8d5cbfd419ab28b1d8","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# -*- encoding: utf-8 -*-"},{"line_number":2,"context_line":"# Copyright (c) 2015 Intel Corp"},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"# Authors: Junjie-Huang \u003cjunjie.huang@intel.com\u003e"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a710552_4909ad30","line":1,"updated":"2015-12-16 06:59:48.000000000","message":"Rename to outlet_temperature.py or outlet_temperature_strategy.py.","commit_id":"0e6db43ebb0f052a572229eddbf8edf997f55b77"},{"author":{"_account_id":13289,"name":"Taylor Peoples","email":"tpeoples@us.ibm.com","username":"tpeoples"},"change_message_id":"a912f28c6067ab8feaaaab8d5cbfd419ab28b1d8","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# -*- encoding: utf-8 -*-"},{"line_number":2,"context_line":"# Copyright (c) 2015 Intel Corp"},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"# Authors: Junjie-Huang \u003cjunjie.huang@intel.com\u003e"},{"line_number":5,"context_line":"#"},{"line_number":6,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\");"},{"line_number":7,"context_line":"# you may not use this file except in compliance with the License."}],"source_content_type":"text/x-python","patch_set":5,"id":"5a710552_6c583733","line":4,"updated":"2015-12-16 06:59:48.000000000","message":"Not needed.","commit_id":"0e6db43ebb0f052a572229eddbf8edf997f55b77"},{"author":{"_account_id":13289,"name":"Taylor Peoples","email":"tpeoples@us.ibm.com","username":"tpeoples"},"change_message_id":"a912f28c6067ab8feaaaab8d5cbfd419ab28b1d8","unresolved":false,"context_lines":[{"line_number":18,"context_line":"#"},{"line_number":19,"context_line":"from oslo_log import log"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"from watcher.common.exception import ClusterEmpty"},{"line_number":22,"context_line":"from watcher.common.exception import ClusterStateNotDefined"},{"line_number":23,"context_line":"from watcher.common.exception import VMNotFound"},{"line_number":24,"context_line":"from watcher.decision_engine.actions.migration import Migrate"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a710552_0c5f330f","line":21,"updated":"2015-12-16 06:59:48.000000000","message":"from watcher.common import exception\n\nThen use `exception.ClusterEmpty`, etc., instead of having to have import statements for each kind?","commit_id":"0e6db43ebb0f052a572229eddbf8edf997f55b77"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"ff93bf6b8f46df82d0ca089b346639a869f8aef8","unresolved":false,"context_lines":[{"line_number":33,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"class OutletTemperatureStrategy(BaseStrategy):"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    DEFAULT_NAME \u003d \"outlettemp\""},{"line_number":39,"context_line":"    DEFAULT_DESCRIPTION \u003d \"outlet temperature based migration strategy\""}],"source_content_type":"text/x-python","patch_set":5,"id":"5a710552_2b001134","line":36,"updated":"2015-12-15 09:42:43.000000000","message":"Can you add a docstring here detailing what the requirements are for this Strategy e.g.:\n\n- the hardware reqs (IPMI, ...)\n- the telemetry reqs (the metrics that need to be available in Ceilometer)\n- ...\n\nIf you use an RST format, we could then import it straight into the online doc.","commit_id":"0e6db43ebb0f052a572229eddbf8edf997f55b77"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"ff93bf6b8f46df82d0ca089b346639a869f8aef8","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    DEFAULT_NAME \u003d \"outlettemp\""},{"line_number":39,"context_line":"    DEFAULT_DESCRIPTION \u003d \"outlet temperature based migration strategy\""},{"line_number":40,"context_line":"    METER_NAME \u003d \"hardware.ipmi.node.outlet_temperature\""},{"line_number":41,"context_line":"    THRESHOLD \u003d 35"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    def __init__(self, name\u003dDEFAULT_NAME, description\u003dDEFAULT_DESCRIPTION):"},{"line_number":44,"context_line":"        super(OutletTemperatureStrategy, self).__init__(name, description)"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a710552_cb814d91","line":41,"updated":"2015-12-15 09:42:43.000000000","message":"nit: Can you indicate the unit for this threshold?","commit_id":"0e6db43ebb0f052a572229eddbf8edf997f55b77"},{"author":{"_account_id":13289,"name":"Taylor Peoples","email":"tpeoples@us.ibm.com","username":"tpeoples"},"change_message_id":"a912f28c6067ab8feaaaab8d5cbfd419ab28b1d8","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        super(OutletTemperatureStrategy, self).__init__(name, description)"},{"line_number":45,"context_line":"        # the migration plan will be triggered when the outlet temperature"},{"line_number":46,"context_line":"        # reaches threshold"},{"line_number":47,"context_line":"        self.threshold \u003d self.THRESHOLD"},{"line_number":48,"context_line":"        self._meter \u003d self.METER_NAME"},{"line_number":49,"context_line":"        self._ceilometer \u003d None"},{"line_number":50,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"5a710552_6c7d976d","line":47,"updated":"2015-12-16 06:59:48.000000000","message":"Based off of commit message, I\u0027m guessing this is going to be configurable eventually?","commit_id":"0e6db43ebb0f052a572229eddbf8edf997f55b77"},{"author":{"_account_id":13289,"name":"Taylor Peoples","email":"tpeoples@us.ibm.com","username":"tpeoples"},"change_message_id":"a912f28c6067ab8feaaaab8d5cbfd419ab28b1d8","unresolved":false,"context_lines":[{"line_number":45,"context_line":"        # the migration plan will be triggered when the outlet temperature"},{"line_number":46,"context_line":"        # reaches threshold"},{"line_number":47,"context_line":"        self.threshold \u003d self.THRESHOLD"},{"line_number":48,"context_line":"        self._meter \u003d self.METER_NAME"},{"line_number":49,"context_line":"        self._ceilometer \u003d None"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    @property"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a710552_4c93fba3","line":48,"updated":"2015-12-16 06:59:48.000000000","message":"Will this also be configurable?","commit_id":"0e6db43ebb0f052a572229eddbf8edf997f55b77"},{"author":{"_account_id":13289,"name":"Taylor Peoples","email":"tpeoples@us.ibm.com","username":"tpeoples"},"change_message_id":"a912f28c6067ab8feaaaab8d5cbfd419ab28b1d8","unresolved":false,"context_lines":[{"line_number":65,"context_line":"        memory_mb_used \u003d 0"},{"line_number":66,"context_line":"        disk_gb_used \u003d 0"},{"line_number":67,"context_line":"        if len(vms) \u003e 0:"},{"line_number":68,"context_line":"            for vm_id in vms:"},{"line_number":69,"context_line":"                vm \u003d model.get_vm_from_id(vm_id)"},{"line_number":70,"context_line":"                vcpus_used +\u003d cap_cores.get_capacity(vm)"},{"line_number":71,"context_line":"                memory_mb_used +\u003d cap_mem.get_capacity(vm)"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a710552_8c456318","line":68,"updated":"2015-12-16 06:59:48.000000000","message":"This may work for now but it isn\u0027t going to scale very well in the future if you have to calculate this on the fly (versus using cached values from somewhere).","commit_id":"0e6db43ebb0f052a572229eddbf8edf997f55b77"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"ff93bf6b8f46df82d0ca089b346639a869f8aef8","unresolved":false,"context_lines":[{"line_number":73,"context_line":""},{"line_number":74,"context_line":"        return vcpus_used, memory_mb_used, disk_gb_used"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    def execute(self, orign_model):"},{"line_number":77,"context_line":"        LOG.debug(\"initialize Outlet temperature strategy\")"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"        if orign_model is None:"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a710552_0b2675ce","line":76,"updated":"2015-12-15 09:42:43.000000000","message":"IMHO, this method is too long. Can you break it down into smaller ones so it gets easier to review?","commit_id":"0e6db43ebb0f052a572229eddbf8edf997f55b77"},{"author":{"_account_id":13289,"name":"Taylor Peoples","email":"tpeoples@us.ibm.com","username":"tpeoples"},"change_message_id":"a912f28c6067ab8feaaaab8d5cbfd419ab28b1d8","unresolved":false,"context_lines":[{"line_number":73,"context_line":""},{"line_number":74,"context_line":"        return vcpus_used, memory_mb_used, disk_gb_used"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    def execute(self, orign_model):"},{"line_number":77,"context_line":"        LOG.debug(\"initialize Outlet temperature strategy\")"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"        if orign_model is None:"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a710552_ec5667d1","line":76,"in_reply_to":"5a710552_0b2675ce","updated":"2015-12-16 06:59:48.000000000","message":"+1\n\ns/orign_model/original_model","commit_id":"0e6db43ebb0f052a572229eddbf8edf997f55b77"},{"author":{"_account_id":13289,"name":"Taylor Peoples","email":"tpeoples@us.ibm.com","username":"tpeoples"},"change_message_id":"a912f28c6067ab8feaaaab8d5cbfd419ab28b1d8","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        if size_cluster \u003d\u003d 0:"},{"line_number":86,"context_line":"            raise ClusterEmpty()"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        hosts_need_release \u003d []"},{"line_number":89,"context_line":"        hosts_target \u003d []"},{"line_number":90,"context_line":"        for hypervisor_id in hypervisors:"},{"line_number":91,"context_line":"            hypervisor \u003d current_model.get_hypervisor_from_id(hypervisor_id)"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a710552_ecc98779","line":88,"updated":"2015-12-16 06:59:48.000000000","message":"Is this representing the hosts that are above the threshold temperature?  If so, it could use a better variable name, such as hot_hosts or hosts_above_threshold.","commit_id":"0e6db43ebb0f052a572229eddbf8edf997f55b77"},{"author":{"_account_id":13289,"name":"Taylor Peoples","email":"tpeoples@us.ibm.com","username":"tpeoples"},"change_message_id":"a912f28c6067ab8feaaaab8d5cbfd419ab28b1d8","unresolved":false,"context_lines":[{"line_number":89,"context_line":"        hosts_target \u003d []"},{"line_number":90,"context_line":"        for hypervisor_id in hypervisors:"},{"line_number":91,"context_line":"            hypervisor \u003d current_model.get_hypervisor_from_id(hypervisor_id)"},{"line_number":92,"context_line":"            # resource_id \u003d \"{0}_{1}\".format(hypervisor.uuid,"},{"line_number":93,"context_line":"            #                               hypervisor.hostname)"},{"line_number":94,"context_line":"            resource_id \u003d hypervisor.uuid"},{"line_number":95,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"5a710552_4cf69bd8","line":92,"updated":"2015-12-16 06:59:48.000000000","message":"?","commit_id":"0e6db43ebb0f052a572229eddbf8edf997f55b77"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"ff93bf6b8f46df82d0ca089b346639a869f8aef8","unresolved":false,"context_lines":[{"line_number":93,"context_line":"            #                               hypervisor.hostname)"},{"line_number":94,"context_line":"            resource_id \u003d hypervisor.uuid"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"            outletT \u003d self.ceilometer.statistic_aggregation("},{"line_number":97,"context_line":"                resource_id\u003dresource_id,"},{"line_number":98,"context_line":"                meter_name\u003dself._meter,"},{"line_number":99,"context_line":"                period\u003d\"30\","}],"source_content_type":"text/x-python","patch_set":5,"id":"5a710552_0b0d153e","line":96,"updated":"2015-12-15 09:42:43.000000000","message":"nit: camelCase here","commit_id":"0e6db43ebb0f052a572229eddbf8edf997f55b77"},{"author":{"_account_id":13289,"name":"Taylor Peoples","email":"tpeoples@us.ibm.com","username":"tpeoples"},"change_message_id":"a912f28c6067ab8feaaaab8d5cbfd419ab28b1d8","unresolved":false,"context_lines":[{"line_number":93,"context_line":"            #                               hypervisor.hostname)"},{"line_number":94,"context_line":"            resource_id \u003d hypervisor.uuid"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"            outletT \u003d self.ceilometer.statistic_aggregation("},{"line_number":97,"context_line":"                resource_id\u003dresource_id,"},{"line_number":98,"context_line":"                meter_name\u003dself._meter,"},{"line_number":99,"context_line":"                period\u003d\"30\","}],"source_content_type":"text/x-python","patch_set":5,"id":"5a710552_0c69738b","line":96,"in_reply_to":"5a710552_0b0d153e","updated":"2015-12-16 06:59:48.000000000","message":"+1, use outlet_temp instead.\n\nAlso, this is a good example of some code that could be in a method:\n\ndef get_outlet_temp(hypervisor, ...)","commit_id":"0e6db43ebb0f052a572229eddbf8edf997f55b77"},{"author":{"_account_id":13289,"name":"Taylor Peoples","email":"tpeoples@us.ibm.com","username":"tpeoples"},"change_message_id":"a912f28c6067ab8feaaaab8d5cbfd419ab28b1d8","unresolved":false,"context_lines":[{"line_number":97,"context_line":"                resource_id\u003dresource_id,"},{"line_number":98,"context_line":"                meter_name\u003dself._meter,"},{"line_number":99,"context_line":"                period\u003d\"30\","},{"line_number":100,"context_line":"                aggregate\u003d\u0027avg\u0027)"},{"line_number":101,"context_line":"            # some hosts may not have PTAS meters, remove from target"},{"line_number":102,"context_line":"            if outletT is None:"},{"line_number":103,"context_line":"                LOG.warning(\"%s: no outlet temperature data\" % (resource_id))"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a710552_6ff4a9f1","line":100,"updated":"2015-12-16 06:59:48.000000000","message":"Using the average is an okay way to do this, but it can potentially cause issues.  Imagine that a server is running consistently at temperature X, but for one moment in time it reports that it is running at temperature X + 60, causing the average to go just above the threshold for a brief moment.  That might cause this algorithm to start migrating VMs away - even though the increased reading was just a blip, thereby causing unnecessary migrations.\n\nYou may find that you need a way to prevent taking action in response to these very brief, sporadic, spikes, since taking action is probably unnecessary and undesired.  This will probably require more advanced statistical analysis.","commit_id":"0e6db43ebb0f052a572229eddbf8edf997f55b77"},{"author":{"_account_id":13289,"name":"Taylor Peoples","email":"tpeoples@us.ibm.com","username":"tpeoples"},"change_message_id":"a912f28c6067ab8feaaaab8d5cbfd419ab28b1d8","unresolved":false,"context_lines":[{"line_number":98,"context_line":"                meter_name\u003dself._meter,"},{"line_number":99,"context_line":"                period\u003d\"30\","},{"line_number":100,"context_line":"                aggregate\u003d\u0027avg\u0027)"},{"line_number":101,"context_line":"            # some hosts may not have PTAS meters, remove from target"},{"line_number":102,"context_line":"            if outletT is None:"},{"line_number":103,"context_line":"                LOG.warning(\"%s: no outlet temperature data\" % (resource_id))"},{"line_number":104,"context_line":"                continue"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a710552_4c921b59","line":101,"updated":"2015-12-16 06:59:48.000000000","message":"PTAS - is this specific to Intel?  Seems like this could be generic in general - if no temperature is returned, then there isn\u0027t much to be done.","commit_id":"0e6db43ebb0f052a572229eddbf8edf997f55b77"},{"author":{"_account_id":13289,"name":"Taylor Peoples","email":"tpeoples@us.ibm.com","username":"tpeoples"},"change_message_id":"a912f28c6067ab8feaaaab8d5cbfd419ab28b1d8","unresolved":false,"context_lines":[{"line_number":100,"context_line":"                aggregate\u003d\u0027avg\u0027)"},{"line_number":101,"context_line":"            # some hosts may not have PTAS meters, remove from target"},{"line_number":102,"context_line":"            if outletT is None:"},{"line_number":103,"context_line":"                LOG.warning(\"%s: no outlet temperature data\" % (resource_id))"},{"line_number":104,"context_line":"                continue"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"            LOG.debug(\"%s: outlet temperature %f\" % (resource_id, outletT))"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a710552_8c86c311","line":103,"updated":"2015-12-16 06:59:48.000000000","message":"Should be translatable, i.e. use _LW.","commit_id":"0e6db43ebb0f052a572229eddbf8edf997f55b77"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"ff93bf6b8f46df82d0ca089b346639a869f8aef8","unresolved":false,"context_lines":[{"line_number":117,"context_line":"            return self.solution"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"        # choose the server with highest outlet t"},{"line_number":120,"context_line":"        hosts_need_release.sort(lambda x, y: cmp(y[\"outletT\"], x[\"outletT\"]))"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"        vm_to_migrate \u003d None"},{"line_number":123,"context_line":"        # pick up a vm instance to migrate"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a710552_86ffbc00","line":120,"updated":"2015-12-15 09:42:43.000000000","message":"The cmp() function is deprecated in python 3. Can you change it to something python 3 compatible?","commit_id":"0e6db43ebb0f052a572229eddbf8edf997f55b77"},{"author":{"_account_id":13289,"name":"Taylor Peoples","email":"tpeoples@us.ibm.com","username":"tpeoples"},"change_message_id":"a912f28c6067ab8feaaaab8d5cbfd419ab28b1d8","unresolved":false,"context_lines":[{"line_number":117,"context_line":"            return self.solution"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"        # choose the server with highest outlet t"},{"line_number":120,"context_line":"        hosts_need_release.sort(lambda x, y: cmp(y[\"outletT\"], x[\"outletT\"]))"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"        vm_to_migrate \u003d None"},{"line_number":123,"context_line":"        # pick up a vm instance to migrate"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a710552_cc7dabe8","line":120,"in_reply_to":"5a710552_86ffbc00","updated":"2015-12-16 06:59:48.000000000","message":"+1, maybe something like:\n\nhosts_need_release \u003d sorted(hosts_need_release, key\u003dlambda h: h[\"outletT\"])","commit_id":"0e6db43ebb0f052a572229eddbf8edf997f55b77"},{"author":{"_account_id":13289,"name":"Taylor Peoples","email":"tpeoples@us.ibm.com","username":"tpeoples"},"change_message_id":"a912f28c6067ab8feaaaab8d5cbfd419ab28b1d8","unresolved":false,"context_lines":[{"line_number":151,"context_line":"        required_mem \u003d cap_mem.get_capacity(vm)"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"        # do filter the rest of the hypervisors"},{"line_number":154,"context_line":"        dest_servers \u003d []"},{"line_number":155,"context_line":"        for hvmap in hosts_target:"},{"line_number":156,"context_line":"            host \u003d hvmap[\u0027hv\u0027]"},{"line_number":157,"context_line":"            # available"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a710552_0ce2d39f","line":154,"updated":"2015-12-16 06:59:48.000000000","message":"The determination of what server to migrate VMs to should be using the Nova scheduler in order to take advantage of all of the existing scheduler filters long term.  This also prevents having to calculate the capacity requirements, etc., which can quickly turn into a headache.","commit_id":"0e6db43ebb0f052a572229eddbf8edf997f55b77"},{"author":{"_account_id":13289,"name":"Taylor Peoples","email":"tpeoples@us.ibm.com","username":"tpeoples"},"change_message_id":"a912f28c6067ab8feaaaab8d5cbfd419ab28b1d8","unresolved":false,"context_lines":[{"line_number":176,"context_line":"            LOG.info(\"No proper target host could be found\")"},{"line_number":177,"context_line":"            return self.solution"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"        dest_servers.sort(lambda x, y: cmp(x[\"outletT\"], y[\"outletT\"]))"},{"line_number":180,"context_line":"        mig_dst_hypervisor \u003d dest_servers[0][\u0027hv\u0027]"},{"line_number":181,"context_line":"        # generate solution to migrate the vm to the dest server,"},{"line_number":182,"context_line":"        if current_model.get_mapping().migrate_vm(vm_to_migrate,"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a710552_0cf9734d","line":179,"updated":"2015-12-16 06:59:48.000000000","message":"Ditto","commit_id":"0e6db43ebb0f052a572229eddbf8edf997f55b77"}],"watcher/decision_engine/strategy/strategies/outlet_temp_control.py":[{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"3135441888cebe97288aadbfc69b285b68cdd7b6","unresolved":false,"context_lines":[{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    @ceilometer.setter"},{"line_number":84,"context_line":"    def ceilometer(self, c):"},{"line_number":85,"context_line":"        self._ceilometer \u003d c"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    def calc_used_res(self, model, hypervisor, cap_cores, cap_mem, cap_disk):"},{"line_number":88,"context_line":"        \u0027\u0027\u0027calculate the used vcpus, memory and disk based on VM flavors\u0027\u0027\u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a7e1126_7d61b538","line":85,"updated":"2015-12-18 07:43:07.000000000","message":"It is not for this patch but maybe You can think about moving this setter and property to BaseStrategy class because as I can see it is used in same way in all strategies. What are You thinking about that?","commit_id":"5ae9b8b0139a62d964c1b889766786a84d5e6a56"},{"author":{"_account_id":13790,"name":"Zhenzan Zhou","email":"linuxosa@gmail.com","username":"zhenzanzhou"},"change_message_id":"0d43ff0b40e9e5bd6addf253b29588b5ccb42bd8","unresolved":false,"context_lines":[{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    @ceilometer.setter"},{"line_number":84,"context_line":"    def ceilometer(self, c):"},{"line_number":85,"context_line":"        self._ceilometer \u003d c"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    def calc_used_res(self, model, hypervisor, cap_cores, cap_mem, cap_disk):"},{"line_number":88,"context_line":"        \u0027\u0027\u0027calculate the used vcpus, memory and disk based on VM flavors\u0027\u0027\u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a7e1126_d2cdeb85","line":85,"in_reply_to":"3a7e1126_7d61b538","updated":"2015-12-21 07:40:01.000000000","message":"Thanks for review. You are right. It can be refactored in another patch if we all agree that ceilometer client is a must-have.","commit_id":"5ae9b8b0139a62d964c1b889766786a84d5e6a56"},{"author":{"_account_id":16495,"name":"Jean-Emile DARTOIS","email":"jean-emile.dartois@b-com.com","username":"JeD"},"change_message_id":"98aa22391baa017e9560d565c85323948b1e10c8","unresolved":false,"context_lines":[{"line_number":99,"context_line":""},{"line_number":100,"context_line":"        return vcpus_used, memory_mb_used, disk_gb_used"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    def check_hosts_outletT(self, model):"},{"line_number":103,"context_line":"        \u0027\u0027\u0027Group hosts based on outlet temp meters\u0027\u0027\u0027"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        hypervisors \u003d model.get_all_hypervisors()"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a7e1126_e38c2681","line":102,"range":{"start_line":102,"start_character":8,"end_line":102,"end_character":27},"updated":"2015-12-18 08:43:59.000000000","message":"nit: CamelCase","commit_id":"5ae9b8b0139a62d964c1b889766786a84d5e6a56"},{"author":{"_account_id":13790,"name":"Zhenzan Zhou","email":"linuxosa@gmail.com","username":"zhenzanzhou"},"change_message_id":"0d43ff0b40e9e5bd6addf253b29588b5ccb42bd8","unresolved":false,"context_lines":[{"line_number":99,"context_line":""},{"line_number":100,"context_line":"        return vcpus_used, memory_mb_used, disk_gb_used"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    def check_hosts_outletT(self, model):"},{"line_number":103,"context_line":"        \u0027\u0027\u0027Group hosts based on outlet temp meters\u0027\u0027\u0027"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        hypervisors \u003d model.get_all_hypervisors()"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a7e1126_ace00d97","line":102,"range":{"start_line":102,"start_character":8,"end_line":102,"end_character":27},"in_reply_to":"3a7e1126_e38c2681","updated":"2015-12-21 07:40:01.000000000","message":"Done","commit_id":"5ae9b8b0139a62d964c1b889766786a84d5e6a56"},{"author":{"_account_id":16495,"name":"Jean-Emile DARTOIS","email":"jean-emile.dartois@b-com.com","username":"JeD"},"change_message_id":"87aa5d627fc356c9b1cd03594669929d2627d426","unresolved":false,"context_lines":[{"line_number":100,"context_line":"        return vcpus_used, memory_mb_used, disk_gb_used"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    def check_hosts_outletT(self, model):"},{"line_number":103,"context_line":"        \u0027\u0027\u0027Group hosts based on outlet temp meters\u0027\u0027\u0027"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        hypervisors \u003d model.get_all_hypervisors()"},{"line_number":106,"context_line":"        size_cluster \u003d len(hypervisors)"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a7e1126_5424cead","line":103,"range":{"start_line":103,"start_character":17,"end_line":103,"end_character":22},"updated":"2015-12-18 10:06:16.000000000","message":"IMHO, we can rename the function to be more clear.\n\nWhat do you think about ? : \ndef group_hosts_by_temperature_threshold(self):","commit_id":"5ae9b8b0139a62d964c1b889766786a84d5e6a56"},{"author":{"_account_id":13790,"name":"Zhenzan Zhou","email":"linuxosa@gmail.com","username":"zhenzanzhou"},"change_message_id":"0d43ff0b40e9e5bd6addf253b29588b5ccb42bd8","unresolved":false,"context_lines":[{"line_number":100,"context_line":"        return vcpus_used, memory_mb_used, disk_gb_used"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    def check_hosts_outletT(self, model):"},{"line_number":103,"context_line":"        \u0027\u0027\u0027Group hosts based on outlet temp meters\u0027\u0027\u0027"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        hypervisors \u003d model.get_all_hypervisors()"},{"line_number":106,"context_line":"        size_cluster \u003d len(hypervisors)"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a7e1126_4cf08967","line":103,"range":{"start_line":103,"start_character":17,"end_line":103,"end_character":22},"in_reply_to":"3a7e1126_5424cead","updated":"2015-12-21 07:40:01.000000000","message":"Done","commit_id":"5ae9b8b0139a62d964c1b889766786a84d5e6a56"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"23338fb6b503c1d79921772bfbc36a1baa182606","unresolved":false,"context_lines":[{"line_number":111,"context_line":"        hosts_target \u003d []"},{"line_number":112,"context_line":"        for hypervisor_id in hypervisors:"},{"line_number":113,"context_line":"            hypervisor \u003d model.get_hypervisor_from_id(hypervisor_id)"},{"line_number":114,"context_line":"            # resource_id \u003d \"{0}_{1}\".format(hypervisor.uuid,"},{"line_number":115,"context_line":"            #                               hypervisor.hostname)"},{"line_number":116,"context_line":"            resource_id \u003d hypervisor.uuid"},{"line_number":117,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"3a7e1126_c99b4b71","line":114,"range":{"start_line":114,"start_character":14,"end_line":114,"end_character":25},"updated":"2015-12-18 09:28:23.000000000","message":"nit: can you delete these commented lines please?","commit_id":"5ae9b8b0139a62d964c1b889766786a84d5e6a56"},{"author":{"_account_id":13790,"name":"Zhenzan Zhou","email":"linuxosa@gmail.com","username":"zhenzanzhou"},"change_message_id":"0d43ff0b40e9e5bd6addf253b29588b5ccb42bd8","unresolved":false,"context_lines":[{"line_number":111,"context_line":"        hosts_target \u003d []"},{"line_number":112,"context_line":"        for hypervisor_id in hypervisors:"},{"line_number":113,"context_line":"            hypervisor \u003d model.get_hypervisor_from_id(hypervisor_id)"},{"line_number":114,"context_line":"            # resource_id \u003d \"{0}_{1}\".format(hypervisor.uuid,"},{"line_number":115,"context_line":"            #                               hypervisor.hostname)"},{"line_number":116,"context_line":"            resource_id \u003d hypervisor.uuid"},{"line_number":117,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"3a7e1126_6cf54555","line":114,"range":{"start_line":114,"start_character":14,"end_line":114,"end_character":25},"in_reply_to":"3a7e1126_c99b4b71","updated":"2015-12-21 07:40:01.000000000","message":"Done","commit_id":"5ae9b8b0139a62d964c1b889766786a84d5e6a56"},{"author":{"_account_id":16495,"name":"Jean-Emile DARTOIS","email":"jean-emile.dartois@b-com.com","username":"JeD"},"change_message_id":"98aa22391baa017e9560d565c85323948b1e10c8","unresolved":false,"context_lines":[{"line_number":115,"context_line":"            #                               hypervisor.hostname)"},{"line_number":116,"context_line":"            resource_id \u003d hypervisor.uuid"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"            outletT \u003d self.ceilometer.statistic_aggregation("},{"line_number":119,"context_line":"                resource_id\u003dresource_id,"},{"line_number":120,"context_line":"                meter_name\u003dself._meter,"},{"line_number":121,"context_line":"                period\u003d\"30\","}],"source_content_type":"text/x-python","patch_set":6,"id":"3a7e1126_236a2e1b","line":118,"range":{"start_line":118,"start_character":12,"end_line":118,"end_character":19},"updated":"2015-12-18 08:43:59.000000000","message":"nit: CamelCase","commit_id":"5ae9b8b0139a62d964c1b889766786a84d5e6a56"},{"author":{"_account_id":13790,"name":"Zhenzan Zhou","email":"linuxosa@gmail.com","username":"zhenzanzhou"},"change_message_id":"0d43ff0b40e9e5bd6addf253b29588b5ccb42bd8","unresolved":false,"context_lines":[{"line_number":115,"context_line":"            #                               hypervisor.hostname)"},{"line_number":116,"context_line":"            resource_id \u003d hypervisor.uuid"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"            outletT \u003d self.ceilometer.statistic_aggregation("},{"line_number":119,"context_line":"                resource_id\u003dresource_id,"},{"line_number":120,"context_line":"                meter_name\u003dself._meter,"},{"line_number":121,"context_line":"                period\u003d\"30\","}],"source_content_type":"text/x-python","patch_set":6,"id":"3a7e1126_0ce601b0","line":118,"range":{"start_line":118,"start_character":12,"end_line":118,"end_character":19},"in_reply_to":"3a7e1126_236a2e1b","updated":"2015-12-21 07:40:01.000000000","message":"Done","commit_id":"5ae9b8b0139a62d964c1b889766786a84d5e6a56"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"23338fb6b503c1d79921772bfbc36a1baa182606","unresolved":false,"context_lines":[{"line_number":121,"context_line":"                period\u003d\"30\","},{"line_number":122,"context_line":"                aggregate\u003d\u0027avg\u0027)"},{"line_number":123,"context_line":"            # some hosts may not have PTAS meters, remove from target"},{"line_number":124,"context_line":"            if outletT is None:"},{"line_number":125,"context_line":"                LOG.warning(\"%s: no outlet temperature data\" % (resource_id))"},{"line_number":126,"context_line":"                continue"},{"line_number":127,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"3a7e1126_e97de71c","line":124,"range":{"start_line":124,"start_character":15,"end_line":124,"end_character":22},"updated":"2015-12-18 09:28:23.000000000","message":"nit: camelCase","commit_id":"5ae9b8b0139a62d964c1b889766786a84d5e6a56"},{"author":{"_account_id":13790,"name":"Zhenzan Zhou","email":"linuxosa@gmail.com","username":"zhenzanzhou"},"change_message_id":"0d43ff0b40e9e5bd6addf253b29588b5ccb42bd8","unresolved":false,"context_lines":[{"line_number":121,"context_line":"                period\u003d\"30\","},{"line_number":122,"context_line":"                aggregate\u003d\u0027avg\u0027)"},{"line_number":123,"context_line":"            # some hosts may not have PTAS meters, remove from target"},{"line_number":124,"context_line":"            if outletT is None:"},{"line_number":125,"context_line":"                LOG.warning(\"%s: no outlet temperature data\" % (resource_id))"},{"line_number":126,"context_line":"                continue"},{"line_number":127,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"3a7e1126_2cebbd79","line":124,"range":{"start_line":124,"start_character":15,"end_line":124,"end_character":22},"in_reply_to":"3a7e1126_e97de71c","updated":"2015-12-21 07:40:01.000000000","message":"Done","commit_id":"5ae9b8b0139a62d964c1b889766786a84d5e6a56"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"23338fb6b503c1d79921772bfbc36a1baa182606","unresolved":false,"context_lines":[{"line_number":122,"context_line":"                aggregate\u003d\u0027avg\u0027)"},{"line_number":123,"context_line":"            # some hosts may not have PTAS meters, remove from target"},{"line_number":124,"context_line":"            if outletT is None:"},{"line_number":125,"context_line":"                LOG.warning(\"%s: no outlet temperature data\" % (resource_id))"},{"line_number":126,"context_line":"                continue"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"            LOG.debug(\"%s: outlet temperature %f\" % (resource_id, outletT))"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a7e1126_a91b5f1a","line":125,"range":{"start_line":125,"start_character":27,"end_line":125,"end_character":75},"updated":"2015-12-18 09:28:23.000000000","message":"Can you use make your logs translatable? Like:\n\nfrom watcher._i18n import _LE\n\nLOG.warning(_LE(\"%s: no outlet temperature data\"), resource_id)","commit_id":"5ae9b8b0139a62d964c1b889766786a84d5e6a56"},{"author":{"_account_id":13790,"name":"Zhenzan Zhou","email":"linuxosa@gmail.com","username":"zhenzanzhou"},"change_message_id":"0d43ff0b40e9e5bd6addf253b29588b5ccb42bd8","unresolved":false,"context_lines":[{"line_number":122,"context_line":"                aggregate\u003d\u0027avg\u0027)"},{"line_number":123,"context_line":"            # some hosts may not have PTAS meters, remove from target"},{"line_number":124,"context_line":"            if outletT is None:"},{"line_number":125,"context_line":"                LOG.warning(\"%s: no outlet temperature data\" % (resource_id))"},{"line_number":126,"context_line":"                continue"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"            LOG.debug(\"%s: outlet temperature %f\" % (resource_id, outletT))"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a7e1126_4c65e91b","line":125,"range":{"start_line":125,"start_character":27,"end_line":125,"end_character":75},"in_reply_to":"3a7e1126_a91b5f1a","updated":"2015-12-21 07:40:01.000000000","message":"Done","commit_id":"5ae9b8b0139a62d964c1b889766786a84d5e6a56"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"23338fb6b503c1d79921772bfbc36a1baa182606","unresolved":false,"context_lines":[{"line_number":146,"context_line":"                        # select the first active VM to migrate"},{"line_number":147,"context_line":"                        vm \u003d model.get_vm_from_id(vm_id)"},{"line_number":148,"context_line":"                        if vm.state !\u003d VMState.ACTIVE.value:"},{"line_number":149,"context_line":"                            LOG.info(\"VM not active, skipped: %s\" % vm.uuid)"},{"line_number":150,"context_line":"                            continue"},{"line_number":151,"context_line":"                        return (mig_src_hypervisor, vm)"},{"line_number":152,"context_line":"                    except VMNotFound as e:"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a7e1126_09e4f30a","line":149,"range":{"start_line":149,"start_character":0,"end_line":149,"end_character":76},"updated":"2015-12-18 09:28:23.000000000","message":"ditto on i18n","commit_id":"5ae9b8b0139a62d964c1b889766786a84d5e6a56"},{"author":{"_account_id":13790,"name":"Zhenzan Zhou","email":"linuxosa@gmail.com","username":"zhenzanzhou"},"change_message_id":"0d43ff0b40e9e5bd6addf253b29588b5ccb42bd8","unresolved":false,"context_lines":[{"line_number":146,"context_line":"                        # select the first active VM to migrate"},{"line_number":147,"context_line":"                        vm \u003d model.get_vm_from_id(vm_id)"},{"line_number":148,"context_line":"                        if vm.state !\u003d VMState.ACTIVE.value:"},{"line_number":149,"context_line":"                            LOG.info(\"VM not active, skipped: %s\" % vm.uuid)"},{"line_number":150,"context_line":"                            continue"},{"line_number":151,"context_line":"                        return (mig_src_hypervisor, vm)"},{"line_number":152,"context_line":"                    except VMNotFound as e:"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a7e1126_2c709ddb","line":149,"range":{"start_line":149,"start_character":0,"end_line":149,"end_character":76},"in_reply_to":"3a7e1126_09e4f30a","updated":"2015-12-21 07:40:01.000000000","message":"Done","commit_id":"5ae9b8b0139a62d964c1b889766786a84d5e6a56"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"23338fb6b503c1d79921772bfbc36a1baa182606","unresolved":false,"context_lines":[{"line_number":150,"context_line":"                            continue"},{"line_number":151,"context_line":"                        return (mig_src_hypervisor, vm)"},{"line_number":152,"context_line":"                    except VMNotFound as e:"},{"line_number":153,"context_line":"                        LOG.info(\"VM not found Error: %s\" % e.message)"},{"line_number":154,"context_line":"                        pass"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"        return None"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a7e1126_49ebdbb0","line":153,"range":{"start_line":153,"start_character":32,"end_line":153,"end_character":34},"updated":"2015-12-18 09:28:23.000000000","message":"ditto","commit_id":"5ae9b8b0139a62d964c1b889766786a84d5e6a56"},{"author":{"_account_id":13790,"name":"Zhenzan Zhou","email":"linuxosa@gmail.com","username":"zhenzanzhou"},"change_message_id":"0d43ff0b40e9e5bd6addf253b29588b5ccb42bd8","unresolved":false,"context_lines":[{"line_number":150,"context_line":"                            continue"},{"line_number":151,"context_line":"                        return (mig_src_hypervisor, vm)"},{"line_number":152,"context_line":"                    except VMNotFound as e:"},{"line_number":153,"context_line":"                        LOG.info(\"VM not found Error: %s\" % e.message)"},{"line_number":154,"context_line":"                        pass"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"        return None"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a7e1126_32a30fb4","line":153,"range":{"start_line":153,"start_character":32,"end_line":153,"end_character":34},"in_reply_to":"3a7e1126_49ebdbb0","updated":"2015-12-21 07:40:01.000000000","message":"Done","commit_id":"5ae9b8b0139a62d964c1b889766786a84d5e6a56"},{"author":{"_account_id":16495,"name":"Jean-Emile DARTOIS","email":"jean-emile.dartois@b-com.com","username":"JeD"},"change_message_id":"87aa5d627fc356c9b1cd03594669929d2627d426","unresolved":false,"context_lines":[{"line_number":155,"context_line":""},{"line_number":156,"context_line":"        return None"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"    def select_dest_servers(self, model, hosts, vm_to_migrate):"},{"line_number":159,"context_line":"        \u0027\u0027\u0027Select proper destination hosts from provided host list\u0027\u0027\u0027"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"        cap_cores \u003d model.get_resource_from_id(ResourceType.cpu_cores)"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a7e1126_34d262d3","line":158,"updated":"2015-12-18 10:06:16.000000000","message":"IMHO, we can rename the function to be more clear.\n\nWhat do you think about ? : \ndef host_passes(...)","commit_id":"5ae9b8b0139a62d964c1b889766786a84d5e6a56"},{"author":{"_account_id":16495,"name":"Jean-Emile DARTOIS","email":"jean-emile.dartois@b-com.com","username":"JeD"},"change_message_id":"87aa5d627fc356c9b1cd03594669929d2627d426","unresolved":false,"context_lines":[{"line_number":155,"context_line":""},{"line_number":156,"context_line":"        return None"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"    def select_dest_servers(self, model, hosts, vm_to_migrate):"},{"line_number":159,"context_line":"        \u0027\u0027\u0027Select proper destination hosts from provided host list\u0027\u0027\u0027"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"        cap_cores \u003d model.get_resource_from_id(ResourceType.cpu_cores)"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a7e1126_f48a9abe","line":158,"range":{"start_line":158,"start_character":48,"end_line":158,"end_character":61},"updated":"2015-12-18 10:06:16.000000000","message":"what do you think about replace \n\"\u0027Select proper destination hosts from provided host list\" by \n\"\"\"Only return hosts with sufficient available resources.\"\"\"","commit_id":"5ae9b8b0139a62d964c1b889766786a84d5e6a56"},{"author":{"_account_id":13790,"name":"Zhenzan Zhou","email":"linuxosa@gmail.com","username":"zhenzanzhou"},"change_message_id":"0d43ff0b40e9e5bd6addf253b29588b5ccb42bd8","unresolved":false,"context_lines":[{"line_number":155,"context_line":""},{"line_number":156,"context_line":"        return None"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"    def select_dest_servers(self, model, hosts, vm_to_migrate):"},{"line_number":159,"context_line":"        \u0027\u0027\u0027Select proper destination hosts from provided host list\u0027\u0027\u0027"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"        cap_cores \u003d model.get_resource_from_id(ResourceType.cpu_cores)"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a7e1126_52e49bdf","line":158,"in_reply_to":"3a7e1126_34d262d3","updated":"2015-12-21 07:40:01.000000000","message":"Done","commit_id":"5ae9b8b0139a62d964c1b889766786a84d5e6a56"},{"author":{"_account_id":13790,"name":"Zhenzan Zhou","email":"linuxosa@gmail.com","username":"zhenzanzhou"},"change_message_id":"0d43ff0b40e9e5bd6addf253b29588b5ccb42bd8","unresolved":false,"context_lines":[{"line_number":155,"context_line":""},{"line_number":156,"context_line":"        return None"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"    def select_dest_servers(self, model, hosts, vm_to_migrate):"},{"line_number":159,"context_line":"        \u0027\u0027\u0027Select proper destination hosts from provided host list\u0027\u0027\u0027"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"        cap_cores \u003d model.get_resource_from_id(ResourceType.cpu_cores)"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a7e1126_52a81b8d","line":158,"range":{"start_line":158,"start_character":48,"end_line":158,"end_character":61},"in_reply_to":"3a7e1126_f48a9abe","updated":"2015-12-21 07:40:01.000000000","message":"Done","commit_id":"5ae9b8b0139a62d964c1b889766786a84d5e6a56"},{"author":{"_account_id":16495,"name":"Jean-Emile DARTOIS","email":"jean-emile.dartois@b-com.com","username":"JeD"},"change_message_id":"87aa5d627fc356c9b1cd03594669929d2627d426","unresolved":false,"context_lines":[{"line_number":156,"context_line":"        return None"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"    def select_dest_servers(self, model, hosts, vm_to_migrate):"},{"line_number":159,"context_line":"        \u0027\u0027\u0027Select proper destination hosts from provided host list\u0027\u0027\u0027"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"        cap_cores \u003d model.get_resource_from_id(ResourceType.cpu_cores)"},{"line_number":162,"context_line":"        cap_disk \u003d model.get_resource_from_id(ResourceType.disk)"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a7e1126_4f48bb87","line":159,"range":{"start_line":159,"start_character":8,"end_line":159,"end_character":11},"updated":"2015-12-18 10:06:16.000000000","message":"IMHO, we need to use nova filter. however, we can do it in another patchset.","commit_id":"5ae9b8b0139a62d964c1b889766786a84d5e6a56"},{"author":{"_account_id":13790,"name":"Zhenzan Zhou","email":"linuxosa@gmail.com","username":"zhenzanzhou"},"change_message_id":"0d43ff0b40e9e5bd6addf253b29588b5ccb42bd8","unresolved":false,"context_lines":[{"line_number":156,"context_line":"        return None"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"    def select_dest_servers(self, model, hosts, vm_to_migrate):"},{"line_number":159,"context_line":"        \u0027\u0027\u0027Select proper destination hosts from provided host list\u0027\u0027\u0027"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"        cap_cores \u003d model.get_resource_from_id(ResourceType.cpu_cores)"},{"line_number":162,"context_line":"        cap_disk \u003d model.get_resource_from_id(ResourceType.disk)"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a7e1126_1285b305","line":159,"range":{"start_line":159,"start_character":8,"end_line":159,"end_character":11},"in_reply_to":"3a7e1126_4f48bb87","updated":"2015-12-21 07:40:01.000000000","message":"Agree. It\u0027s better to use Nova filter. But we don\u0027t have any filter that is aware of outlet temp yet.","commit_id":"5ae9b8b0139a62d964c1b889766786a84d5e6a56"},{"author":{"_account_id":16495,"name":"Jean-Emile DARTOIS","email":"jean-emile.dartois@b-com.com","username":"JeD"},"change_message_id":"87aa5d627fc356c9b1cd03594669929d2627d426","unresolved":false,"context_lines":[{"line_number":206,"context_line":"                                    reverse\u003dTrue,"},{"line_number":207,"context_line":"                                    key\u003dlambda x: (x[\"outletT\"]))"},{"line_number":208,"context_line":""},{"line_number":209,"context_line":"        vm_to_migrate \u003d self.choose_vm_to_migrate(current_model,"},{"line_number":210,"context_line":"                                                  hosts_need_release)"},{"line_number":211,"context_line":"        # calculate the vm\u0027s cpu cores,memory,disk needs"},{"line_number":212,"context_line":"        if vm_to_migrate is None:"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a7e1126_89ba23bf","line":209,"range":{"start_line":209,"start_character":29,"end_line":209,"end_character":49},"updated":"2015-12-18 10:06:16.000000000","message":"Why do you select only one VM  to migrate ? (The solution will be limited to only one migration if there at least one VM is active  )","commit_id":"5ae9b8b0139a62d964c1b889766786a84d5e6a56"},{"author":{"_account_id":13790,"name":"Zhenzan Zhou","email":"linuxosa@gmail.com","username":"zhenzanzhou"},"change_message_id":"0d43ff0b40e9e5bd6addf253b29588b5ccb42bd8","unresolved":false,"context_lines":[{"line_number":206,"context_line":"                                    reverse\u003dTrue,"},{"line_number":207,"context_line":"                                    key\u003dlambda x: (x[\"outletT\"]))"},{"line_number":208,"context_line":""},{"line_number":209,"context_line":"        vm_to_migrate \u003d self.choose_vm_to_migrate(current_model,"},{"line_number":210,"context_line":"                                                  hosts_need_release)"},{"line_number":211,"context_line":"        # calculate the vm\u0027s cpu cores,memory,disk needs"},{"line_number":212,"context_line":"        if vm_to_migrate is None:"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a7e1126_b2ccdf6a","line":209,"range":{"start_line":209,"start_character":29,"end_line":209,"end_character":49},"in_reply_to":"3a7e1126_89ba23bf","updated":"2015-12-21 07:40:01.000000000","message":"It\u0027s a simple algorithm and cannot forecast how many workloads need migrate. So we just migrate one at a time and re-check again.","commit_id":"5ae9b8b0139a62d964c1b889766786a84d5e6a56"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"23338fb6b503c1d79921772bfbc36a1baa182606","unresolved":false,"context_lines":[{"line_number":212,"context_line":"        if vm_to_migrate is None:"},{"line_number":213,"context_line":"            return self.solution"},{"line_number":214,"context_line":""},{"line_number":215,"context_line":"        mig_src_hypervisor \u003d vm_to_migrate[0]"},{"line_number":216,"context_line":"        vm_src \u003d vm_to_migrate[1]"},{"line_number":217,"context_line":"        dest_servers \u003d self.select_dest_servers(current_model,"},{"line_number":218,"context_line":"                                                hosts_target,"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a7e1126_692d7745","line":215,"updated":"2015-12-18 09:28:23.000000000","message":"nit: can you use a list unpacking which would look more pythonic. Like:\n\nmig_src_hypervisor, vm_src \u003d vm_to_migrate","commit_id":"5ae9b8b0139a62d964c1b889766786a84d5e6a56"},{"author":{"_account_id":13790,"name":"Zhenzan Zhou","email":"linuxosa@gmail.com","username":"zhenzanzhou"},"change_message_id":"0d43ff0b40e9e5bd6addf253b29588b5ccb42bd8","unresolved":false,"context_lines":[{"line_number":212,"context_line":"        if vm_to_migrate is None:"},{"line_number":213,"context_line":"            return self.solution"},{"line_number":214,"context_line":""},{"line_number":215,"context_line":"        mig_src_hypervisor \u003d vm_to_migrate[0]"},{"line_number":216,"context_line":"        vm_src \u003d vm_to_migrate[1]"},{"line_number":217,"context_line":"        dest_servers \u003d self.select_dest_servers(current_model,"},{"line_number":218,"context_line":"                                                hosts_target,"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a7e1126_52d7bb4a","line":215,"in_reply_to":"3a7e1126_692d7745","updated":"2015-12-21 07:40:01.000000000","message":"Done","commit_id":"5ae9b8b0139a62d964c1b889766786a84d5e6a56"},{"author":{"_account_id":16495,"name":"Jean-Emile DARTOIS","email":"jean-emile.dartois@b-com.com","username":"JeD"},"change_message_id":"87aa5d627fc356c9b1cd03594669929d2627d426","unresolved":false,"context_lines":[{"line_number":220,"context_line":"        # sort the filtered result by outlet T"},{"line_number":221,"context_line":"        # pick up the lowest one as dest server"},{"line_number":222,"context_line":"        if len(dest_servers) \u003d\u003d 0:"},{"line_number":223,"context_line":"            # TODO(zhenzanz): maybe to warn that there\u0027s no resource"},{"line_number":224,"context_line":"            # for instance?"},{"line_number":225,"context_line":"            LOG.info(\"No proper target host could be found\")"},{"line_number":226,"context_line":"            return self.solution"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a7e1126_f4261acd","line":223,"range":{"start_line":223,"start_character":19,"end_line":223,"end_character":27},"updated":"2015-12-18 10:06:16.000000000","message":"This is also maybe because the temperature of the hosts are all above the threashold.","commit_id":"5ae9b8b0139a62d964c1b889766786a84d5e6a56"},{"author":{"_account_id":13790,"name":"Zhenzan Zhou","email":"linuxosa@gmail.com","username":"zhenzanzhou"},"change_message_id":"0d43ff0b40e9e5bd6addf253b29588b5ccb42bd8","unresolved":false,"context_lines":[{"line_number":220,"context_line":"        # sort the filtered result by outlet T"},{"line_number":221,"context_line":"        # pick up the lowest one as dest server"},{"line_number":222,"context_line":"        if len(dest_servers) \u003d\u003d 0:"},{"line_number":223,"context_line":"            # TODO(zhenzanz): maybe to warn that there\u0027s no resource"},{"line_number":224,"context_line":"            # for instance?"},{"line_number":225,"context_line":"            LOG.info(\"No proper target host could be found\")"},{"line_number":226,"context_line":"            return self.solution"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a7e1126_72bc3706","line":223,"range":{"start_line":223,"start_character":19,"end_line":223,"end_character":27},"in_reply_to":"3a7e1126_f4261acd","updated":"2015-12-21 07:40:01.000000000","message":"Done","commit_id":"5ae9b8b0139a62d964c1b889766786a84d5e6a56"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"23338fb6b503c1d79921772bfbc36a1baa182606","unresolved":false,"context_lines":[{"line_number":222,"context_line":"        if len(dest_servers) \u003d\u003d 0:"},{"line_number":223,"context_line":"            # TODO(zhenzanz): maybe to warn that there\u0027s no resource"},{"line_number":224,"context_line":"            # for instance?"},{"line_number":225,"context_line":"            LOG.info(\"No proper target host could be found\")"},{"line_number":226,"context_line":"            return self.solution"},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"        dest_servers \u003d sorted(dest_servers,"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a7e1126_89bea3d2","line":225,"range":{"start_line":225,"start_character":0,"end_line":225,"end_character":60},"updated":"2015-12-18 09:28:23.000000000","message":"ditto","commit_id":"5ae9b8b0139a62d964c1b889766786a84d5e6a56"},{"author":{"_account_id":13790,"name":"Zhenzan Zhou","email":"linuxosa@gmail.com","username":"zhenzanzhou"},"change_message_id":"0d43ff0b40e9e5bd6addf253b29588b5ccb42bd8","unresolved":false,"context_lines":[{"line_number":222,"context_line":"        if len(dest_servers) \u003d\u003d 0:"},{"line_number":223,"context_line":"            # TODO(zhenzanz): maybe to warn that there\u0027s no resource"},{"line_number":224,"context_line":"            # for instance?"},{"line_number":225,"context_line":"            LOG.info(\"No proper target host could be found\")"},{"line_number":226,"context_line":"            return self.solution"},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"        dest_servers \u003d sorted(dest_servers,"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a7e1126_12cdb3b6","line":225,"range":{"start_line":225,"start_character":0,"end_line":225,"end_character":60},"in_reply_to":"3a7e1126_89bea3d2","updated":"2015-12-21 07:40:01.000000000","message":"Done","commit_id":"5ae9b8b0139a62d964c1b889766786a84d5e6a56"},{"author":{"_account_id":16495,"name":"Jean-Emile DARTOIS","email":"jean-emile.dartois@b-com.com","username":"JeD"},"change_message_id":"96fd76dbcd1daab6ffba0bd10ca32df8359debae","unresolved":false,"context_lines":[{"line_number":48,"context_line":"        servers. It generates solutions to move a workload if a server’s outlet"},{"line_number":49,"context_line":"        temperature is higher than specified threshold. As it cannot forecast"},{"line_number":50,"context_line":"        how many workloads should be migrated so it simply migrate one at a"},{"line_number":51,"context_line":"        time. So it\u0027s better to use this algorithm with CONTINUOS audits."},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"        Requirement :"},{"line_number":54,"context_line":"        * Hardware reqs: computer node should support IPMI and PTAS technology"}],"source_content_type":"text/x-python","patch_set":7,"id":"3a7e1126_7d43a313","line":51,"range":{"start_line":51,"start_character":56,"end_line":51,"end_character":65},"updated":"2015-12-21 10:41:21.000000000","message":"nit: s/CONTINUOS/CONTINUOUS/","commit_id":"d1fe72ed2d4c21cbab8aa3ef3f2b6f026061c90e"},{"author":{"_account_id":16495,"name":"Jean-Emile DARTOIS","email":"jean-emile.dartois@b-com.com","username":"JeD"},"change_message_id":"96fd76dbcd1daab6ffba0bd10ca32df8359debae","unresolved":false,"context_lines":[{"line_number":49,"context_line":"        temperature is higher than specified threshold. As it cannot forecast"},{"line_number":50,"context_line":"        how many workloads should be migrated so it simply migrate one at a"},{"line_number":51,"context_line":"        time. So it\u0027s better to use this algorithm with CONTINUOS audits."},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"        Requirement :"},{"line_number":54,"context_line":"        * Hardware reqs: computer node should support IPMI and PTAS technology"},{"line_number":55,"context_line":"        * Software reqs: Ceilometer component ceilometer-agent-ipmi running"}],"source_content_type":"text/x-python","patch_set":7,"id":"3a7e1126_486707e9","line":52,"updated":"2015-12-21 10:41:21.000000000","message":"It is a migration strategy based on the Outlet Temperature of physical servers. It generates solutions to move a workload whenever a server’s outlet temperature is higher than the specified threshold. As of now, we cannot forecast how many instances workloads should be migrated. This is the reason why we simply plan a single virtual machine migration.\n\nSo it\u0027s better to use this strategy with CONTINUOUS audits.","commit_id":"d1fe72ed2d4c21cbab8aa3ef3f2b6f026061c90e"}],"watcher/tests/decision_engine/strategy/strategies/test_outlet_temp_control.py":[{"author":{"_account_id":16495,"name":"Jean-Emile DARTOIS","email":"jean-emile.dartois@b-com.com","username":"JeD"},"change_message_id":"98aa22391baa017e9560d565c85323948b1e10c8","unresolved":false,"context_lines":[{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        self.assertEqual((cores_used, mem_used, disk_used), (10, 2, 20))"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    def test_check_hosts_outletT(self):"},{"line_number":60,"context_line":"        model \u003d self.fake_cluster.generate_scenario_3_with_2_hypervisors()"},{"line_number":61,"context_line":"        strategy \u003d OutletTempControl()"},{"line_number":62,"context_line":"        strategy.ceilometer \u003d MagicMock("}],"source_content_type":"text/x-python","patch_set":6,"id":"3a7e1126_032852e1","line":59,"range":{"start_line":59,"start_character":8,"end_line":59,"end_character":32},"updated":"2015-12-18 08:43:59.000000000","message":"nit:Camelcasse","commit_id":"5ae9b8b0139a62d964c1b889766786a84d5e6a56"}],"watcher/tests/decision_engine/strategy/strategies/test_outlet_temperature.py":[{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"ff93bf6b8f46df82d0ca089b346639a869f8aef8","unresolved":false,"context_lines":[{"line_number":25,"context_line":"from watcher.decision_engine.actions.migration import Migrate"},{"line_number":26,"context_line":"from watcher.decision_engine.model.model_root import ModelRoot"},{"line_number":27,"context_line":"from watcher.decision_engine.model.resource import ResourceType"},{"line_number":28,"context_line":"from watcher.decision_engine.strategy.strategies.outlet_t_strategy import \\"},{"line_number":29,"context_line":"    OutletTemperatureStrategy"},{"line_number":30,"context_line":"from watcher.tests import base"},{"line_number":31,"context_line":"from watcher.tests.decision_engine.strategy.strategies.faker_cluster_state \\"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a710552_4626b469","line":28,"updated":"2015-12-15 09:42:43.000000000","message":"nit: \"outlet_t_strategy\" is within the strategy package, so IMO we should simply call it \"outlet_t\" because the \"strategy\" suffix seems a bit redundant.","commit_id":"0e6db43ebb0f052a572229eddbf8edf997f55b77"}]}
