Quando você exclui um gateway e depois adiciona um novo com o mesmo EUI, se falha porque reclama que o gateway já existe.
{
"code": 6,
"message": "error:pkg/identityserver/store:already_exists (entity already exists)",
"details": [
{
"@type": "type.googleapis.com/ttn.lorawan.v3.ErrorDetails",
"namespace": "pkg/identityserver/store",
"name": "already_exists",
"message_format": "entity already exists",
"attributes": {
"field": "gateway_eui",
"value": "'3135313749005303'"
},
"correlation_id": "c0dc6bb73d714702bd8d0be57e83f369"
}
]
}
Crie com sucesso o novo gateway
amazon linux usando TTN CLI e Postman usando API Call
Quando o usuário tentar inserir um gateway excluído, atualize o sinalizador excluído para falso
...
Atualizei um pouco esse problema para ter um escopo um pouco diferente do #1121, que podemos fazer mais sobre a restauração de entidades excluídas em geral (em vez de apenas aplicativos).
Na edição atual, vamos nos concentrar mais na adição de novos gateways com o mesmo EUI de um gateway excluído.
Relacionado a https://github.com/TheThingsNetwork/lorawan-stack/issues/604 (liberando IDs/EUIs)
@htdvisser mesmo tendo https://github.com/TheThingsNetwork/lorawan-stack/issues/1703 (agora em Next Up) não está cobrindo inteiramente o caso de uso comum de poder criar um gateway com um EUI que foi usado antes . Fazer um loop em um administrador para limpar uma entidade não é uma boa experiência para o usuário, além disso, limpar uma entidade é mais destrutivo do que simplesmente liberar o EUI.
Afaik, não temos problemas de segurança com a liberação do EUI ao excluir o gateway. Já é opcional. Obviamente, tornaria a recuperação parcial, ou seja, o EUI se foi, mas acho que isso é aceitável e também se alinha com a forma como os EUIs do dispositivo são liberados na exclusão imediatamente.
Podemos fechar esse problema simplesmente liberando o EUI na exclusão do gateway? Se não, por que não?
Sim, podemos atualizar o campo Gateway EUI para nil/NULL na exclusão. Deve ser tão simples quanto adicionar um
// AfterDelete releases the EUI of a Gateway after it is deleted.
func (gtw *Gateway) AfterDelete(db *gorm.DB) error {
return db.Unscoped().Model(gtw).UpdateColumn("gateway_eui", nil).Error
}
em pkg/identityserver/store/hooks.go
.
@bafonins você pode pegar isso?
@adamsondelacruz reabra se https://github.com/TheThingsNetwork/lorawan-stack/pull/1843 não resolver o problema.