Skip to content

Commit 6ba5fa3

Browse files
author
Youngjin Jo
authored
Merge pull request #252 from yjinjo/master
Add Agent resource and modify Service Account resource
2 parents 31ec8b4 + b6f5d00 commit 6ba5fa3

File tree

18 files changed

+693
-345
lines changed

18 files changed

+693
-345
lines changed

src/spaceone/identity/interface/grpc/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
from spaceone.identity.interface.grpc.user_group import UserGroup
2020
from spaceone.identity.interface.grpc.workspace import Workspace
2121
from spaceone.identity.interface.grpc.workspace_user import WorkspaceUser
22+
from spaceone.identity.interface.grpc.agent import Agent
2223

2324
_all_ = ["app"]
2425

@@ -43,3 +44,4 @@
4344
app.add_service(UserGroup)
4445
app.add_service(App)
4546
app.add_service(Token)
47+
app.add_service(Agent)
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
from spaceone.core.pygrpc import BaseAPI
2+
from spaceone.api.identity.v2 import agent_pb2, agent_pb2_grpc
3+
from spaceone.identity.service.agent_service import (
4+
AgentService,
5+
)
6+
7+
8+
class Agent(BaseAPI, agent_pb2_grpc.AgentServicer):
9+
pb2 = agent_pb2
10+
pb2_grpc = agent_pb2_grpc
11+
12+
def create(self, request, context):
13+
params, metadata = self.parse_request(request, context)
14+
agent_svc = AgentService(metadata)
15+
response: dict = agent_svc.create(params)
16+
return self.dict_to_message(response)
17+
18+
def enable(self, request, context):
19+
params, metadata = self.parse_request(request, context)
20+
agent_svc = AgentService(metadata)
21+
response: dict = agent_svc.enable(params)
22+
return self.dict_to_message(response)
23+
24+
def disable(self, request, context):
25+
params, metadata = self.parse_request(request, context)
26+
agent_svc = AgentService(metadata)
27+
response: dict = agent_svc.disable(params)
28+
return self.dict_to_message(response)
29+
30+
def regenerate(self, request, context):
31+
params, metadata = self.parse_request(request, context)
32+
agent_svc = AgentService(metadata)
33+
response: dict = agent_svc.regenerate(params)
34+
return self.dict_to_message(response)
35+
36+
def delete(self, request, context):
37+
params, metadata = self.parse_request(request, context)
38+
agent_svc = AgentService(metadata)
39+
agent_svc.delete(params)
40+
return self.empty()
41+
42+
def get(self, request, context):
43+
params, metadata = self.parse_request(request, context)
44+
agent_svc = AgentService(metadata)
45+
response: dict = agent_svc.get(params)
46+
return self.dict_to_message(response)
47+
48+
def list(self, request, context):
49+
params, metadata = self.parse_request(request, context)
50+
agent_svc = AgentService(metadata)
51+
response: dict = agent_svc.list(params)
52+
return self.dict_to_message(response)

src/spaceone/identity/interface/grpc/service_account.py

Lines changed: 5 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
from google.protobuf.json_format import ParseDict
22
from spaceone.core.pygrpc import BaseAPI
3-
from spaceone.api.identity.v2 import service_account_pb2, service_account_pb2_grpc, app_pb2
3+
from spaceone.api.identity.v2 import (
4+
service_account_pb2,
5+
service_account_pb2_grpc,
6+
app_pb2,
7+
)
48
from spaceone.identity.service.service_account_service import (
59
ServiceAccountService,
610
)
@@ -16,12 +20,6 @@ def create(self, request, context):
1620
response: dict = service_account_svc.create(params)
1721
return self.dict_to_message(response)
1822

19-
def create_app(self, request, context):
20-
params, metadata = self.parse_request(request, context)
21-
service_account_svc = ServiceAccountService(metadata)
22-
response: dict = service_account_svc.create_app(params)
23-
return ParseDict(response, app_pb2.AppInfo())
24-
2523
def update(self, request, context):
2624
params, metadata = self.parse_request(request, context)
2725
service_account_svc = ServiceAccountService(metadata)
@@ -46,30 +44,6 @@ def delete(self, request, context):
4644
service_account_svc.delete(params)
4745
return self.empty()
4846

