Блог ·
Коли NetBox є джерелом правди
Підключення зовнішньої DCIM не є синхронізацією. Це рішення на кожне поле про те, хто вирішує, плюс перелік того, що ви відмовляєтеся імпортувати.
Автор: Provibr
Клієнт із робочим NetBox не хоче другого інвентаря. Він хоче, щоб його стійки й машини зʼявилися на платформі, з якої він працює, і хоче й далі редагувати їх там, де його команда вже знає.
Слово, яке до цього зазвичай чіпляють, це «синхронізація», і саме слово є проблемою. Синхронізація натякає на дві системи, що сходяться до однієї правди. Насправді ж ви маєте питання на кожне поле, на яке треба відповісти наперед і записати: для цієї колонки, на цьому обʼєкті, хто вирішує? Дайте відповідь один раз знизуванням плечима, і ви побудували систему, яка перезаписує свідому локальну правку о третій ночі, або таку, що мовчки ігнорує зміну, яку клієнт зробив годину тому й вважає доставленою.
Ось як ми на це відповіли, разом із полями, де відповіддю є «ні».
Чотири значення, і вони не є ступенями довіри
Кожна колонка кожного звʼязаного обʼєкта несе одне з чотирьох значень власності, і вони кажуть чотири різні речі про те, хто вирішує, а не чотири рівні впевненості.
Зовнішнє. Вирішує інший бік. Поле тут лише для читання, і імпорт перезаписує його, не питаючи. Це не втрата контролю, це домовленість, у яку адміністратор вступив, коли підключав систему.
Наше. Вирішуємо ми, і імпорт його не торкається. Це стан кожного поля обʼєкта, який узагалі не звʼязаний, і кожного поля, для якого зовнішня система не має відповідника.
Закріплене вручну. Значення в іншого боку таки є, а адміністратор свідомо перекрив його тут, із причиною. Різниця тоді є конфліктом, який виносять на поверхню, і ніколи тихим перезаписом. Це єдине з чотирьох, яке не може виникнути як типове: його хтось ставить.
Похідне. Не вирішує ніхто. Воно випливає з чогось іншого: чи машина у стійці, чи вона привʼязана до послуги, чи вона готова, ємність стійки, облік самого рядка. Вони структурно не піддаються імпорту, і тест стверджує, що вони ніколи не зʼявляються в жодному відображенні.
Останнє заслуговує примітки. Облікові поля, хто створив рядок і коли, є похідними, а не нашими. Ніхто не обирає ті значення, вони випливають із дії. Шлях імпорту, якому дозволено писати позначку часу створення, є шляхом імпорту, який може переписати історію.
Власність висить на звʼязку, а не на обʼєкті. Обʼєкт без звʼязку є цілком нашим, а це означає, що розʼєднання є одним видаленням, а не міграцією стану через кожну колонку.
Реєстр є на кожну колонку, а перелік колонок походить зі схеми
Кожна колонка чотирьох підтримуваних типів обʼєктів, майданчиків, розташувань, стійок і машин, має запис у реєстрі. Разом із тими, що не мають до зовнішньої системи жодного стосунку.
Ця повнота забезпечена, а не задумана. Тест виводить перелік колонок зі схеми бази даних і вимагає рішення для кожної. Нова колонка, додана в якомусь пізнішому раунді, є тому червоним тестом, а не тихою прогалиною, і це та сама конструкція, яку ми вживаємо в іншому місці: тест на кожен випадок за своєю природою не може знайти випадок, якого бракує.
Частина цих рішень і є найцікавішою.
Бюджет потужності стійки лишається нашим. NetBox моделює потужність як вводи, а не як одну цифру бюджету. Виведення одного числа з кількох вводів було б твердженням про ємність, зібраним із неповних даних, а це рівно те, що задум ємності забороняє. Тож поле не імпортується, і це речення записано поруч як причина.
Стан процесу машини лишається нашим. Статус пристрою в NetBox змішує життєвий цикл і роботу в одному полі. Пристрій, позначений як несправний, за наївного відображення штовхнув би машину в стан обслуговування й вивів би її з пулу придатних до продажу. Це два різні словники, що випадково поділяють назву.
Вид машини лишається нашим. Роль пристрою в NetBox є вільним текстом. Хибна здогадка там дає не косметичну помилку, вона змінює те, що платформа дозволить вам із машиною робити.
Кожне з них зберігається з написаною причиною, у тій самій структурі, що й рішення. Правило з причиною переживає наступну людину; правило без неї послаблює хтось, хто припускає, що воно було довільним.
Лише початково, бо в коробці лежать наліпки
Два поля імпортують один раз, при створенні, і ніколи не оновлюють: код майданчика, розташування чи стійки та інвентарну позначку машини.
Причина є фізичною. Ті значення надруковані на наліпках, а наліпки лежать у коробці в комірчині. Слаг, перейменований у NetBox наступної весни, не має відправляти сканування не туди. Лише початково не є третім значенням власності, це властивість імпорту: брати при додаванні, далі не чіпати.
Ті самі поля є тим, за чим звіряють незвʼязаний обʼєкт, коли підключення роблять уперше: код для решти трьох, інвентарна позначка для машин. Свідомо не назва, бо код є стабільним і унікальним без огляду на регістр, а назва не є ні тим, ні тим.
Розміщення ніколи не імпортується, і немає поля, що веде туди
NetBox знає для кожного пристрою його стійку, його позицію і його бік. Ці три відхилено.
Не проігноровано. Відхилено, поіменно, з кодом причини, і показано в попередньому перегляді.
Міркування випливає просто із задуму зайнятості: єдиною справжньою межею зайнятості стійки є частковий унікальний індекс на таблиці слотів, і того індексу торкається лише одна функція. Шлях імпорту, що пише стійку й номер юніта на машину, є другим шляхом запису, який про той індекс не знає, і тоді одного дня машину записано у дві стійки, а зовнішня система підтверджує, що так і має бути.
Специфікація цього розділу каже, що локальне розміщення чи активну заявку імпорт ніколи не має стирати. Зробити це правдою можна двома способами. Один це написати імпорт так, щоб він лишав заявки в спокої. Другий це зробити неможливим для імпорту записати заявку взагалі, і ми взяли саме його: немає поля, що веде туди.
Забезпечує це запобіжник на абстрактному синтаксичному дереві, а не тестовий випадок. Він читає вихідний код модуля імпорту й вимагає, щоб чотири захищені таблиці, заявки, слоти, привʼязки послуг і наліпки, зʼявлялися лише всередині select. Insert, update чи delete на будь-якій із них є червоним, навіть якщо жоден шлях коду до них не доходить, бо гарантія мусить триматися для коду, якого ще немає. Обхідник гучно падає на формі, якої не впізнає, і це урок, засвоєний дорогим шляхом на давнішому запобіжнику, що тихо пропускав те, чого не міг розібрати.
Відмови перелічують у попередньому перегляді поіменно. Тихе випущення є небезпечною версією тут: хтось підключає свій NetBox, читає «оновлено 142 машини» і припускає, що розкладка його стійок приїхала разом із цим.
Зовнішнє видалення є tombstone
Звʼязаний обʼєкт, про який інший бік перестає згадувати, стає tombstone з оглядом наслідків, а не видаленням.
Це не просто ввічливість. Перелік, що вернувся коротким через помилку у фільтрі, зміну дозволів чи наполовину отриману сторінку, інакше вичистив би інвентар клієнта. Tombstone ставить обʼєкт перед людиною разом із тим, що від нього залежить: обʼєкт з активною заявкою не можна прибрати взагалі, а після звільнення заявки наслідком є списання, а не видалення.
А якщо відомо, що отримання обрізане, не стається нічого. Не пропонують жодного tombstone ні для чого. Про те, чого ви не бачили, ви не можете виснувати, що його немає. Це умова на два рядки, і в ній різниця між конектором та інцидентом.
Що ми б записали
- Вирішуйте власність на кожну колонку, а не на кожен обʼєкт і зробіть так, щоб перелік колонок походив зі схеми, аби нову не можна було забути.
- Зберігайте причину разом із рішенням. Полю, яке не імпортується, потрібне речення, інакше хтось імпортує його пізніше.
- Зробіть небезпечний імпорт неможливим, а не обережним. Жодного поля до нього, плюс запобіжник, що читає вихідний код.
- Називайте те, що відхиляєте, у попередньому перегляді, бо кількість оновлених обʼєктів читається як повнота.
- Ставтеся до відсутності як до питання, а не як до видалення і ставтеся до обрізаного отримання як до цілковитої відсутності відомостей.
Про наш власний стан: це лежить за прапорцем розгортання, який типово вимкнено, з налаштуванням на кожну організацію поверх, тож це не те, що сьогодні купують, і воно не працювало проти справжнього NetBox. Сказане вище про те, як NetBox моделює потужність, статус і ролі, походить із його документації та з форми його інтерфейсу, а не з робочого примірника. Усе вище виміряно проти заглушки, яка відтворює поведінку сторінкування, заголовок версії та вкладені обʼєкти справжнього інтерфейсу, закріпленої на версії API, яку надсилає продакшн-код. Заглушка справді пропонує стійку, позицію і бік у своїх корисних навантаженнях пристроїв, і записано нуль заявок: відмову виміряно, а не припущено. Суміжне питання про те, чому зовнішня система, яка повідомляє про успіх, не є результатом сама по собі, є в тому, чому 200 від Proxmox не є результатом.
Із роботи над центрами обробки даних у Provibr. Межа зайнятості, від якої цей імпорт тримають подалі, описана в єдиній справжній межі зайнятості стійки, а наліпки, чиї коди мають лишатися стабільними, у наліпці, що переживе зміну імені хоста.