Цель: применить на практике принципы из SOLID, GRASP.
Бекап (Backup) — в общем случае, это резервная копия каких-то данных, которая делается для того, чтобы в дальнейшем можно было восстановить эти данные, то есть откатиться до того момента, когда она была создана. В контексте данной системы, бекапом обозначим связанную цепочку созданных точек.
Точка восстановления (Restore point) — резервная копия объектов, созданная в определенный момент. Описать можно датой создания и список резервных копий объектов, которые бекапились в момент создания точки.
Бекапная джоба (Backup job) - сущность, которая содержит информацию о конфигурации создаваемых бекапов (список файлов, которые нужно бекапить, способ хранения и прочее) и о уже созданных точках данного бекапа. Также отвечает за создание новых точек восстановления.
Объект джобы (Job object) - объекты, которые добавлены с бекапную джобу, для которых нужно создавать копии при процессинге джобы.
Сторадж (Storage) - файл, в котором хранится резервная копия объекта джобы, который был создан в конкретной точке.
Репозиторий (Repository) - абстракция над способом хранения бекапов. В рамках самого простого кейса, репозиторием будет некоторая директория на локальной файловой системе, где будут лежать стораджи.
Выполняем такие действия:
- Создаём джобу, добавляем три объекта FileA FileB FileC
- Запускаем джобу, получаем рестор поинт в котором есть стораджи FileA_1 FileB_1 FileC_1
- Повторяем, получаем стораджи *_2
- Убираем из бекапной джобы FileC, запускаем джобу, получаем третий рестор поинт у которого есть два стораджа - FileA_3 FileB_3
Под созданием резервной копии файла подразумевается создание копии файла в другом месте. Система должна поддерживать расширяемость в алгоритмах создания резервных копий. Требуется реализовать два алгоритма:
- Алгоритм раздельного хранения (Split storages) — для каждого объекта, который добавлен в джобу, создается копия - zip файл, в котором лежит объект.
- Алгоритм общего хранения (Single storage) — все указанные в бекапе объекты сохраняются в один архив.
В лабораторной работе подразуемвается, что резервные копии будут создаваться локально на файловой системе. Но логика выполнения должна абстрагироваться от этого, должна быть введена абстракция - репозиторий (см. принцип DIP из SOLID). И, например, в тестах стоит реализовать хранение в памяти, иначе тесты будут создавать много мусора, будут требовать дополнительной конфигурации, а также могут начать внезапно падать. Ожидаемая структура:
- Корневая директория
- Директории джоб, которые лежат в корневой директории
- Файлы резервных копий, которые лежат в директории джобы
- Директории джоб, которые лежат в корневой директории
Backup job отвечает за создание новых точек восстановления (т.е. выступает неким фасадом инкапсулируя в себе логику). При создании backup job должна быть возможность задачать её название, способ или место хранения и алгоритм создания резервных копий файлов. Должна поддерживаться возможность добавлять или убирать Job objects из Backup Job. Результатом работы алгоритма является создание новой точки восстановления. Точка восстановления должна содержать как минимум информацию о том, какие объекты были в ней забекаплены.
- Тест-1
- Cоздаю бекапную джобу
- Указываю Split storages
- Добавляю в джобу два файла
- Запускаю создание точки
- Удаляю один из файлов
- Запускаю создание
- Проверяю, что создано две точки и три стораджа
- Тест-2, который лучше оформлять не тестом т.к. посмотреть нормально можно только на настоящей файловой системе
- Cоздаю бекапную джобу, указываю путь директории для хранения бекапов
- Указываю Single storage
- Добавляю в джобу два файла
- Запускаю создание точки
- Проверяю, что созданы директории и файлы
Список тест-кейсов не является необходимым минимумом по покрытию тестов, это только некоторые из примеров. Стоит учитывать, что тест, которые напрямую работают с файловой системой, будут не работать на CI. Нужно делать такие реализации репозиториев, которые позволят тестам не падать.
Бекапы - это абстрактное понятие, которое описывает концепцию реализации. Стораджи - это уже детали реализации процесса создания бекапов.
В описании лабораторной, репозиторий - это абстракция над тем, куда и как будет записана копия файла. В самом простом случае, мы рассматривает файловую систему как репозиторий. Другие сущности (например, джоба) не должны напрямую работать с файловой системой, вызывать методы создания файла или директории. Вся эта логика выполняется за интерфейсом. Это позволит соответствовать DIP и OCP, легко добавить другие реализации, которые, например, будут сохранять копии сразу на гугл диск.