def take_action_compute(self, client, parsed_args):
     group = utils.find_resource(
         client.security_groups,
         parsed_args.group,
     )
     protocol = self._get_protocol(parsed_args)
     if protocol == 'icmp':
         from_port, to_port = -1, -1
     else:
         from_port, to_port = parsed_args.dst_port
     src_ip = None
     if parsed_args.src_group is not None:
         parsed_args.src_group = utils.find_resource(
             client.security_groups,
             parsed_args.src_group,
         ).id
     if parsed_args.src_ip is not None:
         src_ip = parsed_args.src_ip
     else:
         src_ip = '0.0.0.0/0'
     obj = client.security_group_rules.create(
         group.id,
         protocol,
         from_port,
         to_port,
         src_ip,
         parsed_args.src_group,
     )
     return _format_security_group_rule_show(obj._info)
예제 #2
0
    def take_action(self, parsed_args):
        identity_client = self.app.client_manager.identity
        if parsed_args.long:
            columns = ('ID', 'Name', 'Domain ID', 'Description', 'Enabled')
        else:
            columns = ('ID', 'Name')
        kwargs = {}

        domain_id = None
        if parsed_args.domain:
            domain_id = common.find_domain(identity_client,
                                           parsed_args.domain).id
            kwargs['domain'] = domain_id

        if parsed_args.user:
            if parsed_args.domain:
                user_id = utils.find_resource(identity_client.users,
                                              parsed_args.user,
                                              domain_id=domain_id).id
            else:
                user_id = utils.find_resource(identity_client.users,
                                              parsed_args.user).id

            kwargs['user'] = user_id

        data = identity_client.projects.list(**kwargs)
        return (columns,
                (utils.get_item_properties(
                    s, columns,
                    formatters={},
                ) for s in data))
예제 #3
0
    def take_action(self, parsed_args):
        identity_client = self.app.client_manager.identity

        project_str = common._get_token_resource(identity_client, "project", parsed_args.project)

        if parsed_args.domain:
            domain = common.find_domain(identity_client, parsed_args.domain)
            project = utils.find_resource(
                identity_client.projects,
                project_str,
                domain_id=domain.id,
                parents_as_list=parsed_args.parents,
                subtree_as_list=parsed_args.children,
            )
        else:
            project = utils.find_resource(
                identity_client.projects,
                project_str,
                parents_as_list=parsed_args.parents,
                subtree_as_list=parsed_args.children,
            )

        if project._info.get("parents"):
            project._info["parents"] = [str(p["project"]["id"]) for p in project._info["parents"]]
        if project._info.get("subtree"):
            project._info["subtree"] = [str(p["project"]["id"]) for p in project._info["subtree"]]

        project._info.pop("links")
        return zip(*sorted(six.iteritems(project._info)))
예제 #4
0
    def take_action(self, parsed_args):
        identity_client = self.app.client_manager.identity
        client_manager = self.app.client_manager
        user = _determine_ec2_user(parsed_args, client_manager)

        project_domain = None
        if parsed_args.project_domain:
            project_domain = common.find_domain(identity_client,
                                                parsed_args.project_domain)

        if parsed_args.project:
            if project_domain is not None:
                project = utils.find_resource(identity_client.projects,
                                              parsed_args.project,
                                              domain_id=project_domain.id).id
            else:
                project = utils.find_resource(
                    identity_client.projects,
                    parsed_args.project).id
        else:
            # Get the project from the current auth
            project = self.app.client_manager.auth_ref.project_id

        creds = identity_client.ec2.create(user, project)

        info = {}
        info.update(creds._info)

        if 'tenant_id' in info:
            info.update(
                {'project_id': info.pop('tenant_id')}
            )

        return zip(*sorted(six.iteritems(info)))
예제 #5
0
def _determine_ec2_user(parsed_args, client_manager):
    """Determine a user several different ways.

    Assumes parsed_args has user and user_domain arguments. Attempts to find
    the user if domain scoping is provided, otherwise revert to a basic user
    call. Lastly use the currently authenticated user.

    """

    user_domain = None
    if parsed_args.user_domain:
        user_domain = common.find_domain(client_manager.identity,
                                         parsed_args.user_domain)
    if parsed_args.user:
        if user_domain is not None:
            user = utils.find_resource(client_manager.identity.users,
                                       parsed_args.user,
                                       domain_id=user_domain.id).id
        else:
            user = utils.find_resource(
                client_manager.identity.users,
                parsed_args.user).id
    else:
        # Get the user from the current auth
        user = client_manager.auth_ref.user_id
    return user
예제 #6
0
    def take_action(self, parsed_args):
        identity_client = self.app.client_manager.identity

        if parsed_args.project:
            project = utils.find_resource(
                identity_client.tenants,
                parsed_args.project,
            ).id
        else:
            # Get the project from the current auth
            project = self.app.client_manager.auth_ref.project_id
        if parsed_args.user:
            user = utils.find_resource(
                identity_client.users,
                parsed_args.user,
            ).id
        else:
            # Get the user from the current auth
            user = self.app.client_manager.auth_ref.user_id

        creds = identity_client.ec2.create(user, project)

        info = {}
        info.update(creds._info)

        if 'tenant_id' in info:
            info.update(
                {'project_id': info.pop('tenant_id')}
            )

        return zip(*sorted(six.iteritems(info)))
    def _image_ids(self):
        if self.__kernel_id is not None and self.__ramdisk_id is not None:
            return self.__kernel_id, self.__ramdisk_id

        image_client = self.app.client_manager.image
        kernel_id, ramdisk_id = None, None
        try:
            kernel_id = osc_utils.find_resource(
                image_client.images, 'bm-deploy-kernel').id
        except AttributeError:
            self.log.exception("Please make sure there is only one image "
                               "named 'bm-deploy-kernel' in glance.")
        except oscexc.CommandError:
            # kernel_id=None will be returned and an error will be logged from
            # self._check_boot_images
            pass

        try:
            ramdisk_id = osc_utils.find_resource(
                image_client.images, 'bm-deploy-ramdisk').id
        except AttributeError:
            self.log.exception("Please make sure there is only one image "
                               "named 'bm-deploy-ramdisk' in glance.")
        except oscexc.CommandError:
            # ramdisk_id=None will be returned and an error will be logged from
            # self._check_boot_images
            pass

        self.log.debug("Using kernel ID: {0} and ramdisk ID: {1}".format(
            kernel_id, ramdisk_id))

        self.__kernel_id = kernel_id
        self.__ramdisk_id = ramdisk_id
        return kernel_id, ramdisk_id
