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'])
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
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'])
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'])
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
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