)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"6fd514ea4bd247ff6b31ce108e824ddcb7cb6676","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Yathiraj Udupi \u003cyudupi@cisco.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2013-12-17 14:23:45 -0800"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":" Add a pluggable solver scheduler"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"  This provides a solver scheduler, where complex constraints can be specified using pluggable solvers.  An illustrative"},{"line_number":10,"context_line":"implementation of a solver is included and is based on PULP. Here the constraints are based on the disk space and memory requirements,"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"AAAATn%2F8%2BHA%3D","line":7,"updated":"2013-12-18 09:19:16.000000000","message":"Remove that leading whitespace.","commit_id":"3a0719e2c95a737dc751213ef99aaa4971d5fbe9"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"6fd514ea4bd247ff6b31ce108e824ddcb7cb6676","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"  This provides a solver scheduler, where complex constraints can be specified using pluggable solvers.  An illustrative"},{"line_number":10,"context_line":"implementation of a solver is included and is based on PULP. Here the constraints are based on the disk space and memory requirements,"},{"line_number":11,"context_line":"and optimization is done using the host\u0027s free ram as a cost metric."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Change-Id: I84af7a4be850b526b68e6d075cdfd8227d5ae242"},{"line_number":14,"context_line":"Implements: blueprint solver-scheduler"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"AAAATn%2F8%2BGw%3D","line":11,"updated":"2013-12-18 09:19:16.000000000","message":"There\u0027s bogus whitespace in here and line lengths/breaks are all over the place. Please use sane line wrapping","commit_id":"3a0719e2c95a737dc751213ef99aaa4971d5fbe9"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"8d7932b86528b70611a90a6455793dabbc69d32c","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add a pluggable solver scheduler"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This provides a solver scheduler, where complex constraints can be specified using pluggable solvers. An illustrative implementation of a solver is included and is based on PULP. Here the constraints are based on the disk space and memory requirements, and optimization is done using the host\u0027s free ram as a cost metric."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Change-Id: I84af7a4be850b526b68e6d075cdfd8227d5ae242"},{"line_number":12,"context_line":"Implements: blueprint solver-scheduler"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":15,"id":"AAAAUX%2F%2FhlI%3D","line":9,"updated":"2014-02-12 16:01:56.000000000","message":"it looks like this is one line. can you please add a new line after 80 characters","commit_id":"9dbb1e0f232688b735c7667058cd00574bb2cf8e"},{"author":{"_account_id":8514,"name":"Yathiraj Udupi","email":"yudupi@cisco.com","username":"yudupi"},"change_message_id":"4757dacc78bbd0905689159f43ec887bb92a23c3","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add a pluggable solver scheduler"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This provides a solver scheduler, where complex constraints can be specified using pluggable solvers. An illustrative implementation of a solver is included and is based on PULP. Here the constraints are based on the disk space and memory requirements, and optimization is done using the host\u0027s free ram as a cost metric."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Change-Id: I84af7a4be850b526b68e6d075cdfd8227d5ae242"},{"line_number":12,"context_line":"Implements: blueprint solver-scheduler"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":15,"id":"AAAAUX%2F%2FgB0%3D","line":9,"in_reply_to":"AAAAUX%2F%2FhlI%3D","updated":"2014-02-12 18:51:28.000000000","message":"Done","commit_id":"9dbb1e0f232688b735c7667058cd00574bb2cf8e"}],"doc/source/devref/solver_scheduler.rst":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"66b3646d15541c5f9aee558e9ae378f13ddfeb0c","unresolved":false,"context_lines":[{"line_number":6,"context_line":"driver supports pluggable Solvers, that can leverage existing complex"},{"line_number":7,"context_line":"constraint solving frameworks, available in open source such as PULP_, CVXOPT_,"},{"line_number":8,"context_line":"`Google OR-TOOLS`_, etc. This Scheduler is currently supported to work with"},{"line_number":9,"context_line":"Compute Nodes in Nova. "},{"line_number":10,"context_line":""},{"line_number":11,"context_line":".. _PULP: https://projects.coin-or.org/PuLP"},{"line_number":12,"context_line":""}],"source_content_type":"text/x-rst","patch_set":21,"id":"AAAAUX%2F%2FElU%3D","line":9,"updated":"2014-02-17 10:15:23.000000000","message":"whitespace","commit_id":"a3d2ecc349260f248ee49bedf06079611a8e816e"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"66b3646d15541c5f9aee558e9ae378f13ddfeb0c","unresolved":false,"context_lines":[{"line_number":19,"context_line":"requirements that have to be satisfied by a host with available resource"},{"line_number":20,"context_line":"capacity. In addition to the constraints, we optimize the solution for some"},{"line_number":21,"context_line":"cost metrics, so that the net cost of placing all VMs to certain hosts is"},{"line_number":22,"context_line":"minimized. "},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"A pluggable Solver used by the Solver Scheduler driver models the Nova compute"},{"line_number":25,"context_line":"placement request as a constraint optimization problem using a set of"}],"source_content_type":"text/x-rst","patch_set":21,"id":"AAAAUX%2F%2FElM%3D","line":22,"updated":"2014-02-17 10:15:23.000000000","message":"whitespace","commit_id":"a3d2ecc349260f248ee49bedf06079611a8e816e"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"66b3646d15541c5f9aee558e9ae378f13ddfeb0c","unresolved":false,"context_lines":[{"line_number":35,"context_line":""},{"line_number":36,"context_line":".. _CBC: http://en.wikipedia.org/wiki/COIN-OR#CBC"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":".. _GLPK: http://en.wikipedia.org/wiki/GNU_Linear_Programming_Kit "},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"The Nova compute resource placement optimization problem when subject to a set"},{"line_number":41,"context_line":"of linear constraints, can be formulated and solved as a `linear programming`_"}],"source_content_type":"text/x-rst","patch_set":21,"id":"AAAAUX%2F%2FEk8%3D","line":38,"updated":"2014-02-17 10:15:23.000000000","message":"whitesapce","commit_id":"a3d2ecc349260f248ee49bedf06079611a8e816e"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"66b3646d15541c5f9aee558e9ae378f13ddfeb0c","unresolved":false,"context_lines":[{"line_number":40,"context_line":"The Nova compute resource placement optimization problem when subject to a set"},{"line_number":41,"context_line":"of linear constraints, can be formulated and solved as a `linear programming`_"},{"line_number":42,"context_line":"problem. A **linear programming (LP)** problem involves maximizing or minimizing"},{"line_number":43,"context_line":"a linear function subject to linear constraints.  "},{"line_number":44,"context_line":""},{"line_number":45,"context_line":".. _linear programming: http://en.wikipedia.org/wiki/Linear_programming"},{"line_number":46,"context_line":""}],"source_content_type":"text/x-rst","patch_set":21,"id":"AAAAUX%2F%2FEk0%3D","line":43,"updated":"2014-02-17 10:15:23.000000000","message":"whitespace","commit_id":"a3d2ecc349260f248ee49bedf06079611a8e816e"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"66b3646d15541c5f9aee558e9ae378f13ddfeb0c","unresolved":false,"context_lines":[{"line_number":48,"context_line":"-------"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"All Solver implementations will be in the module"},{"line_number":51,"context_line":"(:mod:`nova.scheduler.solvers`). A solver implementation should be a "},{"line_number":52,"context_line":"subclass of ``solvers.BaseHostSolver`` and they implement the ``host_solve``"},{"line_number":53,"context_line":"method. This method returns a list of host-instance tuples after solving"},{"line_number":54,"context_line":"the constraints optimization problem. "}],"source_content_type":"text/x-rst","patch_set":21,"id":"AAAAUX%2F%2FEks%3D","line":51,"updated":"2014-02-17 10:15:23.000000000","message":"whitespace","commit_id":"a3d2ecc349260f248ee49bedf06079611a8e816e"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"66b3646d15541c5f9aee558e9ae378f13ddfeb0c","unresolved":false,"context_lines":[{"line_number":51,"context_line":"(:mod:`nova.scheduler.solvers`). A solver implementation should be a "},{"line_number":52,"context_line":"subclass of ``solvers.BaseHostSolver`` and they implement the ``host_solve``"},{"line_number":53,"context_line":"method. This method returns a list of host-instance tuples after solving"},{"line_number":54,"context_line":"the constraints optimization problem. "},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"A Reference Solver Implementation"},{"line_number":57,"context_line":"---------------------------------"}],"source_content_type":"text/x-rst","patch_set":21,"id":"AAAAUX%2F%2FEkg%3D","line":54,"updated":"2014-02-17 10:15:23.000000000","message":"whitesapce","commit_id":"a3d2ecc349260f248ee49bedf06079611a8e816e"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"66b3646d15541c5f9aee558e9ae378f13ddfeb0c","unresolved":false,"context_lines":[{"line_number":63,"context_line":"for the LP problem."},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"An example LP problem formulation is provided below to describe how this"},{"line_number":66,"context_line":"example solver models the problem in LP. "},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"Consider there are 2 hosts `Host_1` and `Host_2`, with available resources"},{"line_number":69,"context_line":"described as a tuple (usable_disk_mb, usable_memory_mb, free_ram_mb):"}],"source_content_type":"text/x-rst","patch_set":21,"id":"AAAAUX%2F%2FEkc%3D","line":66,"updated":"2014-02-17 10:15:23.000000000","message":"whitesapce","commit_id":"a3d2ecc349260f248ee49bedf06079611a8e816e"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"66b3646d15541c5f9aee558e9ae378f13ddfeb0c","unresolved":false,"context_lines":[{"line_number":80,"context_line":""},{"line_number":81,"context_line":"To formulate this problem as a LP problem, we use the variables: `X11`, `X12`,"},{"line_number":82,"context_line":"`X21`, `X22`. Here, a variable `Xij` takes the value `1` if `VM_i` is placed on"},{"line_number":83,"context_line":"`Host_j`, `0` otherwise. "},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"If the problem objective is to minimize the cost metric of free_ram_mb, the"},{"line_number":86,"context_line":"mathematical LP formulation of this example is as follows:"}],"source_content_type":"text/x-rst","patch_set":21,"id":"AAAAUX%2F%2FEkM%3D","line":83,"updated":"2014-02-17 10:15:23.000000000","message":"whitespace","commit_id":"a3d2ecc349260f248ee49bedf06079611a8e816e"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"66b3646d15541c5f9aee558e9ae378f13ddfeb0c","unresolved":false,"context_lines":[{"line_number":96,"context_line":"     X12*1024 + X22*1024 \u003c\u003d 4096 (disk maximum supply for Host_2)"},{"line_number":97,"context_line":"     X12*512  + X22*512  \u003c\u003d 1536 (memory maximum supply for Host_2)"},{"line_number":98,"context_line":"     X11*1024 + X12*1024 \u003e\u003d 1024 (disk minimum demand for VM_1)"},{"line_number":99,"context_line":"     X11*512  + X12*512  \u003e\u003d 512  (memory minimum demand for VM_1) "},{"line_number":100,"context_line":"     X21*1024 + X22*1024 \u003e\u003d 1024 (disk minimum demand for VM_2)"},{"line_number":101,"context_line":"     X21*512  + X22*512  \u003e\u003d 512  (memory minimum demand for VM_2)"},{"line_number":102,"context_line":"     X11      + X12      \u003d\u003d 1    (VM_1 can run in only 1 Host)"}],"source_content_type":"text/x-rst","patch_set":21,"id":"AAAAUX%2F%2FEkI%3D","line":99,"updated":"2014-02-17 10:15:23.000000000","message":"whitespace","commit_id":"a3d2ecc349260f248ee49bedf06079611a8e816e"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"66b3646d15541c5f9aee558e9ae378f13ddfeb0c","unresolved":false,"context_lines":[{"line_number":101,"context_line":"     X21*512  + X22*512  \u003e\u003d 512  (memory minimum demand for VM_2)"},{"line_number":102,"context_line":"     X11      + X12      \u003d\u003d 1    (VM_1 can run in only 1 Host)"},{"line_number":103,"context_line":"     X21      + X22      \u003d\u003d 1    (VM_2 can run in only 1 Host)"},{"line_number":104,"context_line":"     "},{"line_number":105,"context_line":"`X11` \u003d 0, `X12` \u003d 0, `X21` \u003d 1, and `X22` \u003d 1 happens to be the optimal"},{"line_number":106,"context_line":"solution, implying, both `VM_1` and `VM_2` will be hosted in `Host_2`."},{"line_number":107,"context_line":"     "}],"source_content_type":"text/x-rst","patch_set":21,"id":"AAAAUX%2F%2FEkA%3D","line":104,"updated":"2014-02-17 10:15:23.000000000","message":"ditto","commit_id":"a3d2ecc349260f248ee49bedf06079611a8e816e"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"66b3646d15541c5f9aee558e9ae378f13ddfeb0c","unresolved":false,"context_lines":[{"line_number":104,"context_line":"     "},{"line_number":105,"context_line":"`X11` \u003d 0, `X12` \u003d 0, `X21` \u003d 1, and `X22` \u003d 1 happens to be the optimal"},{"line_number":106,"context_line":"solution, implying, both `VM_1` and `VM_2` will be hosted in `Host_2`."},{"line_number":107,"context_line":"     "},{"line_number":108,"context_line":"|HostsPulpSolver| models such LP problems using the PULP_ LP modeler written in"},{"line_number":109,"context_line":"Python. This problem is solved for an optimal solution using an external"},{"line_number":110,"context_line":"solver supported by PULP such as CLP_, CBC_, GLPK_, etc.  By default, PULP_"}],"source_content_type":"text/x-rst","patch_set":21,"id":"AAAAUX%2F%2FEj0%3D","line":107,"updated":"2014-02-17 10:15:23.000000000","message":"ditto","commit_id":"a3d2ecc349260f248ee49bedf06079611a8e816e"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"66b3646d15541c5f9aee558e9ae378f13ddfeb0c","unresolved":false,"context_lines":[{"line_number":113,"context_line":".. _`coinor.pulp`: https://pypi.python.org/pypi/coinor.pulp"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"Additional Solver implementations are planned in the roadmap, that support"},{"line_number":116,"context_line":"pluggable constraints and costs. "},{"line_number":117,"context_line":""},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"Configuration"}],"source_content_type":"text/x-rst","patch_set":21,"id":"AAAAUX%2F%2FEjw%3D","line":116,"updated":"2014-02-17 10:15:23.000000000","message":"ditto","commit_id":"a3d2ecc349260f248ee49bedf06079611a8e816e"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"66b3646d15541c5f9aee558e9ae378f13ddfeb0c","unresolved":false,"context_lines":[{"line_number":131,"context_line":"``scheduler_host_solver\u003dnova.scheduler.solvers.hosts_pulp_solver.HostsPulpSolver``"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"When using the default provided Solver implementation |HostsPulpSolver|, the"},{"line_number":134,"context_line":"following default values of these settings can be modified: "},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"`The ram cost multiplier. A negative value indicates a LP Maximization problem"},{"line_number":137,"context_line":"(stacking), while a positive value indicates a LP Minimization problem"}],"source_content_type":"text/x-rst","patch_set":21,"id":"AAAAUX%2F%2FEjg%3D","line":134,"updated":"2014-02-17 10:15:23.000000000","message":"ditto","commit_id":"a3d2ecc349260f248ee49bedf06079611a8e816e"}],"etc/nova/nova.conf.sample":[{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"737b87a57baa577d75676f8ebf7337d5ccf56e09","unresolved":false,"context_lines":[{"line_number":1798,"context_line":"# all ram filters. This configuration specifies a global ratio"},{"line_number":1799,"context_line":"# for RamFilter. For AggregateRamFilter, it will fall back to"},{"line_number":1800,"context_line":"# this configuration value if no per-aggregate setting found."},{"line_number":1801,"context_line":"# (floating point value)"},{"line_number":1802,"context_line":"#ram_allocation_ratio\u003d1.5"},{"line_number":1803,"context_line":""},{"line_number":1804,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":22,"id":"AAAAUX%2F%2B5s8%3D","line":1801,"updated":"2014-02-18 15:58:40.000000000","message":"We have this already","commit_id":"0abdcff584c41364b7fc43dd816443e7781bec4a"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"737b87a57baa577d75676f8ebf7337d5ccf56e09","unresolved":false,"context_lines":[{"line_number":3100,"context_line":""},{"line_number":3101,"context_line":"# Virtual ram to physical ram allocation ratio. (floating"},{"line_number":3102,"context_line":"# point value)"},{"line_number":3103,"context_line":"#constraint_ram_allocation_ratio\u003d1.5"},{"line_number":3104,"context_line":""},{"line_number":3105,"context_line":"# Multiplier used for ram optimization cost metric. This"},{"line_number":3106,"context_line":"# solver uses a LP minimization problem. So a negative number"}],"source_content_type":"application/octet-stream","patch_set":22,"id":"AAAAUX%2F%2B5sM%3D","line":3103,"updated":"2014-02-18 15:58:40.000000000","message":"I worry about this duplicating the other ram settings.\n\nThese could be global to all schedulers I guess.","commit_id":"0abdcff584c41364b7fc43dd816443e7781bec4a"},{"author":{"_account_id":8514,"name":"Yathiraj Udupi","email":"yudupi@cisco.com","username":"yudupi"},"change_message_id":"0f48a63d24ee8701f294210b22cebd6734c981f1","unresolved":false,"context_lines":[{"line_number":3100,"context_line":""},{"line_number":3101,"context_line":"# Virtual ram to physical ram allocation ratio. (floating"},{"line_number":3102,"context_line":"# point value)"},{"line_number":3103,"context_line":"#constraint_ram_allocation_ratio\u003d1.5"},{"line_number":3104,"context_line":""},{"line_number":3105,"context_line":"# Multiplier used for ram optimization cost metric. This"},{"line_number":3106,"context_line":"# solver uses a LP minimization problem. So a negative number"}],"source_content_type":"application/octet-stream","patch_set":22,"id":"AAAAUX%2F%2B0aw%3D","line":3103,"in_reply_to":"AAAAUX%2F%2B5sM%3D","updated":"2014-02-18 20:22:59.000000000","message":"Yeah. Thanks John for the suggestion, Not duplicating these opts any more.  Moved to manager so that other schedulers can share.","commit_id":"0abdcff584c41364b7fc43dd816443e7781bec4a"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"737b87a57baa577d75676f8ebf7337d5ccf56e09","unresolved":false,"context_lines":[{"line_number":3106,"context_line":"# solver uses a LP minimization problem. So a negative number"},{"line_number":3107,"context_line":"# would mean a cost maximization problem. (floating point"},{"line_number":3108,"context_line":"# value)"},{"line_number":3109,"context_line":"#ram_optimization_cost_multiplier\u003d1.0"},{"line_number":3110,"context_line":""},{"line_number":3111,"context_line":""},{"line_number":3112,"context_line":"[spice]"}],"source_content_type":"application/octet-stream","patch_set":22,"id":"AAAAUX%2F%2B5r0%3D","line":3109,"updated":"2014-02-18 15:58:40.000000000","message":"Is this fill first vs spread first?\n\nWe have a setting for that already, but it would be good if you can make that explicit here.","commit_id":"0abdcff584c41364b7fc43dd816443e7781bec4a"},{"author":{"_account_id":8514,"name":"Yathiraj Udupi","email":"yudupi@cisco.com","username":"yudupi"},"change_message_id":"0f48a63d24ee8701f294210b22cebd6734c981f1","unresolved":false,"context_lines":[{"line_number":3106,"context_line":"# solver uses a LP minimization problem. So a negative number"},{"line_number":3107,"context_line":"# would mean a cost maximization problem. (floating point"},{"line_number":3108,"context_line":"# value)"},{"line_number":3109,"context_line":"#ram_optimization_cost_multiplier\u003d1.0"},{"line_number":3110,"context_line":""},{"line_number":3111,"context_line":""},{"line_number":3112,"context_line":"[spice]"}],"source_content_type":"application/octet-stream","patch_set":22,"id":"AAAAUX%2F%2B0ag%3D","line":3109,"in_reply_to":"AAAAUX%2F%2B5r0%3D","updated":"2014-02-18 20:22:59.000000000","message":"Reusing the existing setting","commit_id":"0abdcff584c41364b7fc43dd816443e7781bec4a"}],"nova/scheduler/base_scheduler_driver.py":[{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"f53714d98b842d3036999cf2b6c9598faa80df74","unresolved":false,"context_lines":[{"line_number":37,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":41,"context_line":"class BaseSchedulerDriver(driver.Scheduler):"},{"line_number":42,"context_line":"    \"\"\"Base Scheduler Driver meta class for scheduler driver implementations."},{"line_number":43,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":30,"id":"AAAAVn%2F%2FpKE%3D","line":40,"updated":"2014-03-04 22:03:57.000000000","message":"I\u0027m not sure I understand why this is being made a strict abstract base class when there\u0027s only one required method that I can see.","commit_id":"9f97e6cc66a4aa44349444df841d22d000d011ca"},{"author":{"_account_id":8514,"name":"Yathiraj Udupi","email":"yudupi@cisco.com","username":"yudupi"},"change_message_id":"abf78338489b033c05b559540cd1da03856055d5","unresolved":false,"context_lines":[{"line_number":37,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":41,"context_line":"class BaseSchedulerDriver(driver.Scheduler):"},{"line_number":42,"context_line":"    \"\"\"Base Scheduler Driver meta class for scheduler driver implementations."},{"line_number":43,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":30,"id":"AAAAVn%2F%2FoL4%3D","line":40,"in_reply_to":"AAAAVn%2F%2FpKE%3D","updated":"2014-03-04 23:59:02.000000000","message":"Done","commit_id":"9f97e6cc66a4aa44349444df841d22d000d011ca"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"f53714d98b842d3036999cf2b6c9598faa80df74","unresolved":false,"context_lines":[{"line_number":38,"context_line":""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":41,"context_line":"class BaseSchedulerDriver(driver.Scheduler):"},{"line_number":42,"context_line":"    \"\"\"Base Scheduler Driver meta class for scheduler driver implementations."},{"line_number":43,"context_line":"    \"\"\""},{"line_number":44,"context_line":""}],"source_content_type":"text/x-python","patch_set":30,"id":"AAAAVn%2F%2FpG4%3D","line":41,"updated":"2014-03-04 22:03:57.000000000","message":"This base class is specific to filtering schedulers, so I would prefer it to be named in such a way as to make that clear.  Actually, I would prefer for the solver scheduler to just inherit from the filter scheduler for now.\n\nFinding a common base implementation is worthwhile but not by copying wholesale from the filter scheduler IMO.","commit_id":"9f97e6cc66a4aa44349444df841d22d000d011ca"},{"author":{"_account_id":8514,"name":"Yathiraj Udupi","email":"yudupi@cisco.com","username":"yudupi"},"change_message_id":"abf78338489b033c05b559540cd1da03856055d5","unresolved":false,"context_lines":[{"line_number":38,"context_line":""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":41,"context_line":"class BaseSchedulerDriver(driver.Scheduler):"},{"line_number":42,"context_line":"    \"\"\"Base Scheduler Driver meta class for scheduler driver implementations."},{"line_number":43,"context_line":"    \"\"\""},{"line_number":44,"context_line":""}],"source_content_type":"text/x-python","patch_set":30,"id":"AAAAVn%2F%2FoLs%3D","line":41,"in_reply_to":"AAAAVn%2F%2FpG4%3D","updated":"2014-03-04 23:59:02.000000000","message":"Yeah I agree for now, I will just inherit from the filter scheduler, and modify the final host selection logic to be in a separate new method, so that subclasses can override that behavior.","commit_id":"9f97e6cc66a4aa44349444df841d22d000d011ca"}],"nova/scheduler/filters/ram_filter.py":[{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"f53714d98b842d3036999cf2b6c9598faa80df74","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"ram_allocation_ratio_opt \u003d cfg.FloatOpt(\u0027ram_allocation_ratio\u0027,"},{"line_number":27,"context_line":"        default\u003d1.5,"},{"line_number":28,"context_line":"        help\u003d\u0027Virtual ram to physical ram allocation ratio which affects \u0027"},{"line_number":29,"context_line":"             \u0027all ram filters. This configuration specifies a global ratio \u0027"}],"source_content_type":"text/x-python","patch_set":30,"id":"AAAAVn%2F%2Fpcg%3D","side":"PARENT","line":26,"updated":"2014-03-04 22:03:57.000000000","message":"I would like these options to be defined near where they\u0027re being used.  Look at using CONF.import_opt to get access to these in the solver.","commit_id":"9e11cf01498d5c4b1d4877e81e5e740d3614b2b2"},{"author":{"_account_id":8514,"name":"Yathiraj Udupi","email":"yudupi@cisco.com","username":"yudupi"},"change_message_id":"abf78338489b033c05b559540cd1da03856055d5","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"ram_allocation_ratio_opt \u003d cfg.FloatOpt(\u0027ram_allocation_ratio\u0027,"},{"line_number":27,"context_line":"        default\u003d1.5,"},{"line_number":28,"context_line":"        help\u003d\u0027Virtual ram to physical ram allocation ratio which affects \u0027"},{"line_number":29,"context_line":"             \u0027all ram filters. This configuration specifies a global ratio \u0027"}],"source_content_type":"text/x-python","patch_set":30,"id":"AAAAVn%2F%2FoLg%3D","side":"PARENT","line":26,"in_reply_to":"AAAAVn%2F%2Fpcg%3D","updated":"2014-03-04 23:59:02.000000000","message":"I am using CONF.import_opt now. Thanks for the suggestion.","commit_id":"9e11cf01498d5c4b1d4877e81e5e740d3614b2b2"}],"nova/scheduler/host_manager.py":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"dae5dbf6533ba8efadd428603b9e26a7cf24c397","unresolved":false,"context_lines":[{"line_number":428,"context_line":"        hosts \u003d self.get_hosts_stripping_ignored_and_forced(hosts,"},{"line_number":429,"context_line":"                         filter_properties)"},{"line_number":430,"context_line":""},{"line_number":431,"context_line":"        filter_classes \u003d self._choose_host_filters(filter_class_names)"},{"line_number":432,"context_line":""},{"line_number":433,"context_line":"        force_hosts \u003d filter_properties.get(\u0027force_hosts\u0027, [])"},{"line_number":434,"context_line":"        force_nodes \u003d filter_properties.get(\u0027force_nodes\u0027, [])"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUX%2F%2FZMU%3D","line":431,"updated":"2014-02-13 14:37:39.000000000","message":"this line can be moved to line 439 - that is no reason to read the host files if we return at 438","commit_id":"4a0d2440926c0fe12d7856b7dc22ce64681d8845"},{"author":{"_account_id":8514,"name":"Yathiraj Udupi","email":"yudupi@cisco.com","username":"yudupi"},"change_message_id":"c52fc83b524b3b006d7ff5469d74e7b94e55df6b","unresolved":false,"context_lines":[{"line_number":428,"context_line":"        hosts \u003d self.get_hosts_stripping_ignored_and_forced(hosts,"},{"line_number":429,"context_line":"                         filter_properties)"},{"line_number":430,"context_line":""},{"line_number":431,"context_line":"        filter_classes \u003d self._choose_host_filters(filter_class_names)"},{"line_number":432,"context_line":""},{"line_number":433,"context_line":"        force_hosts \u003d filter_properties.get(\u0027force_hosts\u0027, [])"},{"line_number":434,"context_line":"        force_nodes \u003d filter_properties.get(\u0027force_nodes\u0027, [])"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUX%2F%2FXW8%3D","line":431,"in_reply_to":"AAAAUX%2F%2FZMU%3D","updated":"2014-02-13 17:50:45.000000000","message":"Took care of this, and also updated the host_manager tests that were mocking the look up of filter classes, for tests involving force hosts or force nodes.","commit_id":"4a0d2440926c0fe12d7856b7dc22ce64681d8845"}],"nova/scheduler/solver_scheduler.py":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"7002f68c89a6baaba095a5736709c77c3191619d","unresolved":false,"context_lines":[{"line_number":38,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"solver_opts \u003d ["},{"line_number":41,"context_line":"    cfg.StrOpt(\u0027scheduler_host_solver\u0027,"},{"line_number":42,"context_line":"        default\u003d\u0027nova.scheduler.solvers.hosts_pulp_solver.HostsPulpSolver\u0027,"},{"line_number":43,"context_line":"        help\u003d\u0027The scheduler host solver to use\u0027),"},{"line_number":44,"context_line":"    ]"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F89fg%3D","line":41,"updated":"2013-12-18 11:34:41.000000000","message":"In the commit message you should write DocImpact - this new configuration variable needs to be documented","commit_id":"3a0719e2c95a737dc751213ef99aaa4971d5fbe9"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"7002f68c89a6baaba095a5736709c77c3191619d","unresolved":false,"context_lines":[{"line_number":103,"context_line":"                              {\u0027selected_host\u0027: selected_host,"},{"line_number":104,"context_line":"                               \u0027instance_uuid\u0027: instance_uuid})"},{"line_number":105,"context_line":"                except IndexError:"},{"line_number":106,"context_line":"                    raise exception.NoValidHost(reason\u003d\"\")"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"                self._provision_resource(context, selected_host,"},{"line_number":109,"context_line":"                                         request_spec,"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F89fE%3D","line":106,"updated":"2013-12-18 11:34:41.000000000","message":"Is there no valid reason that we can provide here?","commit_id":"3a0719e2c95a737dc751213ef99aaa4971d5fbe9"},{"author":{"_account_id":688,"name":"Sandy Walsh","email":"sandy.walsh@rackspace.com","username":"sandy-walsh"},"change_message_id":"b49aa23e728b3f90e1bcd05732824bce5fa5ec67","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2011 OpenStack Foundation"},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUX%2F%2FydE%3D","line":1,"updated":"2014-02-10 20:55:34.000000000","message":"Should be the name of your organization as OpenStack Foundation was only used when foundation was original established. Change year too.","commit_id":"b70a248b3c24847328959cd2ce168aaf0b0dee39"},{"author":{"_account_id":688,"name":"Sandy Walsh","email":"sandy.walsh@rackspace.com","username":"sandy-walsh"},"change_message_id":"b49aa23e728b3f90e1bcd05732824bce5fa5ec67","unresolved":false,"context_lines":[{"line_number":54,"context_line":"        self.options \u003d scheduler_options.SchedulerOptions()"},{"line_number":55,"context_line":"        self.compute_rpcapi \u003d compute_rpcapi.ComputeAPI()"},{"line_number":56,"context_line":"        self.notifier \u003d rpc.get_notifier(\u0027scheduler\u0027)"},{"line_number":57,"context_line":"        #The hosts solver to use"},{"line_number":58,"context_line":"        self.hosts_solver \u003d importutils.import_object("},{"line_number":59,"context_line":"                CONF.scheduler_host_solver)"},{"line_number":60,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUX%2F%2Fybk%3D","line":57,"updated":"2014-02-10 20:55:34.000000000","message":"# The hosts solver to use.\n\n(arguably, does this comment help us much?)","commit_id":"b70a248b3c24847328959cd2ce168aaf0b0dee39"},{"author":{"_account_id":8514,"name":"Yathiraj Udupi","email":"yudupi@cisco.com","username":"yudupi"},"change_message_id":"cef1f5ae50b45122252b7630cf8437248238e838","unresolved":false,"context_lines":[{"line_number":54,"context_line":"        self.options \u003d scheduler_options.SchedulerOptions()"},{"line_number":55,"context_line":"        self.compute_rpcapi \u003d compute_rpcapi.ComputeAPI()"},{"line_number":56,"context_line":"        self.notifier \u003d rpc.get_notifier(\u0027scheduler\u0027)"},{"line_number":57,"context_line":"        #The hosts solver to use"},{"line_number":58,"context_line":"        self.hosts_solver \u003d importutils.import_object("},{"line_number":59,"context_line":"                CONF.scheduler_host_solver)"},{"line_number":60,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUX%2F%2FxHM%3D","line":57,"in_reply_to":"AAAAUX%2F%2Fybk%3D","updated":"2014-02-10 22:55:31.000000000","message":"Will clean up the code.  Thanks.","commit_id":"b70a248b3c24847328959cd2ce168aaf0b0dee39"},{"author":{"_account_id":688,"name":"Sandy Walsh","email":"sandy.walsh@rackspace.com","username":"sandy-walsh"},"change_message_id":"b49aa23e728b3f90e1bcd05732824bce5fa5ec67","unresolved":false,"context_lines":[{"line_number":198,"context_line":"        force_hosts \u003d filter_properties.get(\u0027force_hosts\u0027, [])"},{"line_number":199,"context_line":"        force_nodes \u003d filter_properties.get(\u0027force_nodes\u0027, [])"},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"        if force_hosts or force_nodes:"},{"line_number":202,"context_line":"        #NOTE(Yathi): Skipping the solver when forcing host or node"},{"line_number":203,"context_line":"            selected_hosts \u003d list(hosts)"},{"line_number":204,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUX%2F%2FyOo%3D","line":201,"updated":"2014-02-10 20:55:34.000000000","message":"With so much copy-paste here, should we consider deriving from the filter scheduler and extending just the parts needed?","commit_id":"b70a248b3c24847328959cd2ce168aaf0b0dee39"},{"author":{"_account_id":8514,"name":"Yathiraj Udupi","email":"yudupi@cisco.com","username":"yudupi"},"change_message_id":"cef1f5ae50b45122252b7630cf8437248238e838","unresolved":false,"context_lines":[{"line_number":198,"context_line":"        force_hosts \u003d filter_properties.get(\u0027force_hosts\u0027, [])"},{"line_number":199,"context_line":"        force_nodes \u003d filter_properties.get(\u0027force_nodes\u0027, [])"},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"        if force_hosts or force_nodes:"},{"line_number":202,"context_line":"        #NOTE(Yathi): Skipping the solver when forcing host or node"},{"line_number":203,"context_line":"            selected_hosts \u003d list(hosts)"},{"line_number":204,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUX%2F%2FxHQ%3D","line":201,"in_reply_to":"AAAAUX%2F%2FyOo%3D","updated":"2014-02-10 22:55:31.000000000","message":"I agree some of the constructs are the same, but this scheduler driver provides a way to separate out the placement logic to a pluggable solver.  Also some concepts used in Filter Scheduler like weights don\u0027t really apply here.  Hence the idea to keep it separate.  But if necessary in future, we can refactor it further to a common piece of code that both Filter Scheduler and this scheduler can use.","commit_id":"b70a248b3c24847328959cd2ce168aaf0b0dee39"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"8d7932b86528b70611a90a6455793dabbc69d32c","unresolved":false,"context_lines":[{"line_number":69,"context_line":""},{"line_number":70,"context_line":"        Returns a list of the instances created."},{"line_number":71,"context_line":"        \"\"\""},{"line_number":72,"context_line":"        payload \u003d dict(request_spec\u003drequest_spec)"},{"line_number":73,"context_line":"        self.notifier.info(context, \u0027scheduler.run_instance.start\u0027, payload)"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"        instance_uuids \u003d request_spec.get(\u0027instance_uuids\u0027)"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUX%2F%2Fhjs%3D","line":72,"updated":"2014-02-12 16:01:56.000000000","message":"please use {} instead of dict","commit_id":"9dbb1e0f232688b735c7667058cd00574bb2cf8e"},{"author":{"_account_id":8514,"name":"Yathiraj Udupi","email":"yudupi@cisco.com","username":"yudupi"},"change_message_id":"4757dacc78bbd0905689159f43ec887bb92a23c3","unresolved":false,"context_lines":[{"line_number":69,"context_line":""},{"line_number":70,"context_line":"        Returns a list of the instances created."},{"line_number":71,"context_line":"        \"\"\""},{"line_number":72,"context_line":"        payload \u003d dict(request_spec\u003drequest_spec)"},{"line_number":73,"context_line":"        self.notifier.info(context, \u0027scheduler.run_instance.start\u0027, payload)"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"        instance_uuids \u003d request_spec.get(\u0027instance_uuids\u0027)"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUX%2F%2FgBk%3D","line":72,"in_reply_to":"AAAAUX%2F%2Fhjs%3D","updated":"2014-02-12 18:51:28.000000000","message":"Done","commit_id":"9dbb1e0f232688b735c7667058cd00574bb2cf8e"},{"author":{"_account_id":688,"name":"Sandy Walsh","email":"sandy.walsh@rackspace.com","username":"sandy-walsh"},"change_message_id":"c98e433a1c94420c14ae000dbf5a8d0535fc696c","unresolved":false,"context_lines":[{"line_number":95,"context_line":""},{"line_number":96,"context_line":"            try:"},{"line_number":97,"context_line":"                try:"},{"line_number":98,"context_line":"                    selected_host \u003d selected_hosts.pop(0)"},{"line_number":99,"context_line":"                    LOG.info(_(\"Choosing host %(selected_host)s \""},{"line_number":100,"context_line":"                                \"for instance %(instance_uuid)s\"),"},{"line_number":101,"context_line":"                              {\u0027selected_host\u0027: selected_host,"}],"source_content_type":"text/x-python","patch_set":28,"id":"AAAAVn%2F%2F47A%3D","line":98,"updated":"2014-03-03 16:12:31.000000000","message":"Since this method is largely unchanged from FilterScheduler I would refactor the common code and just leave the differences in the respective files (filter_scheduler and solver_scheduler)","commit_id":"b2f0c92a98409463db7f4939d01ff8bd8d2df0f4"},{"author":{"_account_id":8514,"name":"Yathiraj Udupi","email":"yudupi@cisco.com","username":"yudupi"},"change_message_id":"fcfff27a18fc56cd4ffb67d08051e12e2f613572","unresolved":false,"context_lines":[{"line_number":95,"context_line":""},{"line_number":96,"context_line":"            try:"},{"line_number":97,"context_line":"                try:"},{"line_number":98,"context_line":"                    selected_host \u003d selected_hosts.pop(0)"},{"line_number":99,"context_line":"                    LOG.info(_(\"Choosing host %(selected_host)s \""},{"line_number":100,"context_line":"                                \"for instance %(instance_uuid)s\"),"},{"line_number":101,"context_line":"                              {\u0027selected_host\u0027: selected_host,"}],"source_content_type":"text/x-python","patch_set":28,"id":"AAAAVn%2F%2F1jY%3D","line":98,"in_reply_to":"AAAAVn%2F%2F47A%3D","updated":"2014-03-03 21:25:04.000000000","message":"Done","commit_id":"b2f0c92a98409463db7f4939d01ff8bd8d2df0f4"},{"author":{"_account_id":688,"name":"Sandy Walsh","email":"sandy.walsh@rackspace.com","username":"sandy-walsh"},"change_message_id":"c98e433a1c94420c14ae000dbf5a8d0535fc696c","unresolved":false,"context_lines":[{"line_number":226,"context_line":"        request_spec[\u0027instance_uuids\u0027] \u003d [instance_uuid]"},{"line_number":227,"context_line":"        # NOTE(Yathi): Not using weights in solver scheduler,"},{"line_number":228,"context_line":"        # but leaving it in the payload"},{"line_number":229,"context_line":"        weighted_host \u003d {\u0027host\u0027: selected_host.host, \u0027weight\u0027: 1}"},{"line_number":230,"context_line":"        payload \u003d {\u0027request_spec\u0027: request_spec,"},{"line_number":231,"context_line":"                   \u0027weighted_host\u0027: weighted_host,"},{"line_number":232,"context_line":"                   \u0027instance_id\u0027: instance_uuid}"}],"source_content_type":"text/x-python","patch_set":28,"id":"AAAAVn%2F%2F46A%3D","line":229,"updated":"2014-03-03 16:12:31.000000000","message":"Again, this is largely the same as the filter_scheduler. It should be refactored to remove the common code.","commit_id":"b2f0c92a98409463db7f4939d01ff8bd8d2df0f4"},{"author":{"_account_id":8514,"name":"Yathiraj Udupi","email":"yudupi@cisco.com","username":"yudupi"},"change_message_id":"fcfff27a18fc56cd4ffb67d08051e12e2f613572","unresolved":false,"context_lines":[{"line_number":226,"context_line":"        request_spec[\u0027instance_uuids\u0027] \u003d [instance_uuid]"},{"line_number":227,"context_line":"        # NOTE(Yathi): Not using weights in solver scheduler,"},{"line_number":228,"context_line":"        # but leaving it in the payload"},{"line_number":229,"context_line":"        weighted_host \u003d {\u0027host\u0027: selected_host.host, \u0027weight\u0027: 1}"},{"line_number":230,"context_line":"        payload \u003d {\u0027request_spec\u0027: request_spec,"},{"line_number":231,"context_line":"                   \u0027weighted_host\u0027: weighted_host,"},{"line_number":232,"context_line":"                   \u0027instance_id\u0027: instance_uuid}"}],"source_content_type":"text/x-python","patch_set":28,"id":"AAAAVn%2F%2F1jU%3D","line":229,"in_reply_to":"AAAAVn%2F%2F46A%3D","updated":"2014-03-03 21:25:04.000000000","message":"Done","commit_id":"b2f0c92a98409463db7f4939d01ff8bd8d2df0f4"},{"author":{"_account_id":688,"name":"Sandy Walsh","email":"sandy.walsh@rackspace.com","username":"sandy-walsh"},"change_message_id":"55c972ff1b54fd9ec6cd41de8282cb7f04cae85e","unresolved":false,"context_lines":[{"line_number":111,"context_line":"            selected_hosts \u003d list(hosts)"},{"line_number":112,"context_line":"        else:"},{"line_number":113,"context_line":"            list_hosts \u003d list(hosts)"},{"line_number":114,"context_line":"            host_instance_tuples_list \u003d self.hosts_solver.host_solve("},{"line_number":115,"context_line":"                                             list_hosts, instance_uuids,"},{"line_number":116,"context_line":"                                             request_spec, filter_properties)"},{"line_number":117,"context_line":"            # NOTE(Yathi): Not using weights in solver scheduler,"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAVn%2F%2Ftko%3D","line":114,"updated":"2014-03-04 14:52:19.000000000","message":"Ok, this makes things much easier to read. \n\nIt seems we\u0027re doing a lot of work when really it\u0027s the host selection and filtering process that we\u0027re changing? \n\nCould this not just be a different host filter? and perhaps introduce a new abstraction for how the source host list is created (if needed)?","commit_id":"d0b1152662dbd68d4f51bf852a0790a4d8b8d6a0"},{"author":{"_account_id":8514,"name":"Yathiraj Udupi","email":"yudupi@cisco.com","username":"yudupi"},"change_message_id":"72c31dad4e8dd8d03e3113654ecf20266c8c1360","unresolved":false,"context_lines":[{"line_number":111,"context_line":"            selected_hosts \u003d list(hosts)"},{"line_number":112,"context_line":"        else:"},{"line_number":113,"context_line":"            list_hosts \u003d list(hosts)"},{"line_number":114,"context_line":"            host_instance_tuples_list \u003d self.hosts_solver.host_solve("},{"line_number":115,"context_line":"                                             list_hosts, instance_uuids,"},{"line_number":116,"context_line":"                                             request_spec, filter_properties)"},{"line_number":117,"context_line":"            # NOTE(Yathi): Not using weights in solver scheduler,"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAVn%2F%2FtBA%3D","line":114,"in_reply_to":"AAAAVn%2F%2Ftko%3D","updated":"2014-03-04 15:53:51.000000000","message":"Hi Sandy, \nNo this can\u0027t be another host filter. The main idea behind the Solver Scheduler blueprint is that we are introducing a Constraint Optimization Solver to arrive at the list of hosts in a single solving session. So both the constraint satisfaction (similar to filtering) and the constraint optimization (minimizing the cost metrics) (similar to weighting) is done together in a single problem solving leveraging constraint solvers.  This also allows for complex cost metrics to be provided, that we can minimize on, while satisfying the constraints at the same time. Another difference is that the entire request is solved at once, for all the requested number of instances. (currently supporting multiple instances of the same flavor only, but in future, we may have multiple flavored requests) Will summarize my reply in the main review response. \nThanks,\nYathi.","commit_id":"d0b1152662dbd68d4f51bf852a0790a4d8b8d6a0"}],"nova/scheduler/solvers/__init__.py":[{"author":{"_account_id":688,"name":"Sandy Walsh","email":"sandy.walsh@rackspace.com","username":"sandy-walsh"},"change_message_id":"b49aa23e728b3f90e1bcd05732824bce5fa5ec67","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2011 OpenStack Foundation"},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUX%2F%2FyNA%3D","line":1,"updated":"2014-02-10 20:55:34.000000000","message":"header should be cisco","commit_id":"b70a248b3c24847328959cd2ce168aaf0b0dee39"},{"author":{"_account_id":8514,"name":"Yathiraj Udupi","email":"yudupi@cisco.com","username":"yudupi"},"change_message_id":"d4495b2284fa5eb658ceb175801e92ac930124b9","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2011 OpenStack Foundation"},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUX%2F%2FucI%3D","line":1,"in_reply_to":"AAAAUX%2F%2FyNA%3D","updated":"2014-02-11 07:51:34.000000000","message":"Done","commit_id":"b70a248b3c24847328959cd2ce168aaf0b0dee39"}],"nova/scheduler/solvers/hosts_pulp_solver.py":[{"author":{"_account_id":8690,"name":"Khanh-Toan TRAN","email":"khtoantran@gmail.com","username":"toan-tran"},"change_message_id":"20e2036a25a7b1bc3061118e0d0b93555ec7707e","unresolved":false,"context_lines":[{"line_number":33,"context_line":"             \u0027this configuration value if no per-aggregate setting found.\u0027)"},{"line_number":34,"context_line":"ram_weight_opts \u003d ["},{"line_number":35,"context_line":"        cfg.FloatOpt(\u0027ram_optimization_cost_multiplier\u0027,"},{"line_number":36,"context_line":"                     default\u003d1.0,"},{"line_number":37,"context_line":"                     help\u003d\u0027Multiplier used for ram optimization cost metric. This \u0027"},{"line_number":38,"context_line":"                          \u0027solver uses a LP minimization problem. So a negative \u0027"},{"line_number":39,"context_line":"                          \u0027number would mean a cost maximization problem.\u0027),"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F%2B8RA%3D","line":36,"updated":"2013-11-18 13:42:10.000000000","message":"I think the default value is -1.0, and not +1.0. Otherwise when you minimize, it puts VMs into the host with least available RAM.","commit_id":"e24942df8f0b425254627d562b873595c01659ee"},{"author":{"_account_id":8690,"name":"Khanh-Toan TRAN","email":"khtoantran@gmail.com","username":"toan-tran"},"change_message_id":"20e2036a25a7b1bc3061118e0d0b93555ec7707e","unresolved":false,"context_lines":[{"line_number":113,"context_line":"        #Currently just like the nova.scheduler.weights.ram.RAMWeigher,"},{"line_number":114,"context_line":"        #using the host_state.free_ram_mb * CONF.ram_optimization_cost_multiplier as the cost"},{"line_number":115,"context_line":"        # TODO make costs matrix according different resource types costs"},{"line_number":116,"context_line":"        costs \u003d [[host.free_ram_mb*CONF.ram_weight_multiplier for i in range(num_instances)] for host in hosts]"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"        # The cost data is made into a dictionary"},{"line_number":119,"context_line":"        costs \u003d makeDict([Hosts, Instances], costs, 0)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F%2B8Q4%3D","line":116,"updated":"2013-11-18 13:42:10.000000000","message":"This cost function does not reflex what weigher does. In load blancing mode, nova-scheduler initiates one VM after another, each time the RAMWeigher is called to re-calculate the remaining RAM, thus assuring load balance. \n\nThis cost function, however, only takes the current remaining RAM. Therefore it may place several VMs in the same host, making its load a lot heavier than others. \n\nExample: RAM(A) \u003d 10GB, RAM(B) \u003d 9GB. 3 VMs each requires 1GB.\na) Maximize \u003d\u003e Putting 3 VMs into host A\n\u003d\u003e RAM(A) \u003d 7, RAM(B) \u003d 9 \u003d\u003e Unbalanced !\nb) Minimize \u003d\u003e Putting 3 VMs into host B\n\u003d\u003e RAM(A) \u003d 10, RAM(B) \u003d 6 \u003d\u003e Unbalanced !","commit_id":"e24942df8f0b425254627d562b873595c01659ee"},{"author":{"_account_id":688,"name":"Sandy Walsh","email":"sandy.walsh@rackspace.com","username":"sandy-walsh"},"change_message_id":"b49aa23e728b3f90e1bcd05732824bce5fa5ec67","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2012 OpenStack Foundation"},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUX%2F%2FyMM%3D","line":1,"updated":"2014-02-10 20:55:34.000000000","message":"header should be Cisco","commit_id":"b70a248b3c24847328959cd2ce168aaf0b0dee39"},{"author":{"_account_id":688,"name":"Sandy Walsh","email":"sandy.walsh@rackspace.com","username":"sandy-walsh"},"change_message_id":"b49aa23e728b3f90e1bcd05732824bce5fa5ec67","unresolved":false,"context_lines":[{"line_number":16,"context_line":"from nova.openstack.common.gettextutils import _"},{"line_number":17,"context_line":"from nova.openstack.common import log as logging"},{"line_number":18,"context_line":"from nova.scheduler import solvers as novasolvers"},{"line_number":19,"context_line":"from oslo.config import cfg"},{"line_number":20,"context_line":"from pulp import constants"},{"line_number":21,"context_line":"from pulp import pulp"},{"line_number":22,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUX%2F%2FyLc%3D","line":19,"updated":"2014-02-10 20:55:34.000000000","message":"import ordering should be per HACKING guide.","commit_id":"b70a248b3c24847328959cd2ce168aaf0b0dee39"},{"author":{"_account_id":8514,"name":"Yathiraj Udupi","email":"yudupi@cisco.com","username":"yudupi"},"change_message_id":"d4495b2284fa5eb658ceb175801e92ac930124b9","unresolved":false,"context_lines":[{"line_number":16,"context_line":"from nova.openstack.common.gettextutils import _"},{"line_number":17,"context_line":"from nova.openstack.common import log as logging"},{"line_number":18,"context_line":"from nova.scheduler import solvers as novasolvers"},{"line_number":19,"context_line":"from oslo.config import cfg"},{"line_number":20,"context_line":"from pulp import constants"},{"line_number":21,"context_line":"from pulp import pulp"},{"line_number":22,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUX%2F%2FudQ%3D","line":19,"in_reply_to":"AAAAUX%2F%2FyLc%3D","updated":"2014-02-11 07:51:34.000000000","message":"Done","commit_id":"b70a248b3c24847328959cd2ce168aaf0b0dee39"},{"author":{"_account_id":688,"name":"Sandy Walsh","email":"sandy.walsh@rackspace.com","username":"sandy-walsh"},"change_message_id":"b49aa23e728b3f90e1bcd05732824bce5fa5ec67","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"disk_allocation_ratio_opt \u003d cfg.FloatOpt(\"disk_allocation_ratio\", default\u003d1.0,"},{"line_number":26,"context_line":"    help\u003d\"Virtual disk to physical disk allocation ratio\")"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"ram_allocation_ratio_opt \u003d cfg.FloatOpt(\u0027ram_allocation_ratio\u0027,"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUX%2F%2FyJ8%3D","line":25,"updated":"2014-02-10 20:55:34.000000000","message":"these flags should be part of a solver scheduler namespace, not global.","commit_id":"b70a248b3c24847328959cd2ce168aaf0b0dee39"},{"author":{"_account_id":8514,"name":"Yathiraj Udupi","email":"yudupi@cisco.com","username":"yudupi"},"change_message_id":"d4495b2284fa5eb658ceb175801e92ac930124b9","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"disk_allocation_ratio_opt \u003d cfg.FloatOpt(\"disk_allocation_ratio\", default\u003d1.0,"},{"line_number":26,"context_line":"    help\u003d\"Virtual disk to physical disk allocation ratio\")"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"ram_allocation_ratio_opt \u003d cfg.FloatOpt(\u0027ram_allocation_ratio\u0027,"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUX%2F%2FudM%3D","line":25,"in_reply_to":"AAAAUX%2F%2FyJ8%3D","updated":"2014-02-11 07:51:34.000000000","message":"Done","commit_id":"b70a248b3c24847328959cd2ce168aaf0b0dee39"},{"author":{"_account_id":688,"name":"Sandy Walsh","email":"sandy.walsh@rackspace.com","username":"sandy-walsh"},"change_message_id":"b49aa23e728b3f90e1bcd05732824bce5fa5ec67","unresolved":false,"context_lines":[{"line_number":43,"context_line":"CONF \u003d cfg.CONF"},{"line_number":44,"context_line":"try:"},{"line_number":45,"context_line":"    CONF.register_opt(ram_allocation_ratio_opt)"},{"line_number":46,"context_line":"except cfg.DuplicateOptError:"},{"line_number":47,"context_line":"    pass"},{"line_number":48,"context_line":"try:"},{"line_number":49,"context_line":"    CONF.register_opt(disk_allocation_ratio_opt)"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUX%2F%2FyJk%3D","line":46,"updated":"2014-02-10 20:55:34.000000000","message":"Why are we ignoring these dup errors?","commit_id":"b70a248b3c24847328959cd2ce168aaf0b0dee39"},{"author":{"_account_id":8514,"name":"Yathiraj Udupi","email":"yudupi@cisco.com","username":"yudupi"},"change_message_id":"d4495b2284fa5eb658ceb175801e92ac930124b9","unresolved":false,"context_lines":[{"line_number":43,"context_line":"CONF \u003d cfg.CONF"},{"line_number":44,"context_line":"try:"},{"line_number":45,"context_line":"    CONF.register_opt(ram_allocation_ratio_opt)"},{"line_number":46,"context_line":"except cfg.DuplicateOptError:"},{"line_number":47,"context_line":"    pass"},{"line_number":48,"context_line":"try:"},{"line_number":49,"context_line":"    CONF.register_opt(disk_allocation_ratio_opt)"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUX%2F%2FudA%3D","line":46,"in_reply_to":"AAAAUX%2F%2FyJk%3D","updated":"2014-02-11 07:51:34.000000000","message":"Removed these, as I am now using a solver scheduler namespace for the flags","commit_id":"b70a248b3c24847328959cd2ce168aaf0b0dee39"},{"author":{"_account_id":688,"name":"Sandy Walsh","email":"sandy.walsh@rackspace.com","username":"sandy-walsh"},"change_message_id":"b49aa23e728b3f90e1bcd05732824bce5fa5ec67","unresolved":false,"context_lines":[{"line_number":63,"context_line":"           filter_properties"},{"line_number":64,"context_line":"        \"\"\""},{"line_number":65,"context_line":"        host_instance_tuples_list \u003d []"},{"line_number":66,"context_line":"        #Implement the solver logic here"},{"line_number":67,"context_line":"        #------------------"},{"line_number":68,"context_line":"        if instance_uuids:"},{"line_number":69,"context_line":"            num_instances \u003d len(instance_uuids)"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUX%2F%2FyJE%3D","line":66,"updated":"2014-02-10 20:55:34.000000000","message":"unnecessary comment (and no ------- comment breaks)","commit_id":"b70a248b3c24847328959cd2ce168aaf0b0dee39"},{"author":{"_account_id":8514,"name":"Yathiraj Udupi","email":"yudupi@cisco.com","username":"yudupi"},"change_message_id":"d4495b2284fa5eb658ceb175801e92ac930124b9","unresolved":false,"context_lines":[{"line_number":63,"context_line":"           filter_properties"},{"line_number":64,"context_line":"        \"\"\""},{"line_number":65,"context_line":"        host_instance_tuples_list \u003d []"},{"line_number":66,"context_line":"        #Implement the solver logic here"},{"line_number":67,"context_line":"        #------------------"},{"line_number":68,"context_line":"        if instance_uuids:"},{"line_number":69,"context_line":"            num_instances \u003d len(instance_uuids)"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUX%2F%2Fuc8%3D","line":66,"in_reply_to":"AAAAUX%2F%2FyJE%3D","updated":"2014-02-11 07:51:34.000000000","message":"Done","commit_id":"b70a248b3c24847328959cd2ce168aaf0b0dee39"},{"author":{"_account_id":688,"name":"Sandy Walsh","email":"sandy.walsh@rackspace.com","username":"sandy-walsh"},"change_message_id":"b49aa23e728b3f90e1bcd05732824bce5fa5ec67","unresolved":false,"context_lines":[{"line_number":69,"context_line":"            num_instances \u003d len(instance_uuids)"},{"line_number":70,"context_line":"        else:"},{"line_number":71,"context_line":"            num_instances \u003d request_spec.get(\u0027num_instances\u0027, 1)"},{"line_number":72,"context_line":"            #Setting a unset uuid string for each instance"},{"line_number":73,"context_line":"            instance_uuids \u003d [\u0027unset_uuid\u0027 + str(i)"},{"line_number":74,"context_line":"                              for i in xrange(num_instances)]"},{"line_number":75,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUX%2F%2FyIs%3D","line":72,"updated":"2014-02-10 20:55:34.000000000","message":"unnecessary comment (and should be whitespace after # in comments)","commit_id":"b70a248b3c24847328959cd2ce168aaf0b0dee39"},{"author":{"_account_id":8514,"name":"Yathiraj Udupi","email":"yudupi@cisco.com","username":"yudupi"},"change_message_id":"d4495b2284fa5eb658ceb175801e92ac930124b9","unresolved":false,"context_lines":[{"line_number":69,"context_line":"            num_instances \u003d len(instance_uuids)"},{"line_number":70,"context_line":"        else:"},{"line_number":71,"context_line":"            num_instances \u003d request_spec.get(\u0027num_instances\u0027, 1)"},{"line_number":72,"context_line":"            #Setting a unset uuid string for each instance"},{"line_number":73,"context_line":"            instance_uuids \u003d [\u0027unset_uuid\u0027 + str(i)"},{"line_number":74,"context_line":"                              for i in xrange(num_instances)]"},{"line_number":75,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUX%2F%2Fuc0%3D","line":72,"in_reply_to":"AAAAUX%2F%2FyIs%3D","updated":"2014-02-11 07:51:34.000000000","message":"Done","commit_id":"b70a248b3c24847328959cd2ce168aaf0b0dee39"},{"author":{"_account_id":688,"name":"Sandy Walsh","email":"sandy.walsh@rackspace.com","username":"sandy-walsh"},"change_message_id":"b49aa23e728b3f90e1bcd05732824bce5fa5ec67","unresolved":false,"context_lines":[{"line_number":70,"context_line":"        else:"},{"line_number":71,"context_line":"            num_instances \u003d request_spec.get(\u0027num_instances\u0027, 1)"},{"line_number":72,"context_line":"            #Setting a unset uuid string for each instance"},{"line_number":73,"context_line":"            instance_uuids \u003d [\u0027unset_uuid\u0027 + str(i)"},{"line_number":74,"context_line":"                              for i in xrange(num_instances)]"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"        num_hosts \u003d len(hosts)"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUX%2F%2FyIA%3D","line":73,"updated":"2014-02-10 20:55:34.000000000","message":"\u0027unset_uuid%(s)\u0027 % i for i in xrange(...)","commit_id":"b70a248b3c24847328959cd2ce168aaf0b0dee39"},{"author":{"_account_id":8514,"name":"Yathiraj Udupi","email":"yudupi@cisco.com","username":"yudupi"},"change_message_id":"d4495b2284fa5eb658ceb175801e92ac930124b9","unresolved":false,"context_lines":[{"line_number":70,"context_line":"        else:"},{"line_number":71,"context_line":"            num_instances \u003d request_spec.get(\u0027num_instances\u0027, 1)"},{"line_number":72,"context_line":"            #Setting a unset uuid string for each instance"},{"line_number":73,"context_line":"            instance_uuids \u003d [\u0027unset_uuid\u0027 + str(i)"},{"line_number":74,"context_line":"                              for i in xrange(num_instances)]"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"        num_hosts \u003d len(hosts)"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUX%2F%2Fucw%3D","line":73,"in_reply_to":"AAAAUX%2F%2FyIA%3D","updated":"2014-02-11 07:51:34.000000000","message":"Done","commit_id":"b70a248b3c24847328959cd2ce168aaf0b0dee39"},{"author":{"_account_id":688,"name":"Sandy Walsh","email":"sandy.walsh@rackspace.com","username":"sandy-walsh"},"change_message_id":"b49aa23e728b3f90e1bcd05732824bce5fa5ec67","unresolved":false,"context_lines":[{"line_number":75,"context_line":""},{"line_number":76,"context_line":"        num_hosts \u003d len(hosts)"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"        #A list of HostsIds"},{"line_number":79,"context_line":"        Hosts \u003d [\u0027Host\u0027 + str(i) for i in range(num_hosts)]"},{"line_number":80,"context_line":"        LOG.debug(_(\"All Hosts: %s\") % [h.host for h in hosts])"},{"line_number":81,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUX%2F%2FyH0%3D","line":78,"updated":"2014-02-10 20:55:34.000000000","message":"remove comment","commit_id":"b70a248b3c24847328959cd2ce168aaf0b0dee39"},{"author":{"_account_id":8514,"name":"Yathiraj Udupi","email":"yudupi@cisco.com","username":"yudupi"},"change_message_id":"d4495b2284fa5eb658ceb175801e92ac930124b9","unresolved":false,"context_lines":[{"line_number":75,"context_line":""},{"line_number":76,"context_line":"        num_hosts \u003d len(hosts)"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"        #A list of HostsIds"},{"line_number":79,"context_line":"        Hosts \u003d [\u0027Host\u0027 + str(i) for i in range(num_hosts)]"},{"line_number":80,"context_line":"        LOG.debug(_(\"All Hosts: %s\") % [h.host for h in hosts])"},{"line_number":81,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUX%2F%2Fucs%3D","line":78,"in_reply_to":"AAAAUX%2F%2FyH0%3D","updated":"2014-02-11 07:51:34.000000000","message":"Done","commit_id":"b70a248b3c24847328959cd2ce168aaf0b0dee39"},{"author":{"_account_id":688,"name":"Sandy Walsh","email":"sandy.walsh@rackspace.com","username":"sandy-walsh"},"change_message_id":"b49aa23e728b3f90e1bcd05732824bce5fa5ec67","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        num_hosts \u003d len(hosts)"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"        #A list of HostsIds"},{"line_number":79,"context_line":"        Hosts \u003d [\u0027Host\u0027 + str(i) for i in range(num_hosts)]"},{"line_number":80,"context_line":"        LOG.debug(_(\"All Hosts: %s\") % [h.host for h in hosts])"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"        for host in hosts:"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUX%2F%2FyHk%3D","line":79,"updated":"2014-02-10 20:55:34.000000000","message":"variables are lower_case. [\u0027Host%s\u0027 for i in range(...)]","commit_id":"b70a248b3c24847328959cd2ce168aaf0b0dee39"},{"author":{"_account_id":8514,"name":"Yathiraj Udupi","email":"yudupi@cisco.com","username":"yudupi"},"change_message_id":"d4495b2284fa5eb658ceb175801e92ac930124b9","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        num_hosts \u003d len(hosts)"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"        #A list of HostsIds"},{"line_number":79,"context_line":"        Hosts \u003d [\u0027Host\u0027 + str(i) for i in range(num_hosts)]"},{"line_number":80,"context_line":"        LOG.debug(_(\"All Hosts: %s\") % [h.host for h in hosts])"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"        for host in hosts:"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUX%2F%2Fuco%3D","line":79,"in_reply_to":"AAAAUX%2F%2FyHk%3D","updated":"2014-02-11 07:51:34.000000000","message":"Done","commit_id":"b70a248b3c24847328959cd2ce168aaf0b0dee39"},{"author":{"_account_id":688,"name":"Sandy Walsh","email":"sandy.walsh@rackspace.com","username":"sandy-walsh"},"change_message_id":"b49aa23e728b3f90e1bcd05732824bce5fa5ec67","unresolved":false,"context_lines":[{"line_number":82,"context_line":"        for host in hosts:"},{"line_number":83,"context_line":"            LOG.debug(_(\"Host state: %s\") % host)"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"        #A dictionary of Host Ids to host"},{"line_number":86,"context_line":"        HostIdDict \u003d dict(zip(Hosts, hosts))"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        # Creating a list with some Instance ids for each instance required"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUX%2F%2FyHQ%3D","line":85,"updated":"2014-02-10 20:55:34.000000000","message":"remove comment","commit_id":"b70a248b3c24847328959cd2ce168aaf0b0dee39"},{"author":{"_account_id":8514,"name":"Yathiraj Udupi","email":"yudupi@cisco.com","username":"yudupi"},"change_message_id":"d4495b2284fa5eb658ceb175801e92ac930124b9","unresolved":false,"context_lines":[{"line_number":82,"context_line":"        for host in hosts:"},{"line_number":83,"context_line":"            LOG.debug(_(\"Host state: %s\") % host)"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"        #A dictionary of Host Ids to host"},{"line_number":86,"context_line":"        HostIdDict \u003d dict(zip(Hosts, hosts))"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        # Creating a list with some Instance ids for each instance required"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUX%2F%2Fucc%3D","line":85,"in_reply_to":"AAAAUX%2F%2FyHQ%3D","updated":"2014-02-11 07:51:34.000000000","message":"Done","commit_id":"b70a248b3c24847328959cd2ce168aaf0b0dee39"},{"author":{"_account_id":688,"name":"Sandy Walsh","email":"sandy.walsh@rackspace.com","username":"sandy-walsh"},"change_message_id":"b49aa23e728b3f90e1bcd05732824bce5fa5ec67","unresolved":false,"context_lines":[{"line_number":83,"context_line":"            LOG.debug(_(\"Host state: %s\") % host)"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"        #A dictionary of Host Ids to host"},{"line_number":86,"context_line":"        HostIdDict \u003d dict(zip(Hosts, hosts))"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        # Creating a list with some Instance ids for each instance required"},{"line_number":89,"context_line":"        Instances \u003d [\u0027Instance\u0027 + str(i) for i in range(num_instances)]"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUX%2F%2FyHA%3D","line":86,"updated":"2014-02-10 20:55:34.000000000","message":"lower case vars ... host_id_dict","commit_id":"b70a248b3c24847328959cd2ce168aaf0b0dee39"},{"author":{"_account_id":8514,"name":"Yathiraj Udupi","email":"yudupi@cisco.com","username":"yudupi"},"change_message_id":"d4495b2284fa5eb658ceb175801e92ac930124b9","unresolved":false,"context_lines":[{"line_number":83,"context_line":"            LOG.debug(_(\"Host state: %s\") % host)"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"        #A dictionary of Host Ids to host"},{"line_number":86,"context_line":"        HostIdDict \u003d dict(zip(Hosts, hosts))"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        # Creating a list with some Instance ids for each instance required"},{"line_number":89,"context_line":"        Instances \u003d [\u0027Instance\u0027 + str(i) for i in range(num_instances)]"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUX%2F%2FucY%3D","line":86,"in_reply_to":"AAAAUX%2F%2FyHA%3D","updated":"2014-02-11 07:51:34.000000000","message":"Done","commit_id":"b70a248b3c24847328959cd2ce168aaf0b0dee39"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"dae5dbf6533ba8efadd428603b9e26a7cf24c397","unresolved":false,"context_lines":[{"line_number":21,"context_line":"\"\"\""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"from oslo.config import cfg"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"from pulp import constants"},{"line_number":26,"context_line":"from pulp import pulp"},{"line_number":27,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUX%2F%2FZME%3D","line":24,"updated":"2014-02-13 14:37:39.000000000","message":"please delete this line","commit_id":"4a0d2440926c0fe12d7856b7dc22ce64681d8845"},{"author":{"_account_id":8514,"name":"Yathiraj Udupi","email":"yudupi@cisco.com","username":"yudupi"},"change_message_id":"c52fc83b524b3b006d7ff5469d74e7b94e55df6b","unresolved":false,"context_lines":[{"line_number":21,"context_line":"\"\"\""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"from oslo.config import cfg"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"from pulp import constants"},{"line_number":26,"context_line":"from pulp import pulp"},{"line_number":27,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUX%2F%2FXWk%3D","line":24,"in_reply_to":"AAAAUX%2F%2FZME%3D","updated":"2014-02-13 17:50:45.000000000","message":"Done","commit_id":"4a0d2440926c0fe12d7856b7dc22ce64681d8845"}],"nova/tests/scheduler/test_solver_scheduler.py":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"8d7932b86528b70611a90a6455793dabbc69d32c","unresolved":false,"context_lines":[{"line_number":16,"context_line":"Tests For Solver Scheduler."},{"line_number":17,"context_line":"\"\"\""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"import mox"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"from nova.compute import utils as compute_utils"},{"line_number":22,"context_line":"from nova.compute import vm_states"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUX%2F%2Fhhg%3D","line":19,"updated":"2014-02-12 16:01:56.000000000","message":"can you please use mock instead of mox","commit_id":"9dbb1e0f232688b735c7667058cd00574bb2cf8e"},{"author":{"_account_id":8514,"name":"Yathiraj Udupi","email":"yudupi@cisco.com","username":"yudupi"},"change_message_id":"4757dacc78bbd0905689159f43ec887bb92a23c3","unresolved":false,"context_lines":[{"line_number":16,"context_line":"Tests For Solver Scheduler."},{"line_number":17,"context_line":"\"\"\""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"import mox"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"from nova.compute import utils as compute_utils"},{"line_number":22,"context_line":"from nova.compute import vm_states"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUX%2F%2FgBI%3D","line":19,"in_reply_to":"AAAAUX%2F%2Fhhg%3D","updated":"2014-02-12 18:51:28.000000000","message":"Hi Gary,  \nThis is a bigger change, as the existing test super classes used for scheduler tests in nova are all using mox, hence my new test class is written based on that extending the existing classes.  Hence it will be a bigger change to replace mox with mock as part of this patch. It is a good change for entire nova tests as part of another patch.  Thanks.","commit_id":"9dbb1e0f232688b735c7667058cd00574bb2cf8e"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"dae5dbf6533ba8efadd428603b9e26a7cf24c397","unresolved":false,"context_lines":[{"line_number":16,"context_line":"Tests For Solver Scheduler."},{"line_number":17,"context_line":"\"\"\""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"import mox"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"from nova.compute import utils as compute_utils"},{"line_number":22,"context_line":"from nova.compute import vm_states"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUX%2F%2FZL4%3D","line":19,"updated":"2014-02-13 14:37:39.000000000","message":"i think that for new tests we should try and use mock","commit_id":"4a0d2440926c0fe12d7856b7dc22ce64681d8845"},{"author":{"_account_id":8514,"name":"Yathiraj Udupi","email":"yudupi@cisco.com","username":"yudupi"},"change_message_id":"a9449241820e5c6c4c105b02cf5fc874557f35f6","unresolved":false,"context_lines":[{"line_number":16,"context_line":"Tests For Solver Scheduler."},{"line_number":17,"context_line":"\"\"\""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"import mox"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"from nova.compute import utils as compute_utils"},{"line_number":22,"context_line":"from nova.compute import vm_states"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUX%2F%2FMJ4%3D","line":19,"in_reply_to":"AAAAUX%2F%2FZL4%3D","updated":"2014-02-15 01:23:22.000000000","message":"Gary, \nI have now rewritten the tests using mock! Please review. \nThanks.","commit_id":"4a0d2440926c0fe12d7856b7dc22ce64681d8845"},{"author":{"_account_id":8514,"name":"Yathiraj Udupi","email":"yudupi@cisco.com","username":"yudupi"},"change_message_id":"c52fc83b524b3b006d7ff5469d74e7b94e55df6b","unresolved":false,"context_lines":[{"line_number":16,"context_line":"Tests For Solver Scheduler."},{"line_number":17,"context_line":"\"\"\""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"import mox"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"from nova.compute import utils as compute_utils"},{"line_number":22,"context_line":"from nova.compute import vm_states"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUX%2F%2FXVw%3D","line":19,"in_reply_to":"AAAAUX%2F%2FZL4%3D","updated":"2014-02-13 17:50:45.000000000","message":"I need to look more into the nova scheduler tests super classes that currently use mox. I will see if I can change my new test alone to use mock. will be part of another patch. Not included in the immediate next patch.","commit_id":"4a0d2440926c0fe12d7856b7dc22ce64681d8845"}],"requirements.txt":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"7002f68c89a6baaba095a5736709c77c3191619d","unresolved":false,"context_lines":[{"line_number":30,"context_line":"websockify\u003e\u003d0.5.1,\u003c0.6"},{"line_number":31,"context_line":"oslo.config\u003e\u003d1.2.0"},{"line_number":32,"context_line":"pycadf\u003e\u003d0.1.9"},{"line_number":33,"context_line":"coinor.pulp\u003e\u003d1.0.4"}],"source_content_type":"text/plain","patch_set":5,"id":"AAAATn%2F89eQ%3D","line":33,"updated":"2013-12-18 11:34:41.000000000","message":"you need to firts add this into the global requirements project \n\nhttps://github.com/openstack/requirements/blob/master/global-requirements.txt","commit_id":"3a0719e2c95a737dc751213ef99aaa4971d5fbe9"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"8d7932b86528b70611a90a6455793dabbc69d32c","unresolved":false,"context_lines":[{"line_number":33,"context_line":"oslo.rootwrap"},{"line_number":34,"context_line":"pycadf\u003e\u003d0.1.9"},{"line_number":35,"context_line":"oslo.messaging\u003e\u003d1.3.0a4"},{"line_number":36,"context_line":"coinor.pulp\u003e\u003d1.0.4"}],"source_content_type":"text/plain","patch_set":15,"id":"AAAAUX%2F%2FhhA%3D","line":36,"updated":"2014-02-12 16:01:56.000000000","message":"in order for this to be updated we first need it to be added to https://github.com/openstack/nova/blob/master/requirements.txt (there is a separate requirement project that you need to push the patch to)","commit_id":"9dbb1e0f232688b735c7667058cd00574bb2cf8e"},{"author":{"_account_id":8514,"name":"Yathiraj Udupi","email":"yudupi@cisco.com","username":"yudupi"},"change_message_id":"4757dacc78bbd0905689159f43ec887bb92a23c3","unresolved":false,"context_lines":[{"line_number":33,"context_line":"oslo.rootwrap"},{"line_number":34,"context_line":"pycadf\u003e\u003d0.1.9"},{"line_number":35,"context_line":"oslo.messaging\u003e\u003d1.3.0a4"},{"line_number":36,"context_line":"coinor.pulp\u003e\u003d1.0.4"}],"source_content_type":"text/plain","patch_set":15,"id":"AAAAUX%2F%2FgAk%3D","line":36,"in_reply_to":"AAAAUX%2F%2FhhA%3D","updated":"2014-02-12 18:51:28.000000000","message":"Hi Gary, \nIt is already included in the separate requirement project here as part of this commit - https://review.openstack.org/#/c/53446/ It is already merged now.  So this is done. Thanks.","commit_id":"9dbb1e0f232688b735c7667058cd00574bb2cf8e"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"dae5dbf6533ba8efadd428603b9e26a7cf24c397","unresolved":false,"context_lines":[{"line_number":33,"context_line":"oslo.rootwrap"},{"line_number":34,"context_line":"pycadf\u003e\u003d0.1.9"},{"line_number":35,"context_line":"oslo.messaging\u003e\u003d1.3.0a4"},{"line_number":36,"context_line":"coinor.pulp\u003e\u003d1.0.4"}],"source_content_type":"text/plain","patch_set":18,"id":"AAAAUX%2F%2FZL0%3D","line":36,"updated":"2014-02-13 14:37:39.000000000","message":"thanks for pointing out that this has been approved in the requirements project","commit_id":"4a0d2440926c0fe12d7856b7dc22ce64681d8845"}]}
