Skip to content

Commit 26979a4

Browse files
committed
feat: add new feature WorkspaceConfig resource
1 parent d50f7f6 commit 26979a4

File tree

9 files changed

+409
-0
lines changed

9 files changed

+409
-0
lines changed
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
from spaceone.core.pygrpc.server import GRPCServer
22
from spaceone.config.interface.grpc.domain_config import DomainConfig
3+
from spaceone.config.interface.grpc.workspace_config import WorkspaceConfig
34
from spaceone.config.interface.grpc.user_config import UserConfig
45

56
_all_ = ["app"]
67

78
app = GRPCServer()
89
app.add_service(DomainConfig)
10+
app.add_service(WorkspaceConfig)
911
app.add_service(UserConfig)
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
from spaceone.api.config.v1 import workspace_config_pb2, workspace_config_pb2_grpc
2+
from spaceone.core.pygrpc import BaseAPI
3+
4+
from spaceone.config.service.workspace_config_service import WorkspaceConfigService
5+
from spaceone.config.info.domain_config_info import *
6+
from spaceone.config.info.common_info import *
7+
8+
9+
class WorkspaceConfig(BaseAPI, workspace_config_pb2_grpc.WorkspaceConfigServicer):
10+
pb2 = workspace_config_pb2
11+
pb2_grpc = workspace_config_pb2_grpc
12+
13+
def create(self, request, context):
14+
params, metadata = self.parse_request(request, context)
15+
workspace_config_svc = WorkspaceConfigService(metadata)
16+
response: dict = workspace_config_svc.create(params)
17+
return self.dict_to_message(response)
18+
19+
def update(self, request, context):
20+
params, metadata = self.parse_request(request, context)
21+
workspace_config_svc = WorkspaceConfigService(metadata)
22+
response: dict = workspace_config_svc.update(params)
23+
return self.dict_to_message(response)
24+
25+
def set(self, request, context):
26+
params, metadata = self.parse_request(request, context)
27+
workspace_config_svc = WorkspaceConfigService(metadata)
28+
response: dict = workspace_config_svc.set(params)
29+
return self.dict_to_message(response)
30+
31+
def delete(self, request, context):
32+
params, metadata = self.parse_request(request, context)
33+
workspace_config_svc = WorkspaceConfigService(metadata)
34+
workspace_config_svc.delete(params)
35+
return self.empty()
36+
37+
def get(self, request, context):
38+
params, metadata = self.parse_request(request, context)
39+
workspace_config_svc = WorkspaceConfigService(metadata)
40+
response: dict = workspace_config_svc.get(params)
41+
return self.dict_to_message(response)
42+
43+
def list(self, request, context):
44+
params, metadata = self.parse_request(request, context)
45+
workspace_config_svc = WorkspaceConfigService(metadata)
46+
response: dict = workspace_config_svc.list(params)
47+
return self.dict_to_message(response)
48+
49+
def stat(self, request, context):
50+
params, metadata = self.parse_request(request, context)
51+
workspace_config_svc = WorkspaceConfigService(metadata)
52+
response: dict = workspace_config_svc.stat(params)
53+
return self.dict_to_message(response)
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
import logging
2+
from typing import Tuple
3+
4+
from mongoengine import QuerySet
5+
from spaceone.core.manager import BaseManager
6+
7+
from spaceone.config.model.workspace_config.database import WorkspaceConfig
8+
9+
_LOGGER = logging.getLogger(__name__)
10+
11+
12+
class WorkspaceConfigManager(BaseManager):
13+
def __init__(self, *args, **kwargs):
14+
super().__init__(*args, **kwargs)
15+
self.workspace_config_model = WorkspaceConfig
16+
17+
def create_workspace_config(self, params: dict) -> WorkspaceConfig:
18+
def _rollback(vo: WorkspaceConfig) -> None:
19+
_LOGGER.info(
20+
f"[create_workspace_config._rollback] " f"Delete workspace config : {vo.name}"
21+
)
22+
vo.delete()
23+
24+
workspace_config_vo: WorkspaceConfig = self.workspace_config_model.create(params)
25+
self.transaction.add_rollback(_rollback, workspace_config_vo)
26+
27+
return workspace_config_vo
28+
29+
def update_workspace_config_by_vo(
30+
self, params: dict, workspace_config_vo: WorkspaceConfig
31+
) -> WorkspaceConfig:
32+
def _rollback(old_data: dict):
33+
_LOGGER.info(
34+
f'[update_workspace_config_by_vo._rollback] Revert Data : {old_data["name"]}'
35+
)
36+
workspace_config_vo.update(old_data)
37+
38+
self.transaction.add_rollback(_rollback, workspace_config_vo.to_dict())
39+
40+
return workspace_config_vo.update(params)
41+
42+
@staticmethod
43+
def delete_workspace_config_by_vo(workspace_config_vo: WorkspaceConfig) -> None:
44+
workspace_config_vo.delete()
45+
46+
def get_workspace_config(self, name: str, workspace_id: str, domain_id: str) -> WorkspaceConfig:
47+
return self.workspace_config_model.get(name=name, workspace_id=workspace_id, domain_id=domain_id)
48+
49+
def filter_workspace_configs(self, **conditions):
50+
return self.workspace_config_model.filter(**conditions)
51+
52+
def list_workspace_configs(self, query: dict) -> Tuple[QuerySet, int]:
53+
return self.workspace_config_model.query(**query)
54+
55+
def stat_workspace_configs(self, query: dict) -> dict:
56+
return self.workspace_config_model.stat(**query)
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
from spaceone.config.model.user_config_model import UserConfig
2+
from spaceone.config.model.workspace_config.database import WorkspaceConfig
23
from spaceone.config.model.domain_config_model import DomainConfig