예제 #8
0
    def take_action(self, parsed_args):
        identity_client = self.app.client_manager.identity

        project_str = common._get_token_resource(identity_client, 'project',
                                                 parsed_args.project)

        if parsed_args.domain:
            domain = common.find_domain(identity_client, parsed_args.domain)
            project = utils.find_resource(
                identity_client.projects,
                project_str,
                domain_id=domain.id,
                parents_as_list=parsed_args.parents,
                subtree_as_list=parsed_args.children)
        else:
            project = utils.find_resource(
                identity_client.projects,
                project_str,
                parents_as_list=parsed_args.parents,
                subtree_as_list=parsed_args.children)

        if project._info.get('parents'):
            project._info['parents'] = [str(p['project']['id'])
                                        for p in project._info['parents']]
        if project._info.get('subtree'):
            project._info['subtree'] = [str(p['project']['id'])
                                        for p in project._info['subtree']]

        project._info.pop('links')
        return zip(*sorted(six.iteritems(project._info)))
예제 #9
0
    def take_action(self, parsed_args):
        identity_client = self.app.client_manager.identity

        domain = None
        if parsed_args.domain:
            domain = common.find_domain(identity_client, parsed_args.domain)
        errors = 0
        for user in parsed_args.users:
            try:
                if domain is not None:
                    user_obj = utils.find_resource(identity_client.users,
                                                   user,
                                                   domain_id=domain.id)
                else:
                    user_obj = utils.find_resource(identity_client.users,
                                                   user)
                identity_client.users.delete(user_obj.id)
            except Exception as e:
                errors += 1
                LOG.error(_("Failed to delete user with "
                          "name or ID '%(user)s': %(e)s"),
                          {'user': user, 'e': e})

        if errors > 0:
            total = len(parsed_args.users)
            msg = (_("%(errors)s of %(total)s users failed "
                   "to delete.") % {'errors': errors, 'total': total})
            raise exceptions.CommandError(msg)
예제 #10
0
    def take_action(self, parsed_args):
        compute_client = self.app.client_manager.compute

        server = utils.find_resource(
            compute_client.servers,
            parsed_args.server,
        )

        # Set sane defaults as this API wants all mouths to be fed
        if parsed_args.name is None:
            backup_name = server.name
        else:
            backup_name = parsed_args.name
        if parsed_args.type is None:
            backup_type = ""
        else:
            backup_type = parsed_args.type
        if parsed_args.rotate is None:
            backup_rotation = 1
        else:
            backup_rotation = parsed_args.rotate

        compute_client.servers.backup(
            server.id,
            backup_name,
            backup_type,
            backup_rotation,
        )

        image_client = self.app.client_manager.image
        image = utils.find_resource(
            image_client.images,
            backup_name,
        )

        if parsed_args.wait:
            if utils.wait_for_status(
                image_client.images.get,
                image.id,
                callback=_show_progress,
            ):
                sys.stdout.write('\n')
            else:
                msg = _('Error creating server backup: %s') % parsed_args.name
                raise exceptions.CommandError(msg)

        if self.app.client_manager._api_version['image'] == '1':
            info = {}
            info.update(image._info)
            info['properties'] = utils.format_dict(info.get('properties', {}))
        else:
            # Get the right image module to format the output
            image_module = importutils.import_module(
                self.IMAGE_API_VERSIONS[
                    self.app.client_manager._api_version['image']
                ]
            )
            info = image_module._format_image(image)
        return zip(*sorted(six.iteritems(info)))
    def take_action(self, parsed_args):
        volume_client = self.app.client_manager.volume
        qos_spec = utils.find_resource(volume_client.qos_specs,
                                       parsed_args.qos_spec)
        volume_type = utils.find_resource(volume_client.volume_types,
                                          parsed_args.volume_type)

        volume_client.qos_specs.associate(qos_spec.id, volume_type.id)
예제 #12
0
 def take_action(self, parsed_args):
     volume_client = self.app.client_manager.volume
     backup = utils.find_resource(volume_client.backups, parsed_args.backup)
     destination_volume = utils.find_resource(volume_client.volumes,
                                              parsed_args.volume)
     backup = volume_client.restores.restore(backup.id,
                                             destination_volume.id)
     return zip(*sorted(six.iteritems(backup._info)))
예제 #13
0
 def take_action(self, parsed_args):
     volume_client = self.app.client_manager.volume
     backup = utils.find_resource(volume_client.backups,
                                  parsed_args.backup)
     destination_volume = utils.find_resource(volume_client.volumes,
                                              parsed_args.volume)
     return volume_client.restores.restore(backup.id,
                                           destination_volume.id)
 def take_action(self, parsed_args):
     db_instances = self.app.client_manager.database.instances
     db_flavor = self.app.client_manager.database.flavors
     instance = osc_utils.find_resource(db_instances,
                                        parsed_args.instance)
     flavor = osc_utils.find_resource(db_flavor,
                                      parsed_args.flavor_id)
     db_instances.resize_instance(instance, flavor)
예제 #15
0
    def take_action(self, parsed_args):
        _check_size_arg(parsed_args)
        identity_client = self.app.client_manager.identity
        image_client = self.app.client_manager.image
        volume_client = self.app.client_manager.volume

        source_volume = None
        if parsed_args.source:
            source_volume = utils.find_resource(
                volume_client.volumes,
                parsed_args.source,
            ).id

        project = None
        if parsed_args.project:
            project = utils.find_resource(
                identity_client.tenants,
                parsed_args.project,
            ).id

        user = None
        if parsed_args.user:
            user = utils.find_resource(
                identity_client.users,
                parsed_args.user,
            ).id

        image = None
        if parsed_args.image:
            image = utils.find_resource(
                image_client.images,
                parsed_args.image,
            ).id

        snapshot = parsed_args.snapshot or parsed_args.snapshot_id

        volume = volume_client.volumes.create(
            parsed_args.size,
            snapshot,
            source_volume,
            parsed_args.name,
            parsed_args.description,
            parsed_args.type,
            user,
            project,
            parsed_args.availability_zone,
            parsed_args.property,
            image,
        )
        # Map 'metadata' column to 'properties'
        volume._info.update(
            {
                'properties': utils.format_dict(volume._info.pop('metadata')),
                'type': volume._info.pop('volume_type'),
            },
        )

        return zip(*sorted(six.iteritems(volume._info)))
