Skip to content
This repository has been archived by the owner on Feb 21, 2022. It is now read-only.

Commit

Permalink
chore(entity): tests and fixes
Browse files Browse the repository at this point in the history
  • Loading branch information
Jaroslav Sevcik committed Jul 12, 2021
1 parent 0add7ca commit 034f65f
Show file tree
Hide file tree
Showing 12 changed files with 309 additions and 78 deletions.
File renamed without changes.
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,10 @@


@pytest.fixture
def generate_base_component(base_component_factory, link_factory, group_factory):
def generate_base_component(component_base_factory, link_factory, group_factory):
group = group_factory(id=1, product_owner="john", project_owner="doe")
group.save()
component = base_component_factory(
component = component_base_factory(
id=1,
name="base",
type="database",
Expand All @@ -34,20 +34,20 @@ def generate_base_component(base_component_factory, link_factory, group_factory)
name="Datadog",
url="https://dashboard.datadog.com",
icon="poop",
component=component,
entity=component,
)
link_factory(
id=2,
name="Sentry",
url="https://sentry.skypicker.com",
component=component,
entity=component,
)


def test_generate_base_component(generate_base_component):
expected = """
- apiVersion: v1alpha1
kind: component
kind_: component
metadata:
name: base
owner: platform
Expand All @@ -65,7 +65,7 @@ def test_generate_base_component(generate_base_component):
url: https://sentry.skypicker.com
icon: null
spec:
type: database
type_: database
"""
repository = Repository.objects.get(pk=1)
content = generate(repository)
Expand Down
176 changes: 176 additions & 0 deletions test/entities/test_yaml_to_objects.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,176 @@
import pytest

import zoo.repos.tasks as uut
from zoo.entities.models import Entity
from zoo.libraries.models import Library
from zoo.services.models import Service

pytestmark = pytest.mark.django_db


def test_create_base_component(mocker, repository_factory):
repository = repository_factory(
id=1,
remote_id=11,
name="test_proj1",
owner="john_doe1",
url="https://github.co m/john_doe1/test_proj1",
provider="github",
)
repository_dict = {"id": repository.remote_id, "provider": repository.provider}

base_component = """
- apiVersion: v1alpha1
kind_: component
metadata:
name: base
owner: platform
group:
product_owner: john
project_owner: doe
maintainers: []
description: This is my fancy component
tags: []
links:
- name: Datadog
url: https://dashboard.datadog.com
icon: poop
- name: Sentry
url: https://sentry.skypicker.com
spec:
type_: database
"""

mocker.patch("zoo.repos.tasks.get_entity_file_content", return_value=base_component)
uut.update_project_from_entity_file(proj=repository_dict)
component_entity = Entity.objects.first()
assert Entity.objects.all().count() == 1
assert component_entity.kind == "component"
assert component_entity.name == "base"
assert component_entity.owner == "platform"
assert component_entity.service is None
assert component_entity.library is None
assert component_entity.type == "database"
assert component_entity.links.all().count() == 2
assert component_entity.group


def test_create_base_component_and_service(mocker, repository_factory):
repository = repository_factory(
id=1,
remote_id=11,
name="test_proj1",
owner="john_doe1",
url="https://github.co m/john_doe1/test_proj1",
provider="github",
)
repository_dict = {"id": repository.remote_id, "provider": repository.provider}

service_component = """
- apiVersion: v1alpha1
kind_: component
metadata:
name: base
owner: platform
group:
product_owner: john
project_owner: doe
maintainers: []
description: This is my fancy component
tags: []
links:
- name: Datadog
url: https://dashboard.datadog.com
icon: poop
- name: Sentry
url: https://sentry.skypicker.com
spec:
type_: service
environments:
- name: production
dashboard_url: https://dashboard.datadog.com
health_check_url: https://dashboard.datadog.com
service_urls:
- https://service.prod.com
- name: sandbox
dashboard_url: https://dashboard.datadog.sandbox.com
health_check_url: https://dashboard.datadog.sandbox.com
service_urls:
- https://service.sandbox.com
impact: profit
integrations:
pagerduty_service: pagerduty_service1234
sentry_project: sentry project 15234
lifecycle: production
"""

mocker.patch(
"zoo.repos.tasks.get_entity_file_content", return_value=service_component
)
uut.update_project_from_entity_file(proj=repository_dict)
component_entity = Entity.objects.first()
assert Entity.objects.all().count() == 1
assert Service.objects.all().count() == 1
assert component_entity.kind == "component"
assert component_entity.name == "base"
assert component_entity.owner == "platform"
assert component_entity.library is None
assert component_entity.type == "service"
assert component_entity.links.all().count() == 2
assert component_entity.group
assert component_entity.service is not None
assert component_entity.service.environments.all().count() == 2


def test_create_base_component_and_library(mocker, repository_factory):
repository = repository_factory(
id=1,
remote_id=11,
name="test_proj1",
owner="john_doe1",
url="https://github.co m/john_doe1/test_proj1",
provider="github",
)
repository_dict = {"id": repository.remote_id, "provider": repository.provider}

library_component = """
- apiVersion: v1alpha1
kind_: component
metadata:
name: base_lib
owner: platform
group:
product_owner: john
project_owner: doe
maintainers: []
description: This is my fancy component
tags: []
links:
- name: Datadog
url: https://dashboard.datadog.com
icon: poop
- name: Sentry
url: https://sentry.skypicker.com
spec:
type_: library
impact: profit
integrations:
sonarqube_project: sonarqube
lifecycle: production
"""

mocker.patch(
"zoo.repos.tasks.get_entity_file_content", return_value=library_component
)
uut.update_project_from_entity_file(proj=repository_dict)
component_entity = Entity.objects.first()
assert Entity.objects.all().count() == 1
assert Library.objects.all().count() == 1
assert component_entity.kind == "component"
assert component_entity.name == "base_lib"
assert component_entity.owner == "platform"
assert component_entity.type == "library"
assert component_entity.links.all().count() == 2
assert component_entity.group
assert component_entity.service is None
assert component_entity.library is not None
54 changes: 31 additions & 23 deletions zoo/entities/builder.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,11 @@

class EntityBuilder:
def create_entity(self, data, repository):
if data["kind"] != "component":
if data["kind_"] != "component":
return NotImplemented
if data["spec"]["type"] == "service":
if data["spec"]["type_"] == "service":
self._build_service(data, repository)
elif data["spec"]["spec"] == "library":
elif data["spec"]["type_"] == "library":
self._build_library(data, repository)
else:
self._build_base_component(data, repository)
Expand All @@ -22,30 +22,26 @@ def _build_base_component(data, repository):
maintainers=data["metadata"]["group"]["maintainers"],
)

