diff --git a/.deploy/deploy-dev.yaml b/.deploy/deploy-dev.yaml index 3c70f26..3bf7fff 100644 --- a/.deploy/deploy-dev.yaml +++ b/.deploy/deploy-dev.yaml @@ -6,7 +6,8 @@ services: platform-nginx: image: mathwave/sprint-repo:platform networks: - - common-infra-nginx + - common-infra-nginx-development + - configurator-development environment: DB_HOST: "pg.develop.sprinthub.ru" DB_PASSWORD: $DB_PASSWORD_DEV @@ -74,5 +75,7 @@ services: order: start-first networks: - common-infra-nginx: - external: true \ No newline at end of file + common-infra-nginx-development: + external: true + configurator-development: + external: true diff --git a/.deploy/deploy-prod.yaml b/.deploy/deploy-prod.yaml index edeb484..6b5df94 100644 --- a/.deploy/deploy-prod.yaml +++ b/.deploy/deploy-prod.yaml @@ -7,6 +7,7 @@ services: image: mathwave/sprint-repo:platform networks: - common-infra-nginx + - configurator environment: DB_HOST: "pg.sprinthub.ru" DB_PASSWORD: $DB_PASSWORD_PROD @@ -80,3 +81,5 @@ services: networks: common-infra-nginx: external: true + configurator: + external: true diff --git a/.gitea/workflows/deploy-dev.yaml b/.gitea/workflows/deploy-dev.yaml index 9821fdf..8941d1d 100644 --- a/.gitea/workflows/deploy-dev.yaml +++ b/.gitea/workflows/deploy-dev.yaml @@ -28,7 +28,7 @@ jobs: run: docker push mathwave/sprint-repo:platform deploy-dev: name: Deploy dev - runs-on: [dev] + runs-on: [prod] needs: push steps: - name: login @@ -46,4 +46,4 @@ jobs: RABBITMQ_PASSWORD: ${{ secrets.RABBITMQ_PASSWORD_DEV }} VK_SERVICE_TOKEN: ${{ secrets.VK_SERVICE_TOKEN }} YANDEX_SERVICE_TOKEN: ${{ secrets.YANDEX_SERVICE_TOKEN }} - run: docker stack deploy --with-registry-auth -c ./.deploy/deploy-dev.yaml platform + run: docker stack deploy --with-registry-auth -c ./.deploy/deploy-dev.yaml platform-development diff --git a/BaseLib/configurator.py b/BaseLib/configurator.py new file mode 100644 index 0000000..60ec220 --- /dev/null +++ b/BaseLib/configurator.py @@ -0,0 +1,58 @@ +from requests import get, put, post, delete +from json import dumps + + +URL_CONFIGS = 'http://configurator/api/v1/configs' +URL_EXPERIMENTS = 'http://configurator/api/v1/experiments' + + +def get_configs(project, stage): + response = get(URL_CONFIGS, params={'project': project, 'stage': stage}) + if response.status_code != 200: + return [] + data = response.json() + for config in data: + config['value_pretty'] = dumps(config['value'], indent=4, ensure_ascii=False) + return data + + +def create_config(project, stage, name): + post(URL_CONFIGS, json={'project': project, 'stage': stage, 'name': name}) + + +def update_config(id, value): + put(URL_CONFIGS, json={'id': id, 'value': value}) + + +def delete_config(id): + delete(URL_CONFIGS, json={'id': id}) + + +def get_experiments(project, stage): + response = get(URL_EXPERIMENTS, params={'project': project, 'stage': stage}) + if response.status_code != 200: + return [] + data = response.json() + for exp in data: + if exp['condition'] == 'False': + exp['exp_type'] = 0 + elif exp['condition'] == 'user.is_superuser': + exp['exp_type'] = 1 + elif exp['condition'] == 'user.platform_staff': + exp['exp_type'] = 2 + elif exp['condition'] == 'True': + exp['exp_type'] = 3 + else: + exp['exp_type'] = 4 + return data + +def create_experiment(project, stage, name): + post(URL_EXPERIMENTS, json={'project': project, 'stage': stage, 'name': name}) + + +def update_experiment(id, enabled, condition): + put(URL_EXPERIMENTS, json={'id': id, 'enabled': enabled, 'condition': condition}) + + +def delete_experiment(id): + delete(URL_CONFIGS, json={'id': id}) diff --git a/configs/views.py b/configs/views.py index 83d5605..a4be4d7 100644 --- a/configs/views.py +++ b/configs/views.py @@ -3,6 +3,7 @@ from json import loads from django.http import HttpResponse, JsonResponse from BaseLib.BaseView import BaseView +from BaseLib.configurator import * from Platform import settings from configs.models import Config @@ -20,31 +21,35 @@ class ConfigsView(BaseView): return '/configs/?stage=production' self.stage = self.request.GET['stage'] self.context['stage'] = self.stage - self.context['configs'] = Config.objects.filter(project=self.request.user.selected_project, - stage=self.stage).order_by('name') + # self.context['configs'] = Config.objects.filter(project=self.request.user.selected_project, + # stage=self.stage).order_by('name') + self.context['configs'] = get_configs(self.request.user.selected_project.name, self.stage) def post_create_config(self): - Config.objects.create(name=self.request.POST['name'], project=self.request.user.selected_project, stage=self.stage) + create_config(self.request.user.selected_project.name, self.stage, self.request.POST['name']) + # Config.objects.create(name=self.request.POST['name'], project=self.request.user.selected_project, stage=self.stage) return '/configs/?stage=' + self.stage def post_delete(self): - config = Config.objects.get(id=self.request.POST['config']) - config.delete() - return '/configs/?stage=' + config.stage + # config = Config.objects.get(id=self.request.POST['config']) + # config.delete() + delete_config(self.request.POST['config']) + return '/configs/?stage=' + self.stage def post_save(self): data = self.request.POST['data'] - config = Config.objects.get(id=self.request.POST['config']) + # config = Config.objects.get(id=self.request.POST['config']) try: data = loads(data) except: - self.context['incorrect_config'] = config + self.context['incorrect_config'] = self.request.POST['config'] self.context['incorrect_data'] = data self.context['error'] = True return - config.data = data - config.save() - return '/configs/?stage=' + config.stage + update_config(self.request.POST['config'], data) + # config.data = data + # config.save() + return '/configs/?stage=' + self.stage def get_config(request): diff --git a/experiments/views.py b/experiments/views.py index a788b73..709b55e 100644 --- a/experiments/views.py +++ b/experiments/views.py @@ -1,6 +1,7 @@ from django.http import HttpResponse, JsonResponse from BaseLib.BaseView import BaseView +from BaseLib.configurator import * from Platform import settings from experiments.models import Experiment @@ -17,31 +18,48 @@ class ExperimentsView(BaseView): self.context['stage'] = self.stage def get(self): - self.context['experiments'] = Experiment.objects.filter(project=self.request.user.selected_project, - stage=self.stage).order_by('name') + # self.context['experiments'] = Experiment.objects.filter(project=self.request.user.selected_project, + # stage=self.stage).order_by('name') + self.context['experiments'] = get_experiments(self.request.user.selected_project.name, self.stage) def post_create(self): - Experiment.objects.create(project=self.request.user.selected_project, stage=self.stage, name=self.request.POST['name']) + # Experiment.objects.create(project=self.request.user.selected_project, stage=self.stage, name=self.request.POST['name']) + create_experiment(self.request.user.selected_project.name, self.stage, self.request.POST['name']) return '/experiments/?stage=' + self.stage def post_delete(self): - Experiment.objects.get(id=self.request.POST['experiment_id']).delete() + # Experiment.objects.get(id=self.request.POST['experiment_id']).delete() + delete_experiment(self.request.POST['experiment_id']) return '/experiments/?stage=' + self.stage + def post_change(self): - exp = Experiment.objects.get(id=self.request.POST['experiment_id']) - exp.enabled = 'enabled' in self.request.POST + # exp = Experiment.objects.get(id=self.request.POST['experiment_id']) + # exp.enabled = 'enabled' in self.request.POST + # condition = self.request.POST['condition_select'] + # if condition == 'Другое (только для техлидов)': + # exp.condition = self.request.POST['condition'] + # elif condition == 'Никому': + # exp.condition = 'False' + # elif condition == 'Только админам': + # exp.condition = 'user.is_superuser' + # elif condition == 'Только сотрудникам': + # exp.condition = 'user.platform_staff' + # else: + # exp.condition = 'True' + # exp.save() + enabled = 'enabled' in self.request.POST condition = self.request.POST['condition_select'] if condition == 'Другое (только для техлидов)': - exp.condition = self.request.POST['condition'] + condition = self.request.POST['condition'] elif condition == 'Никому': - exp.condition = 'False' + condition = 'False' elif condition == 'Только админам': - exp.condition = 'user.is_superuser' + condition = 'user.is_superuser' elif condition == 'Только сотрудникам': - exp.condition = 'user.platform_staff' + condition = 'user.platform_staff' else: - exp.condition = 'True' - exp.save() + condition = 'True' + update_experiment(self.request.POST['experiment_id'], enabled, condition) return '/experiments/?stage=' + self.stage diff --git a/templates/configs.html b/templates/configs.html index 34e6b6d..b313d84 100644 --- a/templates/configs.html +++ b/templates/configs.html @@ -28,7 +28,7 @@ {% if error %}