예제 #16
0
    def take_action(self, parsed_args):
        volume_client = self.app.client_manager.volume

        def _format_volume_id(volume_id):
            """Return a volume name if available

            :param volume_id: a volume ID
            :rtype: either the volume ID or name
            """

            volume = volume_id
            if volume_id in volume_cache.keys():
                volume = volume_cache[volume_id].name
            return volume

        if parsed_args.long:
            columns = ['ID', 'Name', 'Description', 'Status', 'Size',
                       'Availability Zone', 'Volume ID', 'Container']
            column_headers = copy.deepcopy(columns)
            column_headers[6] = 'Volume'
        else:
            columns = ['ID', 'Name', 'Description', 'Status', 'Size']
            column_headers = columns

        # Cache the volume list
        volume_cache = {}
        try:
            for s in volume_client.volumes.list():
                volume_cache[s.id] = s
        except Exception:
            # Just forget it if there's any trouble
            pass

        filter_volume_id = None
        if parsed_args.volume:
            filter_volume_id = utils.find_resource(volume_client.volumes,
                                                   parsed_args.volume).id
        marker_backup_id = None
        if parsed_args.marker:
            marker_backup_id = utils.find_resource(volume_client.backups,
                                                   parsed_args.marker).id
        search_opts = {
            'name': parsed_args.name,
            'status': parsed_args.status,
            'volume_id': filter_volume_id,
            'all_tenants': parsed_args.all_projects,
        }
        data = volume_client.backups.list(
            search_opts=search_opts,
            marker=marker_backup_id,
            limit=parsed_args.limit,
        )

        return (column_headers,
                (utils.get_item_properties(
                    s, columns,
                    formatters={'Volume ID': _format_volume_id},
                ) for s in data))
    def take_action(self, parsed_args):
        identity_client = self.app.client_manager.identity
        auth_ref = self.app.client_manager.auth_ref

        include_names = True if parsed_args.names else False

        user = None
        if parsed_args.user:
            user = utils.find_resource(
                identity_client.users,
                parsed_args.user,
            )
        elif parsed_args.authuser:
            if auth_ref:
                user = utils.find_resource(
                    identity_client.users,
                    auth_ref.user_id
                )

        project = None
        if parsed_args.project:
            project = utils.find_resource(
                identity_client.projects,
                parsed_args.project,
            )
        elif parsed_args.authproject:
            if auth_ref:
                project = utils.find_resource(
                    identity_client.projects,
                    auth_ref.project_id
                )

        # If user or project is not specified, we would ideally list all
        # relevant assignments in the system (to be compatible with v3).
        # However, there is no easy way of doing that in v2.
        if not user or not project:
            msg = _("Project and User must be specified")
            raise exceptions.CommandError(msg)
        else:
            data = identity_client.roles.roles_for_user(user.id, project.id)

        columns = ('Role', 'User', 'Project')
        for user_role in data:
            if include_names:
                setattr(user_role, 'role', user_role.name)
                user_role.user = user.name
                user_role.project = project.name
            else:
                setattr(user_role, 'role', user_role.id)
                user_role.user = user.id
                user_role.project = project.id

        return (columns,
                (utils.get_item_properties(
                    s, columns,
                    formatters={},
                ) for s in data))
예제 #18
0
    def take_action(self, parsed_args):
        identity_client = self.app.client_manager.identity
        volume_client = self.app.client_manager.volume
        image_client = self.app.client_manager.image

        source_volume = None
        if parsed_args.source:
            source_volume = utils.find_resource(
                volume_client.volumes,
                parsed_args.source).id

        image = None
        if parsed_args.image:
            image = utils.find_resource(
                image_client.images,
                parsed_args.image).id

        snapshot = None
        if parsed_args.snapshot:
            snapshot = utils.find_resource(
                volume_client.volume_snapshots,
                parsed_args.snapshot).id

        project = None
        if parsed_args.project:
            project = utils.find_resource(
                identity_client.projects,
                parsed_args.project).id

        user = None
        if parsed_args.user:
            user = utils.find_resource(
                identity_client.users,
                parsed_args.user).id

        volume = volume_client.volumes.create(
            size=parsed_args.size,
            snapshot_id=snapshot,
            name=parsed_args.name,
            description=parsed_args.description,
            volume_type=parsed_args.type,
            user_id=user,
            project_id=project,
            availability_zone=parsed_args.availability_zone,
            metadata=parsed_args.property,
            imageRef=image,
            source_volid=source_volume
        )
        # Remove key links from being displayed
        volume._info.update(
            {
                'properties': utils.format_dict(volume._info.pop('metadata')),
                'type': volume._info.pop('volume_type')
            }
        )
        volume._info.pop("links", None)
        return zip(*sorted(six.iteritems(volume._info)))
예제 #19
0
    def take_action(self, parsed_args):

        def _show_progress(progress):
            if progress:
                self.app.stdout.write('\rProgress: %s' % progress)
                self.app.stdout.flush()

        compute_client = self.app.client_manager.compute

        server = utils.find_resource(
            compute_client.servers,
            parsed_args.server,
        )
        if parsed_args.name:
            image_name = parsed_args.name
        else:
            image_name = server.name

        image_id = compute_client.servers.create_image(
            server.id,
            image_name,
        )

        image_client = self.app.client_manager.image
        image = utils.find_resource(
            image_client.images,
            image_id,
        )

        if parsed_args.wait:
            if utils.wait_for_status(
                image_client.images.get,
                image_id,
                callback=_show_progress,
            ):
                self.app.stdout.write('\n')
            else:
                LOG.error(_('Error creating server image: %s'),
                          parsed_args.server)
                raise exceptions.CommandError

        if self.app.client_manager._api_version['image'] == '1':
            info = {}
            info.update(image._info)
            info['properties'] = utils.format_dict(info.get('properties', {}))
        else:
            # Get the right image module to format the output
            image_module = importutils.import_module(
                self.IMAGE_API_VERSIONS[
                    self.app.client_manager._api_version['image']
                ]
            )
            info = image_module._format_image(image)
        return zip(*sorted(six.iteritems(info)))
예제 #20
0
 def take_action(self, parsed_args):
     identity_client = self.app.client_manager.identity
     role = utils.find_resource(identity_client.roles, parsed_args.role)
     project = utils.find_resource(
         identity_client.tenants,
         parsed_args.project,
     )
     user = utils.find_resource(identity_client.users, parsed_args.user)
     identity_client.roles.remove_user_role(
         user.id,
         role.id,
         project.id)
예제 #21
0
    def take_action(self, parsed_args):
        identity_client = self.app.client_manager.identity

        domain = None
        if parsed_args.domain:
            domain = common.find_domain(identity_client, parsed_args.domain)
        for project in parsed_args.projects:
            if domain is not None:
                project_obj = utils.find_resource(identity_client.projects, project, domain_id=domain.id)
            else:
                project_obj = utils.find_resource(identity_client.projects, project)
            identity_client.projects.delete(project_obj.id)