links = []
for link in data["metadata"]["links"]:
l, _ = Link.objects.update_or_create(
url=link["url"],
defaults={
"name": link["name"],
"icon": link["icon"],
},
)
links.append(l)

obj, _ = Entity.objects.update_or_create(
name=data["metadata"]["name"],
kind=data["kind"],
kind=data["kind_"],
owner=data["metadata"]["owner"],
type=data["spec"]["type"],
type=data["spec"]["type_"],
source=repository,
defaults={
"group": group,
"description": data["metadata"]["description"],
"tags": data["metadata"]["tags"],
"links": links,
},
)

for link in data["metadata"]["links"]:
l, _ = Link.objects.update_or_create(
url=link["url"],
entity=obj,
defaults={"name": link["name"], "icon": getattr(link, "icon", None)},
)

return obj

def _build_service(self, data, repository):
Expand All @@ -58,10 +54,18 @@ def _build_service(self, data, repository):
defaults={
"lifecycle": data["spec"]["lifecycle"],
"impact": data["spec"]["impact"],
"sentry_project": data["spec"]["integrations"]["sentry_project"],
"sonarqube_project": data["spec"]["integrations"]["sonarqube_project"],
"slack_channel": data["spec"]["integrations"]["slack_channel"],
"pagerduty_service": data["spec"]["integrations"]["pagerduty_service"],
"sentry_project": data["spec"]
.get("integrations", {})
.get("sentry_project"),
"sonarqube_project": data["spec"]
.get("integrations", {})
.get("sonarqube_project"),
"slack_channel": data["spec"]
.get("integrations", {})
.get("slack_channel"),
"pagerduty_service": data["spec"]
.get("integrations", {})
.get("pagerduty_service"),
"description": data["metadata"]["description"],
},
)
Expand Down Expand Up @@ -90,8 +94,12 @@ def _build_library(self, data, repository):
defaults={
"lifecycle": data["spec"]["lifecycle"],
"impact": data["spec"]["impact"],
"sonarqube_project": data["spec"]["integrations"]["sonarqube_project"],
"slack_channel": data["spec"]["integrations"]["slack_channel"],
"sonarqube_project": data["spec"]
.get("integrations", {})
.get("sonarqube_project"),
"slack_channel": data["spec"]
.get("integrations", {})
.get("slack_channel"),
},
)

Expand Down
2 changes: 1 addition & 1 deletion zoo/entities/migrations/0002_auto_20210706_1033.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# Generated by Django 2.2.19 on 2021-07-06 10:33

from django.db import migrations, models
import django.db.models.deletion
from django.db import migrations, models


class Migration(migrations.Migration):
Expand Down
24 changes: 24 additions & 0 deletions zoo/entities/migrations/0003_auto_20210708_1154.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# Generated by Django 2.2.19 on 2021-07-08 11:54

from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):

dependencies = [
("entities", "0002_auto_20210706_1033"),
]

operations = [
migrations.AlterField(
model_name="link",
name="entity",
field=models.ForeignKey(
on_delete=django.db.models.deletion.PROTECT,
related_name="links",
related_query_name="link",
to="entities.Entity",
),
),
]
2 changes: 1 addition & 1 deletion zoo/entities/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ class Link(models.Model):
)
url = models.URLField()
entity = models.ForeignKey(
"entities.Link",
"entities.Entity",
related_name="links",
related_query_name="link",
on_delete=models.PROTECT,
Expand Down
16 changes: 9 additions & 7 deletions zoo/entities/yaml_definitions/component_base.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ additionalProperties: false
properties:
apiVersion:
type: string
kind:
kind_:
enum:
- component
type: string
Expand Down Expand Up @@ -46,18 +46,20 @@ properties:
type: string
type: array
type: object
required:
- name
- owner
spec:
properties:
type:
type_:
enum:
- database
- service
- library
type: string
type: object
required:
- kind
- name
- owner
- type
required:
- type_
type: object
required:
- kind_
Loading

0 comments on commit 034f65f

Please sign in to comment.