src/spaceone/config/model/workspace_config/__init__.py

Whitespace-only changes.
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
from mongoengine import *
2+
3+
from spaceone.core.model.mongo_model import MongoModel
4+
5+
6+
class WorkspaceConfig(MongoModel):
7+
name = StringField(max_length=255, unique_with=["domain_id", "workspace_id"])
8+
data = DictField()
9+
tags = DictField()
10+
workspace_id = StringField(max_length=40)
11+
domain_id = StringField(max_length=40)
12+
created_at = DateTimeField(auto_now_add=True)
13+
updated_at = DateTimeField(auto_now=True)
14+
15+
meta = {
16+
"updatable_fields": ["name", "data", "tags", "updated_at"],
17+
"minimal_fields": ["name"],
18+
"ordering": ["name"],
19+
"indexes": [
20+
"name",
21+
"workspace_id",
22+
"domain_id",
23+
],
24+
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
from typing import Union
2+
from pydantic import BaseModel
3+
4+
__all__ = [
5+
"WorkspaceConfigCreateRequest",
6+
"WorkspaceConfigUpdateRequest",
7+
"WorkspaceConfigSetRequest",
8+
"WorkspaceConfigDeleteRequest",
9+
"WorkspaceConfigGetRequest",
10+
"WorkspaceConfigSearchQueryRequest",
11+
"WorkspaceConfigQueryRequest",
12+
]
13+
14+
15+
class WorkspaceConfigCreateRequest(BaseModel):
16+
name: str
17+
data: dict
18+
tags: Union[dict, None] = None
19+
workspace_id: str
20+
domain_id: str
21+
22+
23+
class WorkspaceConfigUpdateRequest(BaseModel):
24+
name: str
25+
data: Union[dict, None] = None
26+
tags: Union[dict, None] = None
27+
workspace_id: str
28+
domain_id: str
29+
30+
31+
class WorkspaceConfigSetRequest(BaseModel):
32+
name: str
33+
data: str
34+
tags: Union[dict, None] = None
35+
workspace_id: str
36+
domain_id: str
37+
38+
39+
class WorkspaceConfigDeleteRequest(BaseModel):
40+
name: str
41+
workspace_id: str
42+
domain_id: str
43+
44+
45+
class WorkspaceConfigGetRequest(BaseModel):
46+
name: str
47+
workspace_id: str
48+
domain_id: str
49+
50+
51+
class WorkspaceConfigSearchQueryRequest(BaseModel):
52+
query: Union[dict, None] = None
53+
name: Union[str, None] = None
54+
workspace_id: str
55+
domain_id: str
56+
57+
58+
class WorkspaceConfigQueryRequest(BaseModel):
59+
query: dict
60+
workspace_id: str
61+
domain_id: str
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
from datetime import datetime
2+
from typing import Union, List
3+
from pydantic import BaseModel
4+
5+
from spaceone.core import utils
6+
7+
__all__ = ["WorkspaceConfigResponse", "WorkspaceConfigsResponse"]
8+
9+
10+
class WorkspaceConfigResponse(BaseModel):
11+
name: Union[str, None] = None
12+
data: Union[dict, None] = None
13+
tags: Union[dict, None] = None
14+
workspace_id: Union[str, None] = None
15+
domain_id: Union[str, None] = None
16+
created_at: Union[datetime, None] = None
17+
updated_at: Union[datetime, None] = None
18+
19+
def dict(self, *args, **kwargs):
20+
data = super().dict(*args, **kwargs)
21+
data["created_at"] = utils.datetime_to_iso8601(data["created_at"])
22+
data["updated_at"] = utils.datetime_to_iso8601(data.get("updated_at"))
23+
return data
24+
25+
26+
class WorkspaceConfigsResponse(BaseModel):
27+
results: List[WorkspaceConfigResponse] = []
28+
total_count: int

0 commit comments

Comments
 (0)