예제 #22
0
    def take_action(self, parsed_args):
        self.log.warning(_('This command has been deprecated. '
                           'Please use "server add fixed ip" instead.'))

        compute_client = self.app.client_manager.compute

        network = utils.find_resource(
            compute_client.networks, parsed_args.network)

        server = utils.find_resource(
            compute_client.servers, parsed_args.server)

        server.add_fixed_ip(network.id)
    def take_action(self, parsed_args):
        database_client_manager = self.app.client_manager.database

        db_clusters = database_client_manager.clusters
        cluster = utils.find_resource(db_clusters,
                                      parsed_args.cluster)

        db_instances = database_client_manager.instances
        instances = [
            {'id': utils.find_resource(db_instances,
                                       instance).id}
            for instance in parsed_args.instances
        ]
        db_clusters.shrink(cluster, instances)
예제 #24
0
    def take_action(self, parsed_args):
        identity_client = self.app.client_manager.identity
        auth_ref = self.app.client_manager.auth_ref

        # Project and user are required, if not included in command args
        # default to the values used for authentication.  For token-flow
        # authentication they must be included on the command line.
        if (not parsed_args.project and
                self.app.client_manager.auth_ref.project_id):
            parsed_args.project = auth_ref.project_id
        if not parsed_args.project:
            msg = _("Project must be specified")
            raise exceptions.CommandError(msg)

        if (not parsed_args.user and
                self.app.client_manager.auth_ref.user_id):
            parsed_args.user = auth_ref.user_id
        if not parsed_args.user:
            msg = _("User must be specified")
            raise exceptions.CommandError(msg)

        self.log.warning(_('Listing assignments using user role list is '
                           'deprecated as of the Newton release. Use role '
                           'assignment list --user <user-name> --project '
                           '<project-name> --names instead.'))
        project = utils.find_resource(
            identity_client.tenants,
            parsed_args.project,
        )
        user = utils.find_resource(identity_client.users, parsed_args.user)

        data = identity_client.roles.roles_for_user(user.id, project.id)

        columns = (
            'ID',
            'Name',
            'Project',
            'User',
        )

        # Add the names to the output even though they will be constant
        for role in data:
            role.user = user.name
            role.project = project.name

        return (columns,
                (utils.get_item_properties(
                    s, columns,
                    formatters={},
                ) for s in data))
예제 #25
0
    def take_action(self, parsed_args):
        identity_client = self.app.client_manager.identity

        if parsed_args.project:
            project_id = utils.find_resource(
                identity_client.tenants,
                parsed_args.project,
            ).id
        else:
            project_id = None

        enabled = True
        if parsed_args.disable:
            enabled = False
        if parsed_args.password_prompt:
            parsed_args.password = utils.get_password(self.app.stdin)

        if not parsed_args.password:
            LOG.warning(_("No password was supplied, authentication will fail "
                          "when a user does not have a password."))

        try:
            user = identity_client.users.create(
                parsed_args.name,
                parsed_args.password,
                parsed_args.email,
                tenant_id=project_id,
                enabled=enabled,
            )
        except ks_exc.Conflict:
            if parsed_args.or_show:
                user = utils.find_resource(
                    identity_client.users,
                    parsed_args.name,
                )
                LOG.info(_('Returning existing user %s'), user.name)
            else:
                raise

        # NOTE(dtroyer): The users.create() method wants 'tenant_id' but
        #                the returned resource has 'tenantId'.  Sigh.
        #                We're using project_id now inside OSC so there.
        if 'tenantId' in user._info:
            user._info.update(
                {'project_id': user._info.pop('tenantId')}
            )

        info = {}
        info.update(user._info)
        return zip(*sorted(six.iteritems(info)))
예제 #26
0
    def take_action(self, parsed_args):

        compute_client = self.app.client_manager.compute
        volume_client = self.app.client_manager.volume

        project_id = None
        if parsed_args.project is not None:
            identity_client = self.app.client_manager.identity
            if parsed_args.domain is not None:
                domain = identity_common.find_domain(identity_client,
                                                     parsed_args.domain)
                project_id = utils.find_resource(identity_client.projects,
                                                 parsed_args.project,
                                                 domain_id=domain.id).id
            else:
                project_id = utils.find_resource(identity_client.projects,
                                                 parsed_args.project).id

        compute_limits = None
        volume_limits = None

        if self.app.client_manager.is_compute_endpoint_enabled():
            compute_limits = compute_client.limits.get(parsed_args.is_reserved,
                                                       tenant_id=project_id)

        if self.app.client_manager.is_volume_endpoint_enabled(volume_client):
            volume_limits = volume_client.limits.get()

        data = []
        if parsed_args.is_absolute:
            if compute_limits:
                data.append(compute_limits.absolute)
            if volume_limits:
                data.append(volume_limits.absolute)
            columns = ["Name", "Value"]
            return (columns, (utils.get_item_properties(s, columns)
                              for s in itertools.chain(*data)))

        elif parsed_args.is_rate:
            if compute_limits:
                data.append(compute_limits.rate)
            if volume_limits:
                data.append(volume_limits.rate)
            columns = ["Verb", "URI", "Value", "Remain", "Unit",
                       "Next Available"]
            return (columns, (utils.get_item_properties(s, columns)
                              for s in itertools.chain(*data)))
        else:
            return {}, {}
예제 #27
0
    def take_action(self, parsed_args):
        identity_client = self.app.client_manager.identity

        domain = None
        if parsed_args.domain:
            domain = common.find_domain(identity_client, parsed_args.domain)
        for user in parsed_args.users:
            if domain is not None:
                user_obj = utils.find_resource(identity_client.users,
                                               user,
                                               domain_id=domain.id)
            else:
                user_obj = utils.find_resource(identity_client.users,
                                               user)
            identity_client.users.delete(user_obj.id)
예제 #28
0
    def take_action(self, parsed_args):
        identity_client = self.app.client_manager.identity
        role = utils.find_resource(identity_client.roles, parsed_args.role)

        info = {}
        info.update(role._info)
        return zip(*sorted(six.iteritems(info)))
