Skip to content

Commit

Permalink
Merge pull request #11 from globocom/creation_of_project
Browse files Browse the repository at this point in the history
Creation of project
  • Loading branch information
ribeiro-rodrigo committed Nov 30, 2020
2 parents 408bbc8 + eb0ac41 commit 9487146
Show file tree
Hide file tree
Showing 14 changed files with 138 additions and 49 deletions.
3 changes: 2 additions & 1 deletion app/config/__init__.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from app.config.data_module import DataModule
from app.config.use_case_module import UseCaseModule
from app.config.domain_module import DomainModule

__all__ = ['DataModule', 'UseCaseModule']
__all__ = ['DataModule', 'UseCaseModule', 'DomainModule']
17 changes: 16 additions & 1 deletion app/config/data_module.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
SessionSessionCreateRequest,
SessionSessionResponse,
ApplicationServiceApi,
ProjectServiceApi
)
from argocd_client.api import SessionServiceApi
from argocd_client.api_client import ApiClient
Expand All @@ -11,13 +12,15 @@

from app.infra.config import Config

from app.domain.repositories import ClusterRepository, EnforcementRepository
from app.domain.repositories import ClusterRepository, EnforcementRepository, ProjectRepository
from app.domain.source_locator import SourceLocator

from app.data.argo.cluster import ClusterService
from app.data.argo.application import ApplicationService
from app.data.source.definition.locator import SourceLocatorImpl

from app.data.argo.project import ProjectService


class DataModule(Module):

Expand Down Expand Up @@ -79,3 +82,15 @@ def provide_enforcement_repository(self, application_service: ApplicationService
@singleton
def provide_source_locator(self, config: Config) -> SourceLocator:
return SourceLocatorImpl(config_helper=config)

@provider
@singleton
def provide_project_service(self, api_client: ApiClient) -> ProjectServiceApi:
return ProjectServiceApi(api_client)

@provider
@singleton
def provide_project_repository(self, project_service: ProjectServiceApi) -> ProjectRepository:
return ProjectService(project_service=project_service)


11 changes: 11 additions & 0 deletions app/config/domain_module.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
from injector import Module, provider, singleton

from app.domain.repositories import ClusterRepository, ProjectRepository
from app.domain.cluster_group_builder import ClusterGroupBuilder

class DomainModule(Module):

@provider
@singleton
def provide_cluster_group_builder(self, cluster_repository: ClusterRepository, project_repository: ProjectRepository) -> ClusterGroupBuilder:
return ClusterGroupBuilder(cluster_repository=cluster_repository, project_repository=project_repository)
21 changes: 11 additions & 10 deletions app/config/use_case_module.py
Original file line number Diff line number Diff line change
@@ -1,42 +1,43 @@
from injector import Module, provider, singleton

from app.domain.source_locator import SourceLocator
from app.domain.repositories import ClusterRepository, EnforcementRepository
from app.domain.repositories import EnforcementRepository
from app.domain.use_case import ApplyRulesUseCase, SyncRulesUseCase, UpdateRulesUseCase
from app.domain.cluster_group_builder import ClusterGroupBuilder


class UseCaseModule(Module):

@provider
@singleton
def provider_apply_rules(
self, cluster_repo: ClusterRepository, locator: SourceLocator,
enforcement_repo: EnforcementRepository
self, locator: SourceLocator, enforcement_repo: EnforcementRepository,
cluster_group_builder: ClusterGroupBuilder
) -> ApplyRulesUseCase:
return ApplyRulesUseCase(
cluster_repository=cluster_repo,
enforcement_repository=enforcement_repo,
source_locator=locator
source_locator=locator,
cluster_group_builder=cluster_group_builder
)

@provider
@singleton
def provider_sync_rules(
self, cluster_repo: ClusterRepository, locator: SourceLocator,
enforcement_repo: EnforcementRepository
self, locator: SourceLocator, enforcement_repo: EnforcementRepository,
cluster_group_builder: ClusterGroupBuilder
) -> SyncRulesUseCase:
return SyncRulesUseCase(
cluster_repository=cluster_repo,
enforcement_repository=enforcement_repo,
cluster_group_builder=cluster_group_builder,
source_locator=locator
)

@provider
@singleton
def provider_update_rules(self, enforcement_repo: EnforcementRepository,
cluster_repo: ClusterRepository) -> UpdateRulesUseCase:
cluster_group_builder: ClusterGroupBuilder) -> UpdateRulesUseCase:
return UpdateRulesUseCase(
enforcement_repository=enforcement_repo,
cluster_repository=cluster_repo
cluster_group_builder=cluster_group_builder
)

