Skip to content

Commit 68f5074

Browse files
authored
Merge pull request #8 from ImMin5/master
Add new feature PublicConfig resource
2 parents 0c70797 + ed5debd commit 68f5074

File tree

14 files changed

+496
-365
lines changed

14 files changed

+496
-365
lines changed
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +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
3+
from spaceone.config.interface.grpc.public_config import PublicConfig
44
from spaceone.config.interface.grpc.user_config import UserConfig
55

66
_all_ = ["app"]
77

88
app = GRPCServer()
99
app.add_service(DomainConfig)
10-
app.add_service(WorkspaceConfig)
1110
app.add_service(UserConfig)
11+
app.add_service(PublicConfig)
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
from spaceone.api.config.v1 import public_config_pb2, public_config_pb2_grpc
2+
from spaceone.core.pygrpc import BaseAPI
3+
4+
from spaceone.config.service.public_config_service import PublicConfigService
5+
6+
7+
class PublicConfig(BaseAPI, public_config_pb2_grpc.PublicConfigServicer):
8+
pb2 = public_config_pb2
9+
pb2_grpc = public_config_pb2_grpc
10+
11+
def create(self, request, context):
12+
params, metadata = self.parse_request(request, context)
13+
public_config_svc = PublicConfigService(metadata)
14+
response: dict = public_config_svc.create(params)
15+
return self.dict_to_message(response)
16+
17+
def update(self, request, context):
18+
params, metadata = self.parse_request(request, context)
19+
public_config_svc = PublicConfigService(metadata)
20+
response: dict = public_config_svc.update(params)
21+
return self.dict_to_message(response)
22+
23+
def set(self, request, context):
24+
params, metadata = self.parse_request(request, context)
25+
public_config_svc = PublicConfigService(metadata)
26+
response: dict = public_config_svc.set(params)
27+
return self.dict_to_message(response)
28+
29+
def delete(self, request, context):
30+
params, metadata = self.parse_request(request, context)
31+
public_config_svc = PublicConfigService(metadata)
32+
public_config_svc.delete(params)
33+
return self.empty()
34+
35+
def get(self, request, context):
36+
params, metadata = self.parse_request(request, context)
37+
public_config_svc = PublicConfigService(metadata)
38+
response: dict = public_config_svc.get(params)
39+
return self.dict_to_message(response)
40+
41+
def list(self, request, context):
42+
params, metadata = self.parse_request(request, context)
43+
public_config_svc = PublicConfigService(metadata)
44+
response: dict = public_config_svc.list(params)
45+
return self.dict_to_message(response)
46+
47+
def stat(self, request, context):
48+
params, metadata = self.parse_request(request, context)
49+
public_config_svc = PublicConfigService(metadata)
50+
response: dict = public_config_svc.stat(params)
51+
return self.dict_to_message(response)

src/spaceone/config/interface/grpc/workspace_config.py

Lines changed: 0 additions & 53 deletions
This file was deleted.
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import logging
2+
3+
from spaceone.core import cache
4+
from spaceone.core import config
5+
from spaceone.core.manager import BaseManager
6+
from spaceone.core.connector.space_connector import SpaceConnector
7+
from spaceone.core.auth.jwt.jwt_util import JWTUtil
8+
9+
_LOGGER = logging.getLogger(__name__)
10+
11+
12+
class IdentityManager(BaseManager):
13+
def __init__(self, *args, **kwargs):
14+
super().__init__(*args, **kwargs)
15+
token = self.transaction.get_meta("token")
16+
self.token_type = JWTUtil.get_value_from_token(token, "typ")
17+
self.identity_conn: SpaceConnector = self.locator.get_connector(
18+
SpaceConnector, service="identity"
19+
)
20+
21+
def check_workspace(self, workspace_id: str, domain_id: str) -> None:
22+
system_token = config.get_global("TOKEN")
23+
24+
self.identity_conn.dispatch(
25+
"Workspace.check",
26+
{"workspace_id": workspace_id, "domain_id": domain_id},
27+
token=system_token,
28+
)
29+
30+
@cache.cacheable(key="inventory:project:{domain_id}:{project_id}", expire=600)
31+
def get_project(self, project_id: str, domain_id: str):
32+
if self.token_type == "SYSTEM_TOKEN":
33+
return self.identity_conn.dispatch(
34+
"Project.get", {"project_id": project_id}, x_domain_id=domain_id
35+
)
36+
else:
37+
return self.identity_conn.dispatch(
38+
"Project.get", {"project_id": project_id}
39+
)
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
import logging
2+
from typing import Tuple, Union
3+
4+
from mongoengine import QuerySet
5+
from spaceone.core.manager import BaseManager
6+
7+
from spaceone.config.model.public_config.database import PublicConfig
8+
9+
_LOGGER = logging.getLogger(__name__)
10+
11+
12+
class PublicConfigManager(BaseManager):
13+
def __init__(self, *args, **kwargs):
14+
super().__init__(*args, **kwargs)
15+
self.public_config_model = PublicConfig
16+
17+
def create_public_config(self, params: dict) -> PublicConfig:
18+
def _rollback(vo: PublicConfig) -> None:
19+
_LOGGER.info(
20+
f"[create_public_config._rollback] " f"Delete public config : {vo.name}"
21+
)
22+
vo.delete()
23+
24+
public_config_vo: PublicConfig = self.public_config_model.create(params)
25+
self.transaction.add_rollback(_rollback, public_config_vo)
26+
27+
return public_config_vo
28+
29+
def update_public_config_by_vo(
30+
self, params: dict, public_config_vo: PublicConfig
31+
) -> PublicConfig:
32+
def _rollback(old_data: dict):
33+
_LOGGER.info(
34+
f'[update_public_config_by_vo._rollback] Revert Data : {old_data["name"]}'
35+
)
36+
public_config_vo.update(old_data)
37+
38+
self.transaction.add_rollback(_rollback, public_config_vo.to_dict())
39+
40+
return public_config_vo.update(params)
41+
42+
@staticmethod
43+
def delete_public_config_by_vo(public_config_vo: PublicConfig) -> None:
44+
public_config_vo.delete()
45+
46+
def get_public_config(self, name: str, domain_id: str, workspace_id: Union[list, str, None],
47+
project_id: Union[list, str, None]) -> PublicConfig:
48+
conditions = {
49+
"name": name,
50+
"domain_id": domain_id,
51+
}
52+
if workspace_id:
53+
conditions["workspace_id"] = workspace_id
54+
if project_id:
55+
conditions["project_id"] = project_id
56+
57+
return self.public_config_model.get(**conditions)
58+
59+
def filter_public_configs(self, **conditions):
60+
return self.public_config_model.filter(**conditions)
61+
62+
def list_public_configs(self, query: dict) -> Tuple[QuerySet, int]:
63+
return self.public_config_model.query(**query)
64+
65+
def stat_public_configs(self, query: dict) -> dict:
66+
return self.public_config_model.stat(**query)