예제 #29
0
    def take_action(self, parsed_args):
        volume_client = self.app.client_manager.volume
        volume = utils.find_resource(volume_client.volumes, parsed_args.volume)

        if parsed_args.size:
            if volume.status != 'available':
                LOG.error(_("Volume is in %s state, it must be available "
                            "before size can be extended"), volume.status)
                return
            if parsed_args.size <= volume.size:
                LOG.error(_("New size must be greater than %s GB"),
                          volume.size)
                return
            volume_client.volumes.extend(volume.id, parsed_args.size)

        if parsed_args.property:
            volume_client.volumes.set_metadata(volume.id, parsed_args.property)
        if parsed_args.image_property:
            volume_client.volumes.set_image_metadata(
                volume.id, parsed_args.image_property)

        kwargs = {}
        if parsed_args.name:
            kwargs['display_name'] = parsed_args.name
        if parsed_args.description:
            kwargs['display_description'] = parsed_args.description
        if kwargs:
            volume_client.volumes.update(volume.id, **kwargs)
예제 #30
0
    def take_action(self, parsed_args):
        identity_client = self.app.client_manager.identity

        user_str = common._get_token_resource(identity_client, 'user',
                                              parsed_args.user)
        if parsed_args.domain:
            domain = common.find_domain(identity_client, parsed_args.domain)
            user = utils.find_resource(identity_client.users,
                                       user_str,
                                       domain_id=domain.id)
        else:
            user = utils.find_resource(identity_client.users,
                                       user_str)

        user._info.pop('links')
        return zip(*sorted(six.iteritems(user._info)))
예제 #31
0
    def take_action(self, parsed_args):
        identity_client = self.app.client_manager.identity
        compute_client = self.app.client_manager.compute
        dateformat = "%Y-%m-%d"
        now = datetime.datetime.utcnow()

        if parsed_args.start:
            start = datetime.datetime.strptime(parsed_args.start, dateformat)
        else:
            start = now - datetime.timedelta(weeks=4)

        if parsed_args.end:
            end = datetime.datetime.strptime(parsed_args.end, dateformat)
        else:
            end = now + datetime.timedelta(days=1)

        if parsed_args.project:
            project = utils.find_resource(
                identity_client.projects,
                parsed_args.project,
            ).id
        else:
            # Get the project from the current auth
            project = self.app.client_manager.auth_ref.project_id

        usage = compute_client.usage.get(project, start, end)

        if parsed_args.formatter == 'table':
            sys.stdout.write(
                _("Usage from %(start)s to %(end)s on "
                  "project %(project)s: \n") % {
                      "start": start.strftime(dateformat),
                      "end": end.strftime(dateformat),
                      "project": project,
                  })

        info = {}
        info['Servers'] = (len(usage.server_usages) if hasattr(
            usage, "server_usages") else None)
        info['RAM MB-Hours'] = (float(
            "%.2f" % usage.total_memory_mb_usage) if hasattr(
                usage, "total_memory_mb_usage") else None)
        info['CPU Hours'] = (float("%.2f" % usage.total_vcpus_usage)
                             if hasattr(usage, "total_vcpus_usage") else None)
        info['Disk GB-Hours'] = (float(
            "%.2f" % usage.total_local_gb_usage) if hasattr(
                usage, "total_local_gb_usage") else None)
        return zip(*sorted(six.iteritems(info)))
예제 #32
0
    def take_action(self, parsed_args):
        volume_client = self.app.client_manager.volume
        volume = utils.find_resource(volume_client.volumes, parsed_args.volume)

        # Special mapping for columns to make the output easier to read:
        # 'metadata' --> 'properties'
        # 'volume_type' --> 'type'
        volume._info.update(
            {
                'properties': utils.format_dict(volume._info.pop('metadata')),
                'type': volume._info.pop('volume_type'),
            }, )

        # Remove key links from being displayed
        volume._info.pop("links", None)
        return zip(*sorted(six.iteritems(volume._info)))
예제 #33
0
    def take_action(self, parsed_args):
        share_client = self.app.client_manager.share

        share_snapshot = utils.find_resource(share_client.share_snapshots,
                                             parsed_args.snapshot)

        export_locations = (
            share_client.share_snapshot_export_locations.list(share_snapshot))
        export_locations = (cliutils.transform_export_locations_to_string_view(
            export_locations))

        data = share_snapshot._info
        data['export_locations'] = export_locations
        data.pop('links', None)

        return self.dict2columns(data)
예제 #34
0
파일: token.py 프로젝트: Daiane-b/APIVagas
    def take_action(self, parsed_args):
        identity_client = self.app.client_manager.identity

        # NOTE(stevemar): We want a list of role ids
        roles = []
        for role in parsed_args.role:
            role_id = utils.find_resource(
                identity_client.roles,
                role,
            ).id
            roles.append(role_id)

        verifier_pin = identity_client.oauth1.request_tokens.authorize(
            parsed_args.request_key, roles)

        return zip(*sorted(six.iteritems(verifier_pin._info)))
예제 #35
0
    def take_action(self, parsed_args):
        volume_client = self.app.client_manager.volume
        volume_id = utils.find_resource(volume_client.volumes,
                                        parsed_args.volume).id
        snapshot = volume_client.volume_snapshots.create(
            volume_id,
            parsed_args.force,
            parsed_args.name,
            parsed_args.description
        )

        snapshot._info.update(
            {'properties': utils.format_dict(snapshot._info.pop('metadata'))}
        )

        return zip(*sorted(six.iteritems(snapshot._info)))
예제 #36
0
 def take_action(self, parsed_args):
     bc_client = self.app.client_manager.baremetal_compute
     group = utils.find_resource(bc_client.server_group,
                                 parsed_args.server_group)
     info = {}
     info.update(group._info)
     columns = (
         'uuid',
         'name',
         'user_id',
         'project_id',
         'members',
         'policies',
     )
     data = utils.get_dict_properties(info, columns, formatters=_formatters)
     return columns, data
예제 #37
0
    def take_action(self, parsed_args):
        volume_client = self.app.client_manager.volume

        if volume_client.api_version < api_versions.APIVersion('3.14'):
            msg = _(
                "--os-volume-api-version 3.14 or greater is required to "
                "support the 'volume group snapshot delete' command"
            )
            raise exceptions.CommandError(msg)

        snapshot = utils.find_resource(
            volume_client.group_snapshots,
            parsed_args.snapshot,
        )

        volume_client.group_snapshots.delete(snapshot.id)
예제 #38
0
    def take_action(self, parsed_args):
        volume_client = self.app.client_manager.volume
        snapshot = utils.find_resource(volume_client.volume_snapshots,
                                       parsed_args.snapshot)

        if parsed_args.property:
            volume_client.volume_snapshots.set_metadata(
                snapshot.id, parsed_args.property)

        kwargs = {}
        if parsed_args.name:
            kwargs['display_name'] = parsed_args.name
        if parsed_args.description:
            kwargs['display_description'] = parsed_args.description

        snapshot.update(**kwargs)