40 changes: 40 additions & 0 deletions app/data/argo/project.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
import attr

from argocd_client import ProjectServiceApi
from app.domain.entities import Cluster
from app.domain.repositories import ProjectRepository


@attr.s(auto_attribs=True)
class ProjectService(ProjectRepository):
_project_service: ProjectServiceApi

def create_project(self, cluster: Cluster) -> None:

body = {
'project': {
'metadata': {
'name': cluster.name
},
'spec': {
'destinations': [{'server': cluster.url, 'namespace': '*'}],
'sourceRepos': ['*'],
'clusterResourceBlacklist': [],
'clusterResourceWhitelist': [],
'namespaceResourceBlacklist': [],
'namespaceResourceWhitelist': [],
'orphanedResources': None,
'roles': [],
'signatureKeys': [],
'syncWindows': []
}
}
}


self._project_service.create_mixin6(body)

def remove_project(self, project_name: str) -> None:
self._project_service.delete_mixin6(name=project_name)


12 changes: 9 additions & 3 deletions app/domain/cluster_group.py
Original file line number Diff line number Diff line change
@@ -1,16 +1,18 @@
from __future__ import annotations

from typing import List, Dict
from typing import List
import attr

from app.domain.entities import Cluster
from app.domain.repositories import ClusterRepository
from app.domain.repositories import ClusterRepository, ProjectRepository


@attr.s(auto_attribs=True)
class ClusterGroup:
_clusters: List[Cluster]
_cluster_repository: ClusterRepository
_project_repository: ProjectRepository


@property
def clusters(self):
Expand All @@ -19,10 +21,12 @@ def clusters(self):
def register(self):
for cluster in self._clusters:
self._cluster_repository.register_cluster(cluster)
self._project_repository.create_project(cluster)

def unregister(self):
for cluster in self._clusters:
self._cluster_repository.unregister_cluster(cluster)
self._project_repository.remove_project(cluster.name)

def __sub__(self, other: ClusterGroup) -> ClusterGroup:
cluster_names = {cluster.name: cluster for cluster in other.clusters}
Expand All @@ -33,7 +37,9 @@ def __sub__(self, other: ClusterGroup) -> ClusterGroup:
)
)

return ClusterGroup(cluster_repository=self._cluster_repository, clusters=result_clusters)
return ClusterGroup(cluster_repository=self._cluster_repository
,project_repository=self._project_repository,
clusters=result_clusters)



Expand Down
18 changes: 18 additions & 0 deletions app/domain/cluster_group_builder.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
from typing import List
import attr

from app.domain.entities import Cluster
from app.domain.cluster_group import ClusterGroup
from app.domain.repositories import ClusterRepository, ProjectRepository


@attr.s(auto_attribs=True)
class ClusterGroupBuilder:
_cluster_repository: ClusterRepository
_project_repository: ProjectRepository

def build(self, clusters: List[Cluster]) -> ClusterGroup:
return ClusterGroup(clusters=clusters,
cluster_repository=self._cluster_repository,
project_repository=self._project_repository)

7 changes: 1 addition & 6 deletions app/domain/entities.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,9 +37,4 @@ class ClusterRule(BaseModel):


class ClusterRuleStatus(BaseModel):
clusters: List[dict]





clusters: List[dict]
10 changes: 9 additions & 1 deletion app/domain/repositories.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,4 +29,12 @@ def list_installed_enforcements(self, **filters: Any) -> List[Enforcement]:

class SourceRepository:
def get_clusters(self) -> List[Cluster]:
raise Exception('Not implement')
raise Exception('Not implement')


class ProjectRepository:
def create_project(self, cluster: Cluster) -> None:
raise Exception("Not implemented")

def remove_project(self, project_name: str) -> None:
raise Exception("Not implemented")
10 changes: 6 additions & 4 deletions app/domain/use_case/apply_rules.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,22 +2,24 @@
from typing import List
from app.domain.entities import ClusterRule, Cluster
from app.domain.source_locator import SourceLocator
from app.domain.repositories import EnforcementRepository, ClusterRepository
from app.domain.cluster_group import ClusterGroup
from app.domain.repositories import EnforcementRepository
from app.domain.cluster_group_builder import ClusterGroupBuilder

from app.domain.enforcement_installer import EnforcementInstaller


@attr.s(auto_attribs=True)
class ApplyRulesUseCase:
_source_locator: SourceLocator
_enforcement_repository: EnforcementRepository
_cluster_repository: ClusterRepository
_cluster_group_builder: ClusterGroupBuilder