49-
def enable_app(self, request, context):
50-
params, metadata = self.parse_request(request, context)
51-
service_account_svc = ServiceAccountService(metadata)
52-
response: dict = service_account_svc.enable_app(params)
53-
return ParseDict(response, app_pb2.AppInfo())
54-
55-
def disable_app(self, request, context):
56-
params, metadata = self.parse_request(request, context)
57-
service_account_svc = ServiceAccountService(metadata)
58-
response: dict = service_account_svc.disable_app(params)
59-
return ParseDict(response, app_pb2.AppInfo())
60-
61-
def regenerate_app(self, request, context):
62-
params, metadata = self.parse_request(request, context)
63-
service_account_svc = ServiceAccountService(metadata)
64-
response: dict = service_account_svc.regenerate_app(params)
65-
return ParseDict(response, app_pb2.AppInfo())
66-
67-
def delete_app(self, request, context):
68-
params, metadata = self.parse_request(request, context)
69-
service_account_svc = ServiceAccountService(metadata)
70-
service_account_svc.delete_app(params)
71-
return self.empty()
72-
7347
def get(self, request, context):
7448
params, metadata = self.parse_request(request, context)
7549
service_account_svc = ServiceAccountService(metadata)
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.identity.model import Agent
8+
9+
10+
_LOGGER = logging.getLogger(__name__)
11+
12+
13+
class AgentManager(BaseManager):
14+
def __init__(self, *args, **kwargs):
15+
super().__init__(*args, **kwargs)
16+
self.agent_model = Agent
17+
18+
def create_agent(self, params: dict) -> Agent:
19+
def _rollback(vo: Agent):
20+
_LOGGER.info(f"[create_agent._rollback] " f"Delete agent: ({vo.agent_id})")
21+
agent_vo.delete()
22+
23+
agent_vo = self.agent_model.create(params)
24+
self.transaction.add_rollback(_rollback, agent_vo)
25+
26+
return agent_vo
27+
28+
def get_agent(
29+
self,
30+
service_account_id: str,
31+
domain_id: str,
32+
workspace_id: str,
33+
user_projects: Union[list, None] = None,
34+
) -> Agent:
35+
conditions = {
36+
"service_account_id": service_account_id,
37+
"domain_id": domain_id,
38+
"workspace_id": workspace_id,
39+
}
40+
41+
if user_projects:
42+
conditions["project_id"] = user_projects
43+
44+
return self.agent_model.get(**conditions)
45+
46+
def update_agent_by_vo(self, params: dict, agent_vo: Agent) -> Agent:
47+
def _rollback(old_data):
48+
_LOGGER.info(
49+
f"[update_agent_by_vo._rollback] Revert Data : "
50+
f"{old_data['agent_id']}"
51+
)
52+
agent_vo.update(old_data)
53+
54+
self.transaction.add_rollback(_rollback, agent_vo.to_dict())
55+
56+
return agent_vo.update(params)
57+
58+
@staticmethod
59+
def delete_agent_by_vo(agent_vo: Agent) -> None:
60+
agent_vo.delete()
61+
62+
def filter_agents(self, **conditions) -> QuerySet:
63+
return self.agent_model.filter(**conditions)
64+
65+
def list_agents(self, query: dict) -> Tuple[list, int]:
66+
return self.agent_model.query(**query)