예제 #39
0
    def take_action(self, parsed_args):
        LOG.debug("take_action({0})".format(parsed_args))
        client = self.app.client_manager.application_catalog

        client.sessions.deploy(parsed_args.id, parsed_args.session_id)

        environment = utils.find_resource(client.environments, parsed_args.id)
        data = client.environments.get(environment.id,
                                       parsed_args.session_id).to_dict()

        data['services'] = jsonutils.dumps(data['services'], indent=2)

        if getattr(parsed_args, 'only_apps', False):
            return (['services'], [data['services']])
        else:
            return self.dict2columns(data)
예제 #40
0
    def take_action(self, parsed_args):
        bc_client = self.app.client_manager.baremetal_compute
        data = utils.find_resource(
            bc_client.aggregate,
            parsed_args.aggregate,
        )
        # Special mapping for columns to make the output easier to read:
        # 'metadata' --> 'properties'
        data._info.update(
            {
                'properties': utils.format_dict(data._info.pop('metadata')),
            }, )

        info = {}
        info.update(data._info)
        return zip(*sorted(info.items()))
예제 #41
0
    def take_action(self, parsed_args):
        identity_client = self.app.client_manager.identity

        domain_id = None
        if parsed_args.domain:
            domain_id = common.find_domain(identity_client,
                                           parsed_args.domain).id

        options = common.get_immutable_options(parsed_args)
        role = utils.find_resource(identity_client.roles,
                                   parsed_args.role,
                                   domain_id=domain_id)

        identity_client.roles.update(role.id, name=parsed_args.name,
                                     description=parsed_args.description,
                                     options=options)
예제 #42
0
 def take_action(self, parsed_args):
     volume_client = self.app.client_manager.volume
     volume = utils.find_resource(volume_client.volumes, parsed_args.volume)
     # Map 'metadata' column to 'properties'
     volume._info.update(
         {
             'properties': utils.format_dict(volume._info.pop('metadata')),
             'type': volume._info.pop('volume_type'),
         },
     )
     if 'os-vol-tenant-attr:tenant_id' in volume._info:
         volume._info.update(
             {'project_id': volume._info.pop(
                 'os-vol-tenant-attr:tenant_id')}
         )
     return zip(*sorted(six.iteritems(volume._info)))
예제 #43
0
    def take_action(self, parsed_args):
        image_client = self.app.client_manager.image
        identity_client = self.app.client_manager.identity

        project_id = common.find_project(identity_client, parsed_args.project,
                                         parsed_args.project_domain).id

        image_id = utils.find_resource(image_client.images,
                                       parsed_args.image).id

        image_member = image_client.image_members.create(
            image_id,
            project_id,
        )

        return zip(*sorted(six.iteritems(image_member)))
예제 #44
0
 def _get_image(self, name):
     try:
         image = utils.find_resource(self.app.client_manager.image.images,
                                     name)
     except exceptions.CommandError as e:
         # TODO(maufart): enhance error detection, when python-glanceclient
         # starts provide it https://bugs.launchpad.net/glance/+bug/1480156
         if 'More than one image exists' in e.args[0]:
             raise exceptions.CommandError(
                 'Image "%s" already exists in glance more than once,'
                 ' delete all copies except the first one.' % name)
         else:
             self.log.debug('Image "%s" does not exists, no problem.' %
                            name)
             return None
     return image
예제 #45
0
파일: domain.py 프로젝트: Daiane-b/APIVagas
    def take_action(self, parsed_args):
        identity_client = self.app.client_manager.identity
        domain = utils.find_resource(identity_client.domains,
                                     parsed_args.domain)
        kwargs = {}
        if parsed_args.name:
            kwargs['name'] = parsed_args.name
        if parsed_args.description:
            kwargs['description'] = parsed_args.description

        if parsed_args.enable:
            kwargs['enabled'] = True
        if parsed_args.disable:
            kwargs['enabled'] = False

        identity_client.domains.update(domain.id, **kwargs)
예제 #46
0
    def take_action(self, parsed_args):
        volume_client = self.app.client_manager.volume
        qos_spec = utils.find_resource(volume_client.qos_specs,
                                       parsed_args.qos_spec)

        qos_associations = volume_client.qos_specs.get_associations(qos_spec)
        if qos_associations:
            associations = [
                association.name for association in qos_associations
            ]
            qos_spec._info.update(
                {'associations': utils.format_list(associations)})
        qos_spec._info.update(
            {'properties': utils.format_dict(qos_spec._info.pop('specs'))})

        return zip(*sorted(six.iteritems(qos_spec._info)))
    def take_action(self, parsed_args):
        volume_client = self.app.client_manager.volume
        consistency_group = parsed_args.consistency_group
        if not parsed_args.consistency_group:
            # If "--consistency-group" not specified, then consistency_group
            # will be the same as the new consistency group snapshot name
            consistency_group = parsed_args.snapshot_name
        consistency_group_id = utils.find_resource(
            volume_client.consistencygroups, consistency_group).id
        consistency_group_snapshot = volume_client.cgsnapshots.create(
            consistency_group_id,
            name=parsed_args.snapshot_name,
            description=parsed_args.description,
        )

        return zip(*sorted(consistency_group_snapshot._info.items()))
예제 #48
0
파일: utils.py 프로젝트: numvc/LuxoftBot
    def _create_take_action(self, client, app, parsed_args):
        if parsed_args.json:
            blob = osc_utils.read_blob_file_contents(parsed_args.json)
            try:
                template = json.loads(blob)
            except ValueError as e:
                raise exceptions.CommandError('An error occurred when reading '
                                              'template from file %s: %s' %
                                              (parsed_args.json, e))
            data = client.node_group_templates.create(**template).to_dict()
        else:
            if (not parsed_args.name or not parsed_args.plugin
                    or not parsed_args.plugin_version or not parsed_args.flavor
                    or not parsed_args.processes):
                raise exceptions.CommandError(
                    'At least --name, --plugin, --plugin-version, --processes,'
                    ' --flavor arguments should be specified or json template '
                    'should be provided with --json argument')

            configs = None
            if parsed_args.configs:
                blob = osc_utils.read_blob_file_contents(parsed_args.configs)
                try:
                    configs = json.loads(blob)
                except ValueError as e:
                    raise exceptions.CommandError(
                        'An error occurred when reading '
                        'configs from file %s: %s' % (parsed_args.configs, e))

            shares = None
            if parsed_args.shares:
                blob = osc_utils.read_blob_file_contents(parsed_args.shares)
                try:
                    shares = json.loads(blob)
                except ValueError as e:
                    raise exceptions.CommandError(
                        'An error occurred when reading '
                        'shares from file %s: %s' % (parsed_args.shares, e))

            compute_client = app.client_manager.compute
            flavor_id = osc_utils.find_resource(compute_client.flavors,
                                                parsed_args.flavor).id

            data = create_node_group_templates(client, app, parsed_args,
                                               flavor_id, configs, shares)

        return data
