Skip to content

Сервис динамического управления конфигурацией

License

Notifications You must be signed in to change notification settings

gdagil/distributed-config

Repository files navigation

Build Pytest

Distributed config

Описание

API, позволяющее сохранять конфигурацию в postgres, отслеживать версионирование параметров конфигурации, запрашивать требуюмую конфигурацю для ранее внесённого в базу сервиса

Выполненные технические требования

  • язык программирования Python
  • формат схемы конфига json
  • сервис должен обеспечивает персистентность данных
  • сервис поддерживает все CRUD операции по работе с конфигом
  • поддерживается версионирование конфига при его изменении
  • удалять конфиг допускается только если он не используется никаким приложением

Здорово, что:

  • в качестве протокола взаимодействия сервиса с клиентами использовал gRPC
  • написал Dockerfile и docker-compose.yml
  • покрыл проект unit-тестами
  • сделал тестовый пример использования написанного сервиса конфигураций

Техническая реализация

Схема postgres

Пример использования сервиса

Запуск

Перед запуском убедитесь, что в системе установлен docker и docker-compose коомандами:

sudo docker --version
sudo docker-compose --version

Да лее проверьте, запущен ли демон docker

sudo docker ps

Тогда можно поднимать сервис

git clone https://github.com/gdagil/distributed-config.git
cd distributed-config
sudo bash ./start.sh

Тестирование

После запуска всех контейнеров можно выполнить тестирование (полностью покрывает все запросы, описанные ниже)

python -m venv venv 

Для Linux

source venv/bin/activate

Для Windows

source venv/Scripts/activate

Далее устанавливаем пакеты и производим тестирование

pip install -r tests/requirements.txt
pytest

Создание конфига

Запрос

curl -d "@data.json" -H "Content-Type: application/json" -X POST http://localhost:8080/config

{
    "service": "managed-k8s",
    "data": [
        {"key1": "value1"},
        {"key2": "value2"}
    ]
}

Ответ

status_code: 201

{
  "success": true,
  "detail": "Successfully created"
}

Получение конфига

curl http://localhost:8080/config?service=managed-k8s

{
    "key1": "value1", 
    "key2": "value2"
}

Изменение конфига

Запрос

curl -d "@data.json" -H "Content-Type: application/json" -X PUT http://localhost:8080/config

{
    "service": "managed-k8s",
    "data": [
        {
            "key1": "learn"
        },
        {
            "key2": "golang"
        }
    ]
}

Ответ

status_code: 200

{
  "success": true,
  "detail": "Successfully created"
}

Просмотр версий конфигурации

Запрос

curl http://localhost:8080/version/history?service=managed-k8s

Ответ

status_code: 200

{
  "key2": {
    "value": "golang",
    "version": 2,
    "prev_version": {
      "value": "value2",
      "version": 1,
      "prev_version": null
    }
  },
  "key1": {
    "value": "learn",
    "version": 2,
    "prev_version": {
      "value": "value1",
      "version": 1,
      "prev_version": null
    }
  }
}

При изменении только одного параметра в конфигурации

{
  "key2": {
    "value": "golang",
    "version": 2,
    "prev_version": {
      "value": "value2",
      "version": 1,
      "prev_version": null
    }
  },
  "key1": {
    "value": "now",
    "version": 3,
    "prev_version": {
      "value": "learn",
      "version": 2,
      "prev_version": {
        "value": "value1",
        "version": 1,
        "prev_version": null
      }
    }
  }
}

Получение конкретной версии конфигурации

Запрос

curl http://localhost:8080/version?service=managed-k8s&version=2

Ответ

status_code: 200

{
  "key2": "golang",
  "key1": "learn"
}