def take_action(self, parsed_args): self.log.debug("take_action(%s)" % parsed_args) client = self.app.client_manager.baremetal columns = res_fields.NODE_RESOURCE params = {} if parsed_args.limit is not None and parsed_args.limit < 0: raise exc.CommandError( _('Expected non-negative --limit, got %s') % parsed_args.limit) params['limit'] = parsed_args.limit params['marker'] = parsed_args.marker if parsed_args.associated: params['associated'] = parsed_args.associated if parsed_args.maintenance: params['maintenance'] = parsed_args.maintenance if parsed_args.long: columns = res_fields.NODE_DETAILED_RESOURCE params['detail'] = parsed_args.long self.log.debug("params(%s)" % params) data = client.node.list(**params) data = oscutils.sort_items(data, parsed_args.sort) return (columns.labels, (oscutils.get_item_properties( s, columns.fields, formatters={'Properties': oscutils.format_dict}, ) for s in data))
def take_action(self, parsed_args): self.log.debug("take_action(%s)" % parsed_args) client = self.app.client_manager.baremetal columns = res_fields.NODE_RESOURCE params = {} if parsed_args.limit is not None and parsed_args.limit < 0: raise exc.CommandError( _('Expected non-negative --limit, got %s') % parsed_args.limit) params['limit'] = parsed_args.limit params['marker'] = parsed_args.marker if parsed_args.associated: params['associated'] = parsed_args.associated if parsed_args.maintenance: params['maintenance'] = parsed_args.maintenance if parsed_args.long: columns = res_fields.NODE_DETAILED_RESOURCE params['detail'] = parsed_args.long self.log.debug("params(%s)" % params) data = client.node.list(**params) data = oscutils.sort_items(data, parsed_args.sort) return (columns.labels, (oscutils.get_item_properties(s, columns.fields, formatters={ 'Properties': oscutils.format_dict},) for s in data))
def test_sort_items_with_object(self): item1 = mock.Mock(a=1, b=2) item2 = mock.Mock(a=1, b=3) item3 = mock.Mock(a=2, b=2) item4 = mock.Mock(a=2, b=1) items = [item1, item2, item3, item4] sort_str = 'b,a' expect_items = [item4, item1, item3, item2] self.assertEqual(expect_items, utils.sort_items(items, sort_str))
def test_sort_items_with_object(self): item1 = mock.Mock(a=1, b=2) item2 = mock.Mock(a=1, b=3) item3 = mock.Mock(a=2, b=2) item4 = mock.Mock(a=2, b=1) items = [item1, item2, item3, item4] sort_str = "b,a" expect_items = [item4, item1, item3, item2] self.assertEqual(expect_items, utils.sort_items(items, sort_str))
def _list(client, args=None): kwargs = {} columns = [ 'ID', 'Stack Name', 'Stack Status', 'Creation Time', 'Updated Time', ] if args: kwargs = {'limit': args.limit, 'marker': args.marker, 'filters': heat_utils.format_parameters(args.properties), 'tags': None, 'tags_any': None, 'not_tags': None, 'not_tags_any': None, 'global_tenant': args.all_projects or args.long, 'show_deleted': args.deleted, 'show_hidden': args.hidden} if args.tags: if args.tag_mode: if args.tag_mode == 'any': kwargs['tags_any'] = args.tags elif args.tag_mode == 'not': kwargs['not_tags'] = args.tags elif args.tag_mode == 'not-any': kwargs['not_tags_any'] = args.tags else: err = _('tag mode must be one of "any", "not", "not-any"') raise exc.CommandError(err) else: kwargs['tags'] = args.tags if args.short: columns.pop() columns.pop() if args.long: columns.insert(2, 'Stack Owner') if args.long or args.all_projects: columns.insert(2, 'Project') if args.nested: columns.append('Parent') kwargs['show_nested'] = True data = client.stacks.list(**kwargs) data = utils.sort_items(data, args.sort if args else None) return ( columns, (utils.get_item_properties(s, columns) for s in data) )
def take_action(self, parsed_args): self.log.debug("take_action(%s)" % parsed_args) client = self.app.client_manager.baremetal columns = res_fields.NODE_RESOURCE.fields labels = res_fields.NODE_RESOURCE.labels params = {} if parsed_args.limit is not None and parsed_args.limit < 0: raise exc.CommandError( _('Expected non-negative --limit, got %s') % parsed_args.limit) params['limit'] = parsed_args.limit params['marker'] = parsed_args.marker if parsed_args.associated: params['associated'] = parsed_args.associated if parsed_args.maintenance: params['maintenance'] = parsed_args.maintenance if parsed_args.provision_state: params['provision_state'] = parsed_args.provision_state if parsed_args.long: params['detail'] = parsed_args.long columns = res_fields.NODE_DETAILED_RESOURCE.fields labels = res_fields.NODE_DETAILED_RESOURCE.labels elif parsed_args.fields: params['detail'] = False fields = itertools.chain.from_iterable(parsed_args.fields) resource = res_fields.Resource(list(fields)) columns = resource.fields labels = resource.labels params['fields'] = columns self.log.debug("params(%s)" % params) data = client.node.list(**params) data = oscutils.sort_items(data, parsed_args.sort) return (labels, (oscutils.get_item_properties(s, columns, formatters={ 'Properties': oscutils.format_dict},) for s in data))
def test_sort_items_some_with_direction(self): items = self.get_test_items() sort_str = "a,b:desc" expect_items = [items[1], items[0], items[2], items[3]] self.assertEqual(expect_items, utils.sort_items(items, sort_str))
def test_sort_items_with_multiple_keys(self): items = self.get_test_items() sort_str = "a,b" expect_items = [items[0], items[1], items[3], items[2]] self.assertEqual(expect_items, utils.sort_items(items, sort_str))
def test_sort_items_with_one_key(self): items = self.get_test_items() sort_str = "b" expect_items = [items[3], items[0], items[2], items[1]] self.assertEqual(expect_items, utils.sort_items(items, sort_str))
def test_sort_items_with_empty_key(self): items = self.get_test_items() sort_srt = "" self.assertEqual(items, utils.sort_items(items, sort_srt)) sort_srt = None self.assertEqual(items, utils.sort_items(items, sort_srt))
def take_action(self, parsed_args): self.log.debug("take_action(%s)", parsed_args) image_client = self.app.client_manager.image kwargs = {} if parsed_args.public: kwargs['public'] = True if parsed_args.private: kwargs['private'] = True kwargs['detailed'] = bool(parsed_args.property or parsed_args.long) if parsed_args.long: columns = ( 'ID', 'Name', 'Disk Format', 'Container Format', 'Size', 'Status', 'is_public', 'protected', 'owner', 'properties', ) column_headers = ( 'ID', 'Name', 'Disk Format', 'Container Format', 'Size', 'Status', 'Visibility', 'Protected', 'Owner', 'Properties', ) else: columns = ("ID", "Name") column_headers = columns data = image_client.api.image_list(**kwargs) if parsed_args.property: # NOTE(dtroyer): coerce to a list to subscript it in py3 attr, value = list(parsed_args.property.items())[0] api_utils.simple_filter( data, attr=attr, value=value, property_field='properties', ) data = utils.sort_items(data, parsed_args.sort) return (column_headers, (utils.get_dict_properties( s, columns, formatters={ 'is_public': _format_visibility, 'properties': utils.format_dict, }, ) for s in data))
def take_action(self, parsed_args): self.log.debug('take_action(%s)', parsed_args) client = self.app.client_manager.orchestration columns = [ 'id', 'resource_status', 'resource_status_reason', 'event_time', 'physical_resource_id' ] kwargs = { 'resource_name': parsed_args.resource, 'limit': parsed_args.limit, 'marker': parsed_args.marker, 'filters': heat_utils.format_parameters(parsed_args.filter), 'sort_dir': 'asc' } if parsed_args.resource and parsed_args.nested_depth: msg = _('--nested-depth cannot be specified with --resource') raise exc.CommandError(msg) if parsed_args.nested_depth: # Until the API supports recursive event listing we'll have to do # the marker/limit filtering client-side del kwargs['marker'] del kwargs['limit'] columns.append('stack_name') nested_depth = parsed_args.nested_depth else: nested_depth = 0 if parsed_args.follow: if parsed_args.formatter != 'value': msg = _('--follow can only be specified with --format value') raise exc.CommandError(msg) marker = parsed_args.marker try: while True: kwargs['marker'] = marker events = event_utils.get_events(client, stack_id=parsed_args.stack, event_args=kwargs, nested_depth=nested_depth, marker=marker) if events: marker = getattr(events[-1], 'id', None) events_log = heat_utils.event_log_formatter(events) self.app.stdout.write(events_log) self.app.stdout.write('\n') time.sleep(5) # this loop never exits except (KeyboardInterrupt, EOFError): # ctrl-c, ctrl-d return [], [] events = event_utils.get_events(client, stack_id=parsed_args.stack, event_args=kwargs, nested_depth=nested_depth, marker=parsed_args.marker, limit=parsed_args.limit) if parsed_args.sort: events = utils.sort_items(events, ','.join(parsed_args.sort)) if parsed_args.formatter == 'value': events = heat_utils.event_log_formatter(events).split('\n') return [], [e.split(' ') for e in events] if len(events): if hasattr(events[0], 'resource_name'): columns.insert(0, 'resource_name') columns.append('logical_resource_id') else: columns.insert(0, 'logical_resource_id') return (columns, (utils.get_item_properties(s, columns) for s in events))
def take_action(self, parsed_args): image_client = self.app.client_manager.image kwargs = {} if parsed_args.public: kwargs['public'] = True if parsed_args.private: kwargs['private'] = True if parsed_args.shared: kwargs['shared'] = True if parsed_args.limit: kwargs['limit'] = parsed_args.limit if parsed_args.marker: kwargs['marker'] = utils.find_resource(image_client.images, parsed_args.marker).id if parsed_args.long: columns = ( 'ID', 'Name', 'Disk Format', 'Container Format', 'Size', 'Status', 'visibility', 'protected', 'owner', 'tags', ) column_headers = ( 'ID', 'Name', 'Disk Format', 'Container Format', 'Size', 'Status', 'Visibility', 'Protected', 'Project', 'Tags', ) else: columns = ("ID", "Name", "Status") column_headers = columns # List of image data received data = image_client.api.image_list(**kwargs) if parsed_args.property: # NOTE(dtroyer): coerce to a list to subscript it in py3 attr, value = list(parsed_args.property.items())[0] api_utils.simple_filter( data, attr=attr, value=value, property_field='properties', ) data = utils.sort_items(data, parsed_args.sort) return ( column_headers, (utils.get_dict_properties( s, columns, formatters={ 'tags': utils.format_list, }, ) for s in data) )
def take_action(self, parsed_args): self.log.debug("take_action(%s)", parsed_args) image_client = self.app.client_manager.image kwargs = {} if parsed_args.public: kwargs['public'] = True if parsed_args.private: kwargs['private'] = True if parsed_args.shared: kwargs['shared'] = True if parsed_args.long: columns = ( 'ID', 'Name', 'Disk Format', 'Container Format', 'Size', 'Status', 'visibility', 'protected', 'owner', 'tags', ) column_headers = ( 'ID', 'Name', 'Disk Format', 'Container Format', 'Size', 'Status', 'Visibility', 'Protected', 'Owner', 'Tags', ) else: columns = ("ID", "Name") column_headers = columns # List of image data received data = [] # No pages received yet, so start the page marker at None. marker = None while True: page = image_client.api.image_list(marker=marker, **kwargs) if not page: break data.extend(page) # Set the marker to the id of the last item we received marker = page[-1]['id'] if parsed_args.property: # NOTE(dtroyer): coerce to a list to subscript it in py3 attr, value = list(parsed_args.property.items())[0] api_utils.simple_filter( data, attr=attr, value=value, property_field='properties', ) data = utils.sort_items(data, parsed_args.sort) return (column_headers, (utils.get_dict_properties( s, columns, formatters={ 'tags': utils.format_dict, }, ) for s in data))
def take_action(self, parsed_args): self.log.debug("take_action(%s)", parsed_args) image_client = self.app.client_manager.image kwargs = {} if parsed_args.public: kwargs['public'] = True if parsed_args.private: kwargs['private'] = True if parsed_args.shared: kwargs['shared'] = True if parsed_args.long: columns = ( 'ID', 'Name', 'Disk Format', 'Container Format', 'Size', 'Status', 'visibility', 'protected', 'owner', 'tags', ) column_headers = ( 'ID', 'Name', 'Disk Format', 'Container Format', 'Size', 'Status', 'Visibility', 'Protected', 'Owner', 'Tags', ) else: columns = ("ID", "Name") column_headers = columns # List of image data received data = [] # No pages received yet, so start the page marker at None. marker = None while True: page = image_client.api.image_list(marker=marker, **kwargs) if not page: break data.extend(page) # Set the marker to the id of the last item we received marker = page[-1]['id'] if parsed_args.property: # NOTE(dtroyer): coerce to a list to subscript it in py3 attr, value = list(parsed_args.property.items())[0] api_utils.simple_filter( data, attr=attr, value=value, property_field='properties', ) data = utils.sort_items(data, parsed_args.sort) return ( column_headers, (utils.get_dict_properties( s, columns, formatters={ 'tags': utils.format_list, }, ) for s in data) )
def take_action(self, parsed_args): self.log.debug('take_action(%s)', parsed_args) client = self.app.client_manager.orchestration columns = ['id', 'resource_status', 'resource_status_reason', 'event_time', 'physical_resource_id'] kwargs = { 'resource_name': parsed_args.resource, 'limit': parsed_args.limit, 'marker': parsed_args.marker, 'filters': heat_utils.format_parameters(parsed_args.filter), 'sort_dir': 'asc' } if parsed_args.resource and parsed_args.nested_depth: msg = _('--nested-depth cannot be specified with --resource') raise exc.CommandError(msg) if parsed_args.nested_depth: # Until the API supports recursive event listing we'll have to do # the marker/limit filtering client-side del kwargs['marker'] del kwargs['limit'] columns.append('stack_name') nested_depth = parsed_args.nested_depth else: nested_depth = 0 if parsed_args.follow: if parsed_args.formatter != 'value': msg = _('--follow can only be specified with --format value') raise exc.CommandError(msg) marker = parsed_args.marker try: while True: kwargs['marker'] = marker events = event_utils.get_events( client, stack_id=parsed_args.stack, event_args=kwargs, nested_depth=nested_depth, marker=marker) if events: marker = getattr(events[-1], 'id', None) events_log = heat_utils.event_log_formatter(events) self.app.stdout.write(events_log) self.app.stdout.write('\n') time.sleep(5) # this loop never exits except (KeyboardInterrupt, EOFError): # ctrl-c, ctrl-d return [], [] events = event_utils.get_events( client, stack_id=parsed_args.stack, event_args=kwargs, nested_depth=nested_depth, marker=parsed_args.marker, limit=parsed_args.limit) if parsed_args.sort: events = utils.sort_items(events, ','.join(parsed_args.sort)) if parsed_args.formatter == 'value': events = heat_utils.event_log_formatter(events).split('\n') return [], [e.split(' ') for e in events] if len(events): if hasattr(events[0], 'resource_name'): columns.insert(0, 'resource_name') columns.append('logical_resource_id') else: columns.insert(0, 'logical_resource_id') return ( columns, (utils.get_item_properties(s, columns) for s in events) )
def test_sort_items_with_empty_key(self): items = self.get_test_items() sort_srt = '' self.assertEqual(items, utils.sort_items(items, sort_srt)) sort_srt = None self.assertEqual(items, utils.sort_items(items, sort_srt))
def test_sort_items_all_with_direction(self): items = self.get_test_items() sort_str = 'a:desc,b:desc' expect_items = [items[2], items[3], items[1], items[0]] self.assertEqual(expect_items, utils.sort_items(items, sort_str))
def test_sort_items_with_multiple_keys(self): items = self.get_test_items() sort_str = 'a,b' expect_items = [items[0], items[1], items[3], items[2]] self.assertEqual(expect_items, utils.sort_items(items, sort_str))
def test_sort_items_with_one_key(self): items = self.get_test_items() sort_str = 'b' expect_items = [items[3], items[0], items[2], items[1]] self.assertEqual(expect_items, utils.sort_items(items, sort_str))
def take_action(self, parsed_args): self.log.debug("take_action(%s)", parsed_args) image_client = self.app.client_manager.image kwargs = {} if parsed_args.public: kwargs['public'] = True if parsed_args.private: kwargs['private'] = True # Note: We specifically need to do that below to get the 'status' # column. # # Always set kwargs['detailed'] to True, and then filter the columns # according to whether the --long option is specified or not. kwargs['detailed'] = True if parsed_args.long: columns = ( 'ID', 'Name', 'Disk Format', 'Container Format', 'Size', 'Status', 'is_public', 'protected', 'owner', 'properties', ) column_headers = ( 'ID', 'Name', 'Disk Format', 'Container Format', 'Size', 'Status', 'Visibility', 'Protected', 'Owner', 'Properties', ) else: columns = ("ID", "Name", "Status") column_headers = columns # List of image data received data = [] # No pages received yet, so start the page marker at None. marker = None while True: page = image_client.api.image_list(marker=marker, **kwargs) if not page: break data.extend(page) # Set the marker to the id of the last item we received marker = page[-1]['id'] if parsed_args.property: # NOTE(dtroyer): coerce to a list to subscript it in py3 attr, value = list(parsed_args.property.items())[0] api_utils.simple_filter( data, attr=attr, value=value, property_field='properties', ) data = utils.sort_items(data, parsed_args.sort) return ( column_headers, (utils.get_dict_properties( s, columns, formatters={ 'is_public': _format_visibility, 'properties': utils.format_dict, }, ) for s in data) )
def take_action(self, parsed_args): self.log.debug("take_action(%s)", parsed_args) image_client = self.app.client_manager.image kwargs = {} if parsed_args.public: kwargs['public'] = True if parsed_args.private: kwargs['private'] = True kwargs['detailed'] = bool(parsed_args.property or parsed_args.long) if parsed_args.long: columns = ( 'ID', 'Name', 'Disk Format', 'Container Format', 'Size', 'Status', 'is_public', 'protected', 'owner', 'properties', ) column_headers = ( 'ID', 'Name', 'Disk Format', 'Container Format', 'Size', 'Status', 'Visibility', 'Protected', 'Owner', 'Properties', ) else: columns = ("ID", "Name") column_headers = columns data = image_client.api.image_list(**kwargs) if parsed_args.property: # NOTE(dtroyer): coerce to a list to subscript it in py3 attr, value = list(parsed_args.property.items())[0] api_utils.simple_filter( data, attr=attr, value=value, property_field='properties', ) data = utils.sort_items(data, parsed_args.sort) return ( column_headers, (utils.get_dict_properties( s, columns, formatters={ 'is_public': _format_visibility, 'properties': utils.format_dict, }, ) for s in data) )
def take_action(self, parsed_args): self.log.debug("take_action(%s)", parsed_args) image_client = self.app.client_manager.image kwargs = {} if parsed_args.public: kwargs["public"] = True if parsed_args.private: kwargs["private"] = True kwargs["detailed"] = bool(parsed_args.property or parsed_args.long) if parsed_args.long: columns = ( "ID", "Name", "Disk Format", "Container Format", "Size", "Status", "is_public", "protected", "owner", "properties", ) column_headers = ( "ID", "Name", "Disk Format", "Container Format", "Size", "Status", "Visibility", "Protected", "Owner", "Properties", ) else: columns = ("ID", "Name") column_headers = columns # List of image data received data = [] # No pages received yet, so start the page marker at None. marker = None while True: page = image_client.api.image_list(marker=marker, **kwargs) if not page: break data.extend(page) # Set the marker to the id of the last item we received marker = page[-1]["id"] if parsed_args.property: # NOTE(dtroyer): coerce to a list to subscript it in py3 attr, value = list(parsed_args.property.items())[0] api_utils.simple_filter(data, attr=attr, value=value, property_field="properties") data = utils.sort_items(data, parsed_args.sort) return ( column_headers, ( utils.get_dict_properties( s, columns, formatters={"is_public": _format_visibility, "properties": utils.format_dict} ) for s in data ), )