예제 #49
0
    def take_action(self, parsed_args):
        image_client = self.app.client_manager.image
        image = utils.find_resource(
            image_client.images,
            parsed_args.image,
        )

        kwargs = {}
        tagret = 0
        propret = 0
        if parsed_args.tags:
            for k in parsed_args.tags:
                try:
                    image_client.image_tags.delete(image.id, k)
                except Exception:
                    LOG.error(_("tag unset failed, '%s' is a "
                                "nonexistent tag "), k)
                    tagret += 1

        if parsed_args.properties:
            for k in parsed_args.properties:
                if k not in image:
                    LOG.error(_("property unset failed, '%s' is a "
                                "nonexistent property "), k)
                    propret += 1
            image_client.images.update(
                image.id,
                parsed_args.properties,
                **kwargs)

        tagtotal = len(parsed_args.tags)
        proptotal = len(parsed_args.properties)
        if (tagret > 0 and propret > 0):
            msg = (_("Failed to unset %(tagret)s of %(tagtotal)s tags,"
                   "Failed to unset %(propret)s of %(proptotal)s properties.")
                   % {'tagret': tagret, 'tagtotal': tagtotal,
                      'propret': propret, 'proptotal': proptotal})
            raise exceptions.CommandError(msg)
        elif tagret > 0:
            msg = (_("Failed to unset %(tagret)s of %(tagtotal)s tags.")
                   % {'tagret': tagret, 'tagtotal': tagtotal})
            raise exceptions.CommandError(msg)
        elif propret > 0:
            msg = (_("Failed to unset %(propret)s of %(proptotal)s"
                   " properties.")
                   % {'propret': propret, 'proptotal': proptotal})
            raise exceptions.CommandError(msg)
    def take_action(self, parsed_args):
        identity_client = self.app.client_manager.identity

        project_id = None
        if parsed_args.project:
            project_id = common.find_project(identity_client,
                                             parsed_args.project,
                                             parsed_args.project_domain).id

        domain_id = None
        if parsed_args.domain:
            domain_id = common.find_domain(identity_client,
                                           parsed_args.domain).id

        enabled = True
        if parsed_args.disable:
            enabled = False
        if parsed_args.password_prompt:
            parsed_args.password = utils.get_password(self.app.stdin)

        if not parsed_args.password:
            LOG.warning(_("No password was supplied, authentication will fail "
                          "when a user does not have a password."))
        options = _get_options_for_user(identity_client, parsed_args)

        try:
            user = identity_client.users.create(
                name=parsed_args.name,
                domain=domain_id,
                default_project=project_id,
                password=parsed_args.password,
                email=parsed_args.email,
                description=parsed_args.description,
                enabled=enabled,
                options=options,
            )
        except ks_exc.Conflict:
            if parsed_args.or_show:
                user = utils.find_resource(identity_client.users,
                                           parsed_args.name,
                                           domain_id=domain_id)
                LOG.info(_('Returning existing user %s'), user.name)
            else:
                raise

        user._info.pop('links')
        return zip(*sorted(user._info.items()))
    def take_action(self, parsed_args):
        def _show_progress(progress):
            if progress:
                self.app.stdout.write('\rProgress: %s' % progress)
                self.app.stdout.flush()

        compute_client = self.app.client_manager.compute

        server = utils.find_resource(
            compute_client.servers,
            parsed_args.server,
        )
        if parsed_args.name:
            image_name = parsed_args.name
        else:
            image_name = server.name

        image_id = compute_client.servers.create_image(
            server.id,
            image_name,
        )

        image_client = self.app.client_manager.image
        image = image_client.find_image(image_id)

        if parsed_args.wait:
            if utils.wait_for_status(
                    image_client.get_image,
                    image_id,
                    callback=_show_progress,
            ):
                self.app.stdout.write('\n')
            else:
                LOG.error(_('Error creating server image: %s'),
                          parsed_args.server)
                raise exceptions.CommandError

        if self.app.client_manager._api_version['image'] == '1':
            info = {}
            info.update(image._info)
            info['properties'] = utils.format_dict(info.get('properties', {}))
        else:
            # Get the right image module to format the output
            image_module = importutils.import_module(self.IMAGE_API_VERSIONS[
                self.app.client_manager._api_version['image']])
            info = image_module._format_image(image)
        return zip(*sorted(info.items()))
예제 #52
0
    def take_action(self, parsed_args):
        share_client = self.app.client_manager.share

        snapshot_obj = utils.find_resource(share_client.share_snapshots,
                                           parsed_args.snapshot)

        try:
            snapshot_access = share_client.share_snapshots.allow(
                snapshot=snapshot_obj,
                access_type=parsed_args.access_type,
                access_to=parsed_args.access_to)
            return self.dict2columns(snapshot_access)

        except Exception as e:
            raise exceptions.CommandError(
                "Failed to create access to share snapshot "
                "'%s': %s" % (snapshot_obj, e))
예제 #53
0
 def take_action(self, parsed_args):
     LOG_DEP.warning(
         _('This command has been deprecated. '
           'Please use "volume snapshot create" instead.'))
     volume_client = self.app.client_manager.volume
     volume_id = utils.find_resource(volume_client.volumes,
                                     parsed_args.volume).id
     snapshot = volume_client.volume_snapshots.create(
         volume_id,
         force=parsed_args.force,
         name=parsed_args.name,
         description=parsed_args.description,
         metadata=parsed_args.property,
     )
     snapshot._info.update(
         {'properties': utils.format_dict(snapshot._info.pop('metadata'))})
     return zip(*sorted(six.iteritems(snapshot._info)))