def execute(self, cluster_rule: ClusterRule) -> List[Cluster]:
source = self._source_locator.locate(cluster_rule.source)
clusters = source.get_clusters()
cluster_group = ClusterGroup(clusters=clusters, cluster_repository=self._cluster_repository)
cluster_group = self._cluster_group_builder.build(clusters=clusters)
cluster_group.register()

enforcement_installer = EnforcementInstaller(
enforcement_repository=self._enforcement_repository,
enforcements=cluster_rule.enforcements,
Expand Down
11 changes: 6 additions & 5 deletions app/domain/use_case/sync_rules.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,23 +3,24 @@

from app.domain.entities import ClusterRule, Cluster
from app.domain.source_locator import SourceLocator
from app.domain.repositories import EnforcementRepository, ClusterRepository
from app.domain.cluster_group import ClusterGroup
from app.domain.repositories import EnforcementRepository
from app.domain.cluster_group_builder import ClusterGroupBuilder
from app.domain.enforcement_installer import EnforcementInstaller


@attr.s(auto_attribs=True)
class SyncRulesUseCase:
_source_locator: SourceLocator
_cluster_repository: ClusterRepository
_enforcement_repository: EnforcementRepository
_cluster_group_builder: ClusterGroupBuilder


def execute(self, cluster_rule: ClusterRule, current_clusters: List[Cluster]) -> List[Cluster]:
source_repository = self._source_locator.locate(cluster_rule.source)
source_clusters = source_repository.get_clusters()

source_cluster_group = ClusterGroup(clusters=source_clusters, cluster_repository=self._cluster_repository)
current_cluster_group = ClusterGroup(clusters=current_clusters, cluster_repository=self._cluster_repository)
source_cluster_group = self._cluster_group_builder.build(clusters=source_clusters)
current_cluster_group = self._cluster_group_builder.build(clusters=current_clusters)

deleted_clusters = current_cluster_group - source_cluster_group
enforcement_uninstall = EnforcementInstaller(
Expand Down
15 changes: 6 additions & 9 deletions app/domain/use_case/update_rules.py
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
import attr
from typing import List

from app.domain.repositories import EnforcementRepository, ClusterRepository
from app.domain.repositories import EnforcementRepository
from app.domain.entities import Cluster, Enforcement
from app.domain.cluster_group import ClusterGroup
from app.domain.cluster_group_builder import ClusterGroupBuilder
from app.domain.enforcement_installer import EnforcementInstaller
from app.domain.enforcement_change_detector import EnforcementChangeDetector


@attr.s(auto_attribs=True)
class UpdateRulesUseCase:
_enforcement_repository: EnforcementRepository
_cluster_repository: ClusterRepository
_cluster_group_builder: ClusterGroupBuilder

def execute(self, clusters: List[Cluster], old_enforcements: List[Enforcement],
new_enforcements: List[Enforcement]):
Expand All @@ -31,8 +31,7 @@ def _update_change_enforcements(self, change_detector: EnforcementChangeDetector
if not change_enforcements:
return

cluster_group_change_enfocement = ClusterGroup(
cluster_repository=self._cluster_repository,
cluster_group_change_enfocement = self._cluster_group_builder.build(
clusters=clusters
)

Expand All @@ -50,8 +49,7 @@ def _install_added_enforcements(self, change_detector: EnforcementChangeDetector
if not added_enforcements:
return

cluster_group_remove_enfocement = ClusterGroup(
cluster_repository=self._cluster_repository,
cluster_group_remove_enfocement = self._cluster_group_builder.build(
clusters=clusters
)

Expand All @@ -69,8 +67,7 @@ def _uninstall_removed_enforcements(self, change_detector: EnforcementChangeDete
if not removed_enforcements:
return

cluster_group_remove_enfocement = ClusterGroup(
cluster_repository=self._cluster_repository,
cluster_group_remove_enfocement = self._cluster_group_builder.build(
clusters=clusters
)

Expand Down
9 changes: 1 addition & 8 deletions examples/rancher.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -23,11 +23,4 @@ spec:
ignore: #Ignore clusters that have the names listed below.
- cluster1
- cluster2
- cluster3







- cluster3
3 changes: 2 additions & 1 deletion main.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from injector import Injector
from typing import List

from app.config import DataModule, UseCaseModule
from app.config import DataModule, UseCaseModule, DomainModule
from app.entrypoint.operator import BaseController, ClusterRuleController


Expand All @@ -13,6 +13,7 @@ def register_controllers(controllers: List[BaseController]):
injector = Injector([
UseCaseModule(),
DataModule(),
DomainModule()
])

if __name__ == "main":
Expand Down

0 comments on commit 9487146

Please sign in to comment.