Пример #1
0
    def set_default(self):
        from mist.api.keys.models import Key
        """Set a new key as default key, given a key_id"""

        log.info("Setting key with id '%s' as default.", self.key.id)

        Key.objects(owner=self.key.owner, default=True).update(default=False)
        self.key.default = True
        self.key.save()

        log.info("Successfully set key with id '%s' as default.", self.key.id)
        trigger_session_update(self.key.owner, ['keys'])
Пример #2
0
def list_keys(owner):
    """List owner's keys
    :param owner:
    :return:
    """
    keys = Key.objects(owner=owner, deleted=None)
    clouds = Cloud.objects(owner=owner, deleted=None)
    key_objects = []
    # FIXME: This must be taken care of in Keys.as_dict
    for key in keys:
        key_object = {}
        # FIXME: Need to optimize this! It's potentially invoked per ssh probe.
        # Can't we expose associations directly from Machine.key_associations?
        machines = Machine.objects(cloud__in=clouds,
                                   key_associations__keypair__exact=key)
        key_object["id"] = key.id
        key_object['name'] = key.name
        key_object['owned_by'] = key.owned_by.id if key.owned_by else ''
        key_object['created_by'] = key.created_by.id if key.created_by else ''
        key_object["isDefault"] = key.default
        key_object["machines"] = transform_key_machine_associations(
            machines, key)
        key_object['tags'] = get_tags_for_resource(owner, key)
        key_objects.append(key_object)
    return key_objects
Пример #3
0
    def add(self, fail_on_invalid_params=True, **kwargs):
        """Add an entry to the database

        This is only to be called by `Key.add` classmethod to create
        a key. Fields `owner` and `name` are already populated in
        `self.key`. The `self.key` is not yet saved.

        """
        from mist.api.keys.models import Key

        rename_kwargs(kwargs, 'priv', 'private')
        # Check for invalid `kwargs` keys.
        errors = {}
        for key in kwargs:
            if key not in self.key._key_specific_fields:
                error = "Invalid parameter %s=%r." % (key, kwargs[key])
                if fail_on_invalid_params:
                    errors[key] = error
                else:
                    log.warning(error)
                    kwargs.pop(key)
        if errors:
            log.error("Error adding %s: %s", self.key, errors)
            raise BadRequestError({
                'msg':
                "Invalid parameters %s." % errors.keys(),
                'errors':
                errors,
            })

        for key, value in kwargs.iteritems():
            setattr(self.key, key, value)

        if not Key.objects(owner=self.key.owner, default=True):
            self.key.default = True

        try:
            self.key.save()
        except me.ValidationError as exc:
            log.error("Error adding %s: %s", self.key.name, exc.to_dict())
            raise BadRequestError({
                'msg': exc.message,
                'errors': exc.to_dict()
            })
        except me.NotUniqueError as exc:
            log.error("Key %s not unique error: %s", self.key.name, exc)
            raise KeyExistsError()

        # SEC
        self.key.owner.mapper.update(self.key)

        log.info("Added key with name '%s'", self.key.name)
        trigger_session_update(self.key.owner, ['keys'])
Пример #4
0
def delete_key(owner, key_id):
    """Deletes given key.
    If key was default, then it checks if there are still keys left
    and assigns another one as default.

    :param owner:
    :param key_id:
    :return:
    """
    log.info("Deleting key with id '%s'.", key_id)
    key = Key.objects.get(owner=owner, id=key_id, deleted=None)
    default_key = key.default
    key.update(set__deleted=datetime.utcnow())
    other_key = Key.objects(owner=owner, id__ne=key_id, deleted=None).first()
    if default_key and other_key:
        other_key.default = True
        other_key.save()

    log.info("Deleted key with id '%s'.", key_id)
    trigger_session_update(owner, ['keys'])
Пример #5
0
def list_keys(owner):
    """List owner's keys
    :param owner:
    :return:
    """
    keys = Key.objects(owner=owner, deleted=None)
    clouds = Cloud.objects(owner=owner, deleted=None)
    key_objects = []
    # FIXME: This must be taken care of in Keys.as_dict
    for key in keys:
        key_object = {}
        machines = Machine.objects(cloud__in=clouds,
                                   key_associations__keypair__exact=key)
        key_object["id"] = key.id
        key_object['name'] = key.name
        key_object["isDefault"] = key.default
        key_object["machines"] = transform_key_machine_associations(
            machines, key)
        key_object['tags'] = get_tags_for_resource(owner, key)
        key_objects.append(key_object)
    return key_objects
Пример #6
0
def list_keys(owner):
    """List owner's keys
    :param owner:
    :return:
    """
    keys = Key.objects(owner=owner, deleted=None)
    key_objects = []
    # FIXME: This must be taken care of in Keys.as_dict
    for key in keys:
        key_object = {}
        key_object["id"] = key.id
        key_object['name'] = key.name
        key_object['owned_by'] = key.owned_by.id if key.owned_by else ''
        key_object['created_by'] = key.created_by.id if key.created_by else ''
        key_object["isDefault"] = key.default
        key_associations = KeyMachineAssociation.objects(key=key)
        key_object["machines"] = transform_key_machine_associations(
            key_associations)
        key_object['tags'] = get_tags_for_resource(owner, key)
        key_objects.append(key_object)
    return key_objects