예제 #54
0
    def take_action(self, parsed_args):

        compute_client = self.app.client_manager.compute
        server = utils.find_resource(
            compute_client.servers,
            parsed_args.server,
        )

        if parsed_args.name:
            server.update(name=parsed_args.name)

        if parsed_args.property:
            compute_client.servers.set_meta(
                server,
                parsed_args.property,
            )

        if parsed_args.state:
            server.reset_state(state=parsed_args.state)

        if parsed_args.root_password:
            p1 = getpass.getpass(_('New password: '******'Retype new password: '))
            if p1 == p2:
                server.change_password(p1)
            else:
                msg = _("Passwords do not match, password unchanged")
                raise exceptions.CommandError(msg)

        if parsed_args.description:
            if server.api_version < api_versions.APIVersion("2.19"):
                msg = _("Description is not supported for "
                        "--os-compute-api-version less than 2.19")
                raise exceptions.CommandError(msg)
            server.update(description=parsed_args.description)

        if parsed_args.tag:
            if server.api_version < api_versions.APIVersion("2.26"):
                msg = _("Modifying tags is not supported for "
                        "--os-compute-api-version less than 2.26")
                raise exceptions.CommandError(msg)
            sdk.load(self.app.client_manager.sdk_connection)
            client = self.app.client_manager.sdk_connection.compute
            server = client.get_server(server.id)
            for tag in parsed_args.tag:
                server.add_tag(client, tag)
예제 #55
0
    def take_action(self, parsed_args):
        share_client = self.app.client_manager.share

        share_snapshot = utils.find_resource(share_client.share_snapshots,
                                             parsed_args.snapshot)

        export_locations = (
            share_client.share_snapshot_export_locations.list(share_snapshot))

        export_locations = cliutils.convert_dict_list_to_string(
            export_locations, ignored_keys=['links'])

        data = share_snapshot._info
        data['export_locations'] = export_locations
        data.pop('links', None)

        return self.dict2columns(data)
예제 #56
0
파일: images.py 프로젝트: numvc/LuxoftBot
    def take_action(self, parsed_args):
        self.log.debug("take_action(%s)", parsed_args)
        client = self.app.client_manager.data_processing
        image_client = self.app.client_manager.image

        image_id = osc_utils.find_resource(image_client.images,
                                           parsed_args.image).id

        data = client.images.update_image(image_id,
                                          user_name=parsed_args.username,
                                          desc=parsed_args.description).image

        data['tags'] = osc_utils.format_list(data['tags'])

        data = utils.prepare_data(data, IMAGE_FIELDS)

        return self.dict2columns(data)
예제 #57
0
    def take_action(self, parsed_args):
        identity_client = self.app.client_manager.identity
        try:
            role = identity_client.roles.create(parsed_args.role_name)
        except ks_exc.Conflict:
            if parsed_args.or_show:
                role = utils.find_resource(
                    identity_client.roles,
                    parsed_args.role_name,
                )
                LOG.info(_('Returning existing role %s'), role.name)
            else:
                raise

        info = {}
        info.update(role._info)
        return zip(*sorted(six.iteritems(info)))
예제 #58
0
def _find_volumes(parsed_args_volumes, volume_client):
    result = 0
    uuid = ''
    for volume in parsed_args_volumes:
        try:
            volume_id = utils.find_resource(volume_client.volumes, volume).id
            uuid += volume_id + ','
        except Exception as e:
            result += 1
            LOG.error(
                _("Failed to find volume with "
                  "name or ID '%(volume)s':%(e)s") % {
                      'volume': volume,
                      'e': e
                  })

    return result, uuid
예제 #59
0
    def take_action(self, parsed_args):
        compute_client = self.app.client_manager.compute
        hypervisor = utils.find_resource(compute_client.hypervisors,
                                         parsed_args.hypervisor)._info.copy()

        aggregates = compute_client.aggregates.list()
        hypervisor["aggregates"] = list()
        if aggregates:
            # Hypervisors in nova cells are prefixed by "<cell>@"
            if "@" in hypervisor['service']['host']:
                cell, service_host = hypervisor['service']['host'].split(
                    '@', 1)
            else:
                cell = None
                service_host = hypervisor['service']['host']

            if cell:
                # The host aggregates are also prefixed by "<cell>@"
                member_of = [
                    aggregate.name for aggregate in aggregates if
                    cell in aggregate.name and service_host in aggregate.hosts
                ]
            else:
                member_of = [
                    aggregate.name for aggregate in aggregates
                    if service_host in aggregate.hosts
                ]
            hypervisor["aggregates"] = member_of

        uptime = compute_client.hypervisors.uptime(hypervisor['id'])._info
        # Extract data from uptime value
        # format: 0 up 0,  0 users,  load average: 0, 0, 0
        # example: 17:37:14 up  2:33,  3 users,  load average: 0.33, 0.36, 0.34
        m = re.match("(.+)\sup\s+(.+),\s+(.+)\susers,\s+load average:\s(.+)",
                     uptime['uptime'])
        if m:
            hypervisor["host_time"] = m.group(1)
            hypervisor["uptime"] = m.group(2)
            hypervisor["users"] = m.group(3)
            hypervisor["load_average"] = m.group(4)

        hypervisor["service_id"] = hypervisor["service"]["id"]
        hypervisor["service_host"] = hypervisor["service"]["host"]
        del hypervisor["service"]

        return zip(*sorted(six.iteritems(hypervisor)))
예제 #60
0
    def take_action(self, parsed_args):
        identity_client = self.app.client_manager.identity

        # NOTE(stevemar): Find the two users, project and roles that
        # are necessary for making a trust usable, the API dictates that
        # trustee, project and role are optional, but that makes the trust
        # pointless, and trusts are immutable, so let's enforce it at the
        # client level.
        trustor_id = common.find_user(identity_client, parsed_args.trustor,
                                      parsed_args.trustor_domain).id
        trustee_id = common.find_user(identity_client, parsed_args.trustee,
                                      parsed_args.trustee_domain).id
        project_id = common.find_project(identity_client, parsed_args.project,
                                         parsed_args.project_domain).id

        role_names = []
        for role in parsed_args.role:
            role_name = utils.find_resource(
                identity_client.roles,
                role,
            ).name
            role_names.append(role_name)

        expires_at = None
        if parsed_args.expiration:
            expires_at = datetime.datetime.strptime(parsed_args.expiration,
                                                    '%Y-%m-%dT%H:%M:%S')

        trust = identity_client.trusts.create(
            trustee_id,
            trustor_id,
            impersonation=parsed_args.impersonate,
            project=project_id,
            role_names=role_names,
            expires_at=expires_at,
        )

        trust._info.pop('roles_links', None)
        trust._info.pop('links', None)

        # Format roles into something sensible
        roles = trust._info.pop('roles')
        msg = ' '.join(r['name'] for r in roles)
        trust._info['roles'] = msg

        return zip(*sorted(six.iteritems(trust._info)))