src/spaceone/identity/manager/app_manager.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,6 @@ def get_app(
5454
app_id: str,
5555
domain_id: str,
5656
workspace_id: Union[str, None] = None,
57-
service_account_id: Union[str, None] = None,
5857
) -> App:
5958
conditions = {
6059
"app_id": app_id,
@@ -64,9 +63,6 @@ def get_app(
6463
if workspace_id:
6564
conditions["workspace_id"] = workspace_id
6665

67-
if service_account_id:
68-
conditions["service_account_id"] = service_account_id
69-
7066
return self.app_model.get(**conditions)
7167

7268
def filter_apps(self, **conditions) -> QuerySet:

src/spaceone/identity/manager/service_account_manager.py

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ def update_service_account(self, params: dict) -> ServiceAccount:
3737
return self.update_service_account_by_vo(params, service_account_vo)
3838

3939
def update_service_account_by_vo(
40-
self, params: dict, service_account_vo: ServiceAccount
40+
self, params: dict, service_account_vo: ServiceAccount
4141
) -> ServiceAccount:
4242
def _rollback(old_data):
4343
_LOGGER.info(
@@ -55,11 +55,11 @@ def delete_service_account_by_vo(service_account_vo: ServiceAccount) -> None:
5555
service_account_vo.delete()
5656

5757
def get_service_account(
58-
self,
59-
service_account_id: str,
60-
domain_id: str,
61-
workspace_id: str = None,
62-
user_projects: List[str] = None,
58+
self,
59+
service_account_id: str,
60+
domain_id: str,
61+
workspace_id: str = None,
62+
user_projects: List[str] = None,
6363
) -> ServiceAccount:
6464
conditions = {"service_account_id": service_account_id, "domain_id": domain_id}
6565

@@ -81,11 +81,11 @@ def stat_service_accounts(self, query: dict) -> dict:
8181
return self.service_account_model.stat(**query)
8282

8383
def update_secret_project(
84-
self,
85-
service_account_id: str,
86-
domain_id: str,
87-
workspace_id: str,
88-
project_id: str,
84+
self,
85+
service_account_id: str,
86+
domain_id: str,
87+
workspace_id: str,
88+
project_id: str,
8989
) -> None:
9090
secret_connector: SpaceConnector = self.locator.get_connector(
9191
"SpaceConnector", service="secret"
@@ -106,7 +106,7 @@ def update_secret_project(
106106
)
107107

108108
def delete_secrets(
109-
self, service_account_id: str, domain_id: str, workspace_id: str
109+
self, service_account_id: str, domain_id: str, workspace_id: str
110110
) -> None:
111111
secret_connector: SpaceConnector = self.locator.get_connector(
112112
"SpaceConnector", service="secret"
@@ -126,7 +126,7 @@ def delete_secrets(
126126
)
127127

128128
def get_all_service_account_ids_using_secret(
129-
self, domain_id: str, workspace_id: str
129+
self, domain_id: str, workspace_id: str
130130
) -> List[str]:
131131
secret_connector: SpaceConnector = self.locator.get_connector(
132132
"SpaceConnector", service="secret"
@@ -147,10 +147,10 @@ def get_all_service_account_ids_using_secret(
147147

148148
@staticmethod
149149
def _list_secrets(
150-
secret_connector: SpaceConnector,
151-
service_account_id: str,
152-
domain_id: str,
153-
workspace_id: str,
150+
secret_connector: SpaceConnector,
151+
service_account_id: str,
152+
domain_id: str,
153+
workspace_id: str,
154154
) -> dict:
155155
return secret_connector.dispatch(
156156
"Secret.list",

src/spaceone/identity/model/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,4 @@
1313
from spaceone.identity.model.user.database import User
1414
from spaceone.identity.model.user_group.database import UserGroup
1515
from spaceone.identity.model.app.database import App
16+
from spaceone.identity.model.agent.database import Agent

src/spaceone/identity/model/agent/__init__.py

Whitespace-only changes.
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
from mongoengine import StringField, DictField, DateTimeField
2+
from spaceone.core.model.mongo_model import MongoModel
3+
4+
5+
class Agent(MongoModel):
6+
agent_id = StringField(max_length=40, generate_id="agent", unique=True)
7+
options = DictField(default=None)
8+
app_id = StringField(max_length=40)
9+
service_account_id = StringField(max_length=40)
10+
project_id = StringField(max_length=40)
11+
workspace_id = StringField(max_length=40)
12+
domain_id = StringField(max_length=40)
13+
created_at = DateTimeField(auto_now_add=True)
14+
15+
meta = {
16+
"minimal_fields": [
17+
"agent_id",
18+
"options",
19+
"service_account_id",
20+
],
21+
"change_query_keys": {"user_projects": "project_id"},
22+
"ordering": ["-created_at"],
23+
"indexes": [
24+
"service_account_id",
25+
"workspace_id",
26+
"domain_id",
27+
],
28+
}
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
from typing import Union, Literal
2+
from pydantic import BaseModel
3+
4+
5+
__all__ = [
6+
"AgentCreateRequest",
7+
"AgentEnableRequest",
8+
"AgentDisableRequest",
9+
"AgentRegenerateRequest",
10+
"AgentDeleteRequest",
11+
"AgentGetRequest",
12+
"AgentSearchQueryRequest",
13+
]
14+
15+
State = Literal["ENABLED", "DISABLED", "EXPIRED"]
16+
RoleType = Literal["DOMAIN_ADMIN", "WORKSPACE_OWNER"]
17+
18+
19+
class AgentCreateRequest(BaseModel):
20+
service_account_id: str
21+
options: Union[dict, None] = None
22+
workspace_id: str
23+
domain_id: str
24+
user_projects: Union[list, None] = None
25+
26+
27+
class AgentEnableRequest(BaseModel):
28+
service_account_id: str
29+
workspace_id: str
30+
domain_id: str
31+
user_projects: Union[list, None] = None
32+
33+
34+
class AgentDisableRequest(BaseModel):
35+
service_account_id: str
36+
workspace_id: str
37+
domain_id: str
38+
user_projects: Union[list, None] = None
39+
40+
41+
class AgentRegenerateRequest(BaseModel):
42+
service_account_id: str
43+
workspace_id: str
44+
domain_id: str
45+
user_projects: Union[list, None] = None
46+
47+
48+
class AgentDeleteRequest(BaseModel):
49+
service_account_id: str
50+
workspace_id: str
51+
domain_id: str
52+
user_projects: Union[list, None] = None
53+
54+
55+
class AgentGetRequest(BaseModel):
56+
service_account_id: str
57+
workspace_id: str
58+
domain_id: str
59+
user_projects: Union[list, None] = None
60+
61+
62+
class AgentSearchQueryRequest(BaseModel):
63+
query: Union[dict, None] = None
64+
agent_id: Union[str, None] = None
65+
state: Union[State, None] = None
66+
service_account_id: Union[str, None] = None
67+
workspace_id: Union[str, None] = None
68+
domain_id: str
69+
user_projects: Union[list, None] = None

0 commit comments

Comments
 (0)