def do_group_type_key(cs, args): """Sets or unsets group_spec for a group type.""" gtype = shell_utils.find_group_type(cs, args.gtype) keypair = shell_utils.extract_metadata(args) if args.action == 'set': gtype.set_keys(keypair) elif args.action == 'unset': gtype.unset_keys(list(keypair))
def do_metadata(cs, args): """Sets or deletes volume metadata.""" volume = utils.find_volume(cs, args.volume) metadata = shell_utils.extract_metadata(args) if args.action == 'set': cs.volumes.set_metadata(volume, metadata) elif args.action == 'unset': # NOTE(zul): Make sure py2/py3 sorting is the same cs.volumes.delete_metadata(volume, sorted(metadata.keys(), reverse=True))
def do_create(cs, args): """Creates a volume.""" # NOTE(thingee): Backwards-compatibility with v1 args if args.display_name is not None: args.name = args.display_name if args.display_description is not None: args.description = args.display_description volume_metadata = None if args.metadata is not None: volume_metadata = shell_utils.extract_metadata(args) # NOTE(N.S.): take this piece from novaclient hints = {} if args.scheduler_hints: for hint in args.scheduler_hints: key, _sep, value = hint.partition('=') # NOTE(vish): multiple copies of same hint will # result in a list of values if key in hints: if isinstance(hints[key], six.string_types): hints[key] = [hints[key]] hints[key] += [value] else: hints[key] = value # NOTE(N.S.): end of taken piece # Keep backward compatibility with image_id, favoring explicit ID image_ref = args.image_id or args.image or args.image_ref try: group_id = args.group_id except AttributeError: group_id = None volume = cs.volumes.create(args.size, args.consisgroup_id, group_id, args.snapshot_id, args.source_volid, args.name, args.description, args.volume_type, availability_zone=args.availability_zone, imageRef=image_ref, metadata=volume_metadata, scheduler_hints=hints, source_replica=args.source_replica, multiattach=args.multiattach) info = dict() volume = cs.volumes.get(volume.id) info.update(volume._info) if 'readonly' in info['metadata']: info['readonly'] = info['metadata']['readonly'] info.pop('links', None) utils.print_dict(info)
def do_list(cs, args): """Lists all volumes.""" # NOTE(thingee): Backwards-compatibility with v1 args if args.display_name is not None: args.name = args.display_name all_tenants = 1 if args.tenant else \ int(os.environ.get("ALL_TENANTS", args.all_tenants)) search_opts = { 'all_tenants': all_tenants, 'project_id': args.tenant, 'name': args.name, 'status': args.status, 'bootable': args.bootable, 'migration_status': args.migration_status, 'metadata': shell_utils.extract_metadata(args) if args.metadata else None, 'glance_metadata': shell.utils.extract_metadata(args, type='image_metadata') if args.image_metadata else None, } # If unavailable/non-existent fields are specified, these fields will # be removed from key_list at the print_list() during key validation. field_titles = [] if args.fields: for field_title in args.fields.split(','): field_titles.append(field_title) # --sort_key and --sort_dir deprecated in kilo and is not supported # with --sort if args.sort and (args.sort_key or args.sort_dir): raise exceptions.CommandError( 'The --sort_key and --sort_dir arguments are deprecated and are ' 'not supported with --sort.') volumes = cs.volumes.list(search_opts=search_opts, marker=args.marker, limit=args.limit, sort_key=args.sort_key, sort_dir=args.sort_dir, sort=args.sort) shell_utils.translate_volume_keys(volumes) # Create a list of servers to which the volume is attached for vol in volumes: servers = [s.get('server_id') for s in vol.attachments] setattr(vol, 'attached_to', ','.join(map(str, servers))) if field_titles: key_list = ['ID'] + field_titles else: key_list = ['ID', 'Status', 'Name', 'Size', 'Volume Type', 'Bootable', 'Attached to'] # If all_tenants is specified, print # Tenant ID as well. if search_opts['all_tenants']: key_list.insert(1, 'Tenant ID') if args.sort_key or args.sort_dir or args.sort: sortby_index = None else: sortby_index = 0 utils.print_list(volumes, key_list, exclude_unavailable=True, sortby_index=sortby_index)
def do_list(cs, args): """Lists all volumes.""" # NOTE(thingee): Backwards-compatibility with v1 args if args.display_name is not None: args.name = args.display_name all_tenants = 1 if args.tenant else \ int(os.environ.get("ALL_TENANTS", args.all_tenants)) search_opts = { 'all_tenants': all_tenants, 'project_id': args.tenant, 'name': args.name, 'status': args.status, 'bootable': args.bootable, 'migration_status': args.migration_status, 'metadata': shell_utils.extract_metadata(args) if args.metadata else None, 'glance_metadata': shell.utils.extract_metadata(args, type='image_metadata') if args.image_metadata else None, } # If unavailable/non-existent fields are specified, these fields will # be removed from key_list at the print_list() during key validation. field_titles = [] if args.fields: for field_title in args.fields.split(','): field_titles.append(field_title) # --sort_key and --sort_dir deprecated in kilo and is not supported # with --sort if args.sort and (args.sort_key or args.sort_dir): raise exceptions.CommandError( 'The --sort_key and --sort_dir arguments are deprecated and are ' 'not supported with --sort.') volumes = cs.volumes.list(search_opts=search_opts, marker=args.marker, limit=args.limit, sort_key=args.sort_key, sort_dir=args.sort_dir, sort=args.sort) shell_utils.translate_volume_keys(volumes) # Create a list of servers to which the volume is attached for vol in volumes: servers = [s.get('server_id') for s in vol.attachments] setattr(vol, 'attached_to', ','.join(map(str, servers))) if field_titles: key_list = ['ID'] + field_titles else: key_list = [ 'ID', 'Status', 'Name', 'Size', 'Volume Type', 'Bootable', 'Attached to' ] # If all_tenants is specified, print # Tenant ID as well. if search_opts['all_tenants']: key_list.insert(1, 'Tenant ID') if args.sort_key or args.sort_dir or args.sort: sortby_index = None else: sortby_index = 0 utils.print_list(volumes, key_list, exclude_unavailable=True, sortby_index=sortby_index)