src/spaceone/config/manager/workspace_config_manager.py

Lines changed: 0 additions & 56 deletions
This file was deleted.
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
from spaceone.config.model.user_config_model import UserConfig
2-
from spaceone.config.model.workspace_config.database import WorkspaceConfig
32
from spaceone.config.model.domain_config_model import DomainConfig
3+
from spaceone.config.model.public_config.database import PublicConfig
File renamed without changes.

src/spaceone/config/model/workspace_config/database.py renamed to src/spaceone/config/model/public_config/database.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,22 +3,25 @@
33
from spaceone.core.model.mongo_model import MongoModel
44

55

6-
class WorkspaceConfig(MongoModel):
7-
name = StringField(max_length=255, unique_with=["domain_id", "workspace_id"])
6+
class PublicConfig(MongoModel):
7+
name = StringField(max_length=255, unique_with=["domain_id"])
88
data = DictField()
99
tags = DictField()
10+
resource_group = StringField(max_length=40, choices=("DOMAIN", "WORKSPACE", "PROJECT"))
11+
project_id = StringField(max_length=40)
1012
workspace_id = StringField(max_length=40)
1113
domain_id = StringField(max_length=40)
1214
created_at = DateTimeField(auto_now_add=True)
1315
updated_at = DateTimeField(auto_now=True)
1416

1517
meta = {
1618
"updatable_fields": ["name", "data", "tags", "updated_at"],
17-
"minimal_fields": ["name"],
19+
"minimal_fields": ["name", "resource_group"],
20+
"change_query_keys": {"user_projects": "project_id"},
1821
"ordering": ["name"],
1922
"indexes": [
2023
"name",
21-
"workspace_id",
2224
"domain_id",
25+
"workspace_id",
2326
],
2427
}
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
from typing import Union, Literal
2+
from pydantic import BaseModel
3+
4+
__all__ = [
5+
"PublicConfigCreateRequest",
6+
"PublicConfigUpdateRequest",
7+
"PublicConfigSetRequest",
8+
"PublicConfigDeleteRequest",
9+
"PublicConfigGetRequest",
10+
"PublicConfigSearchQueryRequest",
11+
"PublicConfigQueryRequest",
12+
]
13+
14+
ResourceGroup = Literal["DOMAIN", "WORKSPACE", "PROJECT"]
15+
16+
17+
class PublicConfigCreateRequest(BaseModel):
18+
name: str
19+
data: dict
20+
tags: Union[dict, None] = None
21+
resource_group: ResourceGroup
22+
user_projects: Union[list, None] = None
23+
project_id: Union[list, str, None] = None
24+
workspace_id: Union[list, str, None] = None
25+
domain_id: str
26+
27+
28+
class PublicConfigUpdateRequest(BaseModel):
29+
name: str
30+
data: Union[dict, None] = None
31+
tags: Union[dict, None] = None
32+
user_projects: Union[list, None] = None
33+
project_id: Union[str, None] = None
34+
workspace_id: Union[str, None] = None
35+
domain_id: str
36+
37+
38+
class PublicConfigSetRequest(BaseModel):
39+
name: str
40+
data: str
41+
tags: Union[dict, None] = None
42+
user_projects: Union[list, None] = None
43+
project_id: Union[str, None] = None
44+
workspace_id: Union[str, None] = None
45+
domain_id: str
46+
47+
48+
class PublicConfigDeleteRequest(BaseModel):
49+
name: str
50+
user_projects: Union[list, None] = None
51+
project_id: Union[str, None] = None
52+
workspace_id: Union[str, None] = None
53+
domain_id: str
54+
55+
56+
class PublicConfigGetRequest(BaseModel):
57+
name: str
58+
user_projects: Union[list, None] = None
59+
project_id: Union[list, str, None] = None
60+
workspace_id: Union[list, str, None] = None
61+
domain_id: str
62+
63+
64+
class PublicConfigSearchQueryRequest(BaseModel):
65+
query: Union[dict, None] = None
66+
name: Union[str, None] = None
67+
user_project: Union[list, None] = None
68+
project_id: Union[list, str, None] = None
69+
workspace_id: Union[list, str, None] = None
70+
domain_id: str
71+
72+
73+
class PublicConfigQueryRequest(BaseModel):
74+
query: dict
75+
workspace_id: str
76+
domain_id: str

0 commit comments

Comments
 (0)