)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b1945e7a1d73b7c7a51194b92e4fb65af1f20c24","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Add --ram, --disk, --vcpus options to:"},{"line_number":10,"context_line":"* flavor list to filter results"},{"line_number":11,"context_line":"* server create to select a flavor for the new server"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"The flavor list command uses the same selection criteria so the user"},{"line_number":14,"context_line":"can verify which flavor will be selected."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"5f7c97a3_68914b52","line":11,"updated":"2018-06-08 14:32:39.000000000","message":"A flavor is required when creating a server, so this is a bit confusing to me. I get the idea, i.e. I know I want 4 VCPU, 8GB of RAM and at least 40GB of disk, so find a flavor that matches that and make it happen.","commit_id":"aa9f2b3fdae976335533405e53361d79a32cf34d"}],"openstackclient/compute/v2/flavor.py":[{"author":{"_account_id":14758,"name":"Rajath Agasthya","email":"rajagast@cisco.com","username":"rajathagasthya"},"change_message_id":"09f8f48486e44459ef8bdfb5fd77859c1dea28da","unresolved":false,"context_lines":[{"line_number":314,"context_line":"            sort_attr \u003d \u0027,\u0027.join([k + \u0027:asc\u0027 for k in flair])"},{"line_number":315,"context_line":"            data \u003d utils.find_min_match("},{"line_number":316,"context_line":"                flavors,"},{"line_number":317,"context_line":"                # TODO(dtroyer): Need to work out a sort method"},{"line_number":318,"context_line":"                sort_attr\u003dsort_attr,"},{"line_number":319,"context_line":"                **flair"},{"line_number":320,"context_line":"            )"},{"line_number":321,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":7,"id":"bf3e73b7_27bc2504","line":318,"range":{"start_line":317,"start_character":16,"end_line":318,"end_character":35},"updated":"2017-08-07 18:48:36.000000000","message":"I included sort_attr to try and make this work. But why are we exposing sort key in a find_min_match method in osc_lib? I know find_min_match() uses sort_items() in osc_lib which requires a sort_str, but that can be easily constructed from the flair (constraints) dict. The keys in the flair dict (ram, disk, vcpus) are the keys the iterable needs to be sorted on and always in ascending order. \n\nExamples:\n\n1. flair \u003d {\u0027ram\u0027: 2048, \u0027disk\u0027: 1, vcpus: 2} will result in a sort key of \u0027ram:asc, disk:asc, vcpus:asc\u0027. \n\n2. flair \u003d {\u0027ram: 2048\u0027} will result in a sort key of \u0027ram:asc\u0027. The other keys don\u0027t matter here for the sort since the output isn\u0027t constrained by them. \n\nBasically, someone using find_min_match() shouldn\u0027t care about what keys are used internally for sorting when invoking the function. They just expect a minimum match given the constraints.","commit_id":"9d215de4f4f13cd5c664b41164fef4b769f7b870"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b1945e7a1d73b7c7a51194b92e4fb65af1f20c24","unresolved":false,"context_lines":[{"line_number":305,"context_line":"                flair[i] \u003d getattr(parsed_args, i, None)"},{"line_number":306,"context_line":""},{"line_number":307,"context_line":"        flavors \u003d []"},{"line_number":308,"context_line":"        if len(flair) \u003e 0:"},{"line_number":309,"context_line":"            # Grab all flavors to do the filtering"},{"line_number":310,"context_line":"            flavors \u003d compute_client.flavors.list("},{"line_number":311,"context_line":"                is_public\u003dis_public,"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_e8d79b22","line":308,"updated":"2018-06-08 14:32:39.000000000","message":"There is a more efficient way to do this for ram and disk, the GET /flavors API has filter parameters for minRam and minDisk:\n\nhttps://developer.openstack.org/api-ref/compute/#list-flavors\n\nsame with GET /flavors/detail.\n\nUnfortunately we don\u0027t have the same filter parameter for minCpu but you could at least use the existing filter parameters if --vcpus isn\u0027t specified but one or both of the others are.","commit_id":"aa9f2b3fdae976335533405e53361d79a32cf34d"}],"openstackclient/compute/v2/server.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"72947d6c40d589fe00283f1f216463cd86388e6d","unresolved":false,"context_lines":[{"line_number":587,"context_line":"        if parsed_args.flavor is None and len(flair) \u003e 0:"},{"line_number":588,"context_line":"            # Grab all flavors to do the filtering"},{"line_number":589,"context_line":"            flavors \u003d compute_client.flavors.list()"},{"line_number":590,"context_line":"            data \u003d utils.find_min_match("},{"line_number":591,"context_line":"                flavors,"},{"line_number":592,"context_line":"                # TODO(dtroyer): Need to work out a sort method"},{"line_number":593,"context_line":"                \u0027ram\u0027,"},{"line_number":594,"context_line":"                **flair"},{"line_number":595,"context_line":"            )"},{"line_number":596,"context_line":"            flavor \u003d data[0]"},{"line_number":597,"context_line":"            self.log.info(\"Selected flavor %s\" % flavor.name)"},{"line_number":598,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":6,"id":"ff0f0b1f_c168d188","line":595,"range":{"start_line":590,"start_character":12,"end_line":595,"end_character":13},"updated":"2017-05-25 19:14:58.000000000","message":"seems like this is incomplete?","commit_id":"35f4fa59b4eb6f634a3bdb7ba12cfca7e39ffa94"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b1945e7a1d73b7c7a51194b92e4fb65af1f20c24","unresolved":false,"context_lines":[{"line_number":593,"context_line":""},{"line_number":594,"context_line":"        flavors \u003d []"},{"line_number":595,"context_line":"        if parsed_args.flavor is None and len(flair) \u003e 0:"},{"line_number":596,"context_line":"            # Grab all flavors to do the filtering"},{"line_number":597,"context_line":"            flavors \u003d compute_client.flavors.list()"},{"line_number":598,"context_line":"            sort_attr \u003d \u0027,\u0027.join([k + \u0027:asc\u0027 for k in flair])"},{"line_number":599,"context_line":"            data \u003d utils.find_min_match("}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_c8897f26","line":596,"updated":"2018-06-08 14:32:39.000000000","message":"same comments as before, plus this could probably be in a common utility method","commit_id":"aa9f2b3fdae976335533405e53361d79a32cf34d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e398f2b19437c88c385f283c78cc2b8b911be8b9","unresolved":false,"context_lines":[{"line_number":596,"context_line":"            # Grab all flavors to do the filtering"},{"line_number":597,"context_line":"            flavors \u003d compute_client.flavors.list()"},{"line_number":598,"context_line":"            sort_attr \u003d \u0027,\u0027.join([k + \u0027:asc\u0027 for k in flair])"},{"line_number":599,"context_line":"            data \u003d utils.find_min_match("},{"line_number":600,"context_line":"                flavors,"},{"line_number":601,"context_line":"                # TODO(dtroyer): Need to work out a sort method"},{"line_number":602,"context_line":"                sort_attr\u003dsort_attr,"},{"line_number":603,"context_line":"                **flair"},{"line_number":604,"context_line":"            )"},{"line_number":605,"context_line":"            flavor \u003d data[0]"},{"line_number":606,"context_line":"            self.log.info(\"Selected flavor %s\" % flavor.name)"},{"line_number":607,"context_line":"        else:"},{"line_number":608,"context_line":"            # Lookup parsed_args.flavor"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_a8b203e4","line":605,"range":{"start_line":599,"start_character":12,"end_line":605,"end_character":28},"updated":"2018-06-08 14:33:12.000000000","message":"What if no match is found? Does find_min_match raise an error?","commit_id":"aa9f2b3fdae976335533405e53361d79a32cf34d"}]}
