Skip to content

Commit a0c6af9

Browse files
committed
<fix>[resourceconfig]: add APIGetResourceConfigsMsg for query
APIImpact Resolves: ZSTAC-47975 Change-Id: I6e736962676b63726a66666c6f686373786e7a71 Signed-off-by: AlanJager <[email protected]>
1 parent 4cc59ee commit a0c6af9

15 files changed

+511
-17
lines changed

conf/serviceConfig/resourceConfig.xml

+4
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,8 @@
2424
<name>org.zstack.resourceconfig.APIGetResourceConfigMsg</name>
2525
</message>
2626

27+
<message>
28+
<name>org.zstack.resourceconfig.APIGetResourceConfigsMsg</name>
29+
</message>
30+
2731
</service>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package org.zstack.resourceconfig;
2+
3+
import org.springframework.http.HttpMethod;
4+
import org.zstack.core.Platform;
5+
import org.zstack.header.message.APIParam;
6+
import org.zstack.header.message.APISyncCallMessage;
7+
import org.zstack.header.rest.RestRequest;
8+
import org.zstack.header.vo.ResourceVO;
9+
10+
import java.util.Arrays;
11+
import java.util.List;
12+
13+
@RestRequest(path = "/resource-configurations/{resourceUuid}/{category}",
14+
method = HttpMethod.GET, responseClass = APIGetResourceConfigsReply.class)
15+
public class APIGetResourceConfigsMsg extends APISyncCallMessage implements ResourceConfigMessage {
16+
@APIParam
17+
private String category;
18+
@APIParam(nonempty = true)
19+
private List<String> names;
20+
@APIParam(resourceType = ResourceVO.class, checkAccount = true)
21+
private String resourceUuid;
22+
23+
@Override
24+
public String getCategory() {
25+
return category;
26+
}
27+
28+
public void setCategory(String category) {
29+
this.category = category;
30+
}
31+
32+
@Override
33+
public String getName() {
34+
return null;
35+
}
36+
37+
@Override
38+
public List<String> getNames() {
39+
return names;
40+
}
41+
42+
public void setNames(List<String> names) {
43+
this.names = names;
44+
}
45+
46+
public String getResourceUuid() {
47+
return resourceUuid;
48+
}
49+
50+
public void setResourceUuid(String resourceUuid) {
51+
this.resourceUuid = resourceUuid;
52+
}
53+
54+
public static APIGetResourceConfigsMsg __example__() {
55+
APIGetResourceConfigsMsg msg = new APIGetResourceConfigsMsg();
56+
msg.category = "host";
57+
msg.names = Arrays.asList("cpu.overProvisioning.ratio", "reconnectAllOnBoot");
58+
msg.resourceUuid = Platform.getUuid();
59+
return msg;
60+
}
61+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
package org.zstack.resourceconfig
2+
3+
import org.zstack.resourceconfig.APIGetResourceConfigsReply
4+
5+
doc {
6+
title "GetResourceConfigs"
7+
8+
category "resourceConfig"
9+
10+
desc """查询多个资源级配置"""
11+
12+
rest {
13+
request {
14+
url "GET /v1/resource-configurations/{resourceUuid}/{category}"
15+
16+
header (Authorization: 'OAuth the-session-uuid')
17+
18+
clz APIGetResourceConfigsMsg.class
19+
20+
desc """"""
21+
22+
params {
23+
24+
column {
25+
name "category"
26+
enclosedIn ""
27+
desc "需要查询的资源级配置的category"
28+
location "url"
29+
type "String"
30+
optional false
31+
since "4.7.0"
32+
}
33+
column {
34+
name "names"
35+
enclosedIn ""
36+
desc "需要查询的资源级配置的名称"
37+
location "query"
38+
type "List"
39+
optional false
40+
since "4.7.0"
41+
}
42+
column {
43+
name "resourceUuid"
44+
enclosedIn ""
45+
desc "资源UUID"
46+
location "url"
47+
type "String"
48+
optional false
49+
since "4.7.0"
50+
}
51+
column {
52+
name "systemTags"
53+
enclosedIn ""
54+
desc "系统标签"
55+
location "query"
56+
type "List"
57+
optional true
58+
since "4.7.0"
59+
}
60+
column {
61+
name "userTags"
62+
enclosedIn ""
63+
desc "用户标签"
64+
location "query"
65+
type "List"
66+
optional true
67+
since "4.7.0"
68+
}
69+
}
70+
}
71+
72+
response {
73+
clz APIGetResourceConfigsReply.class
74+
}
75+
}
76+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package org.zstack.resourceconfig;
2+
3+
import org.zstack.header.message.APIReply;
4+
import org.zstack.header.rest.RestResponse;
5+
6+
import java.util.List;
7+
8+
@RestResponse(fieldsTo = {"configs"})
9+
public class APIGetResourceConfigsReply extends APIReply {
10+
private List<ResourceConfigStruct> configs;
11+
12+
public List<ResourceConfigStruct> getConfigs() {
13+
return configs;
14+
}
15+
16+
public void setConfigs(List<ResourceConfigStruct> configs) {
17+
this.configs = configs;
18+
}
19+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package org.zstack.resourceconfig
2+
3+
import org.zstack.header.errorcode.ErrorCode
4+
import org.zstack.resourceconfig.ResourceConfigStruct
5+
6+
doc {
7+
8+
title "查询多个资源级配置的返回"
9+
10+
field {
11+
name "success"
12+
desc ""
13+
type "boolean"
14+
since "4.7.0"
15+
}
16+
ref {
17+
name "error"
18+
path "org.zstack.resourceconfig.APIGetResourceConfigsReply.error"
19+
desc "错误码,若不为null,则表示操作失败, 操作成功时该字段为null",false
20+
type "ErrorCode"
21+
since "4.7.0"
22+
clz ErrorCode.class
23+
}
24+
ref {
25+
name "configs"
26+
path "org.zstack.resourceconfig.APIGetResourceConfigsReply.configs"
27+
desc "null"
28+
type "List"
29+
since "4.7.0"
30+
clz ResourceConfigStruct.class
31+
}
32+
}

resourceconfig/src/main/java/org/zstack/resourceconfig/ResourceConfigApiInterceptor.java

+38-8
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,10 @@
1212
import org.zstack.identity.AccountManager;
1313
import org.zstack.identity.rbac.CheckIfAccountCanAccessResource;
1414

15+
import java.util.ArrayList;
1516
import java.util.Collections;
17+
import java.util.List;
18+
import java.util.stream.Collectors;
1619

1720
import static org.zstack.core.Platform.argerr;
1821

@@ -33,21 +36,37 @@ public APIMessage intercept(APIMessage msg) throws ApiMessageInterceptionExcepti
3336

3437
if (msg instanceof APIGetResourceConfigMsg) {
3538
validate((APIGetResourceConfigMsg) msg);
39+
} else if (msg instanceof APIGetResourceConfigsMsg) {
40+
validate((APIGetResourceConfigsMsg) msg);
3641
}
3742
return msg;
3843
}
3944

4045
private void validate(ResourceConfigMessage msg) {
41-
GlobalConfig gc = gcf.getAllConfig().get(msg.getIdentity());
42-
if (gc == null) {
43-
throw new ApiMessageInterceptionException(argerr("no global config[category:%s, name:%s] found",
44-
msg.getCategory(), msg.getName()));
46+
List<String> identities = new ArrayList<>();
47+
48+
if (msg.getName() != null) {
49+
identities.add(msg.getIdentity(msg.getName()));
50+
}
51+
52+
if (msg.getNames() != null) {
53+
for (String name : msg.getNames()) {
54+
identities.add(msg.getIdentity(name));
55+
}
4556
}
4657

47-
ResourceConfig rc = rcf.getResourceConfig(gc.getIdentity());
48-
if (rc == null) {
49-
throw new ApiMessageInterceptionException(argerr("global config[category:%s, name:%s] cannot bind resource",
50-
msg.getCategory(), msg.getName()));
58+
for (String identity : identities) {
59+
GlobalConfig gc = gcf.getAllConfig().get(identity);
60+
if (gc == null) {
61+
throw new ApiMessageInterceptionException(argerr("no global config[category:%s, name:%s] found",
62+
msg.getCategory(), identity));
63+
}
64+
65+
ResourceConfig rc = rcf.getResourceConfig(gc.getIdentity());
66+
if (rc == null) {
67+
throw new ApiMessageInterceptionException(argerr("global config[category:%s, name:%s] cannot bind resource",
68+
msg.getCategory(), identity));
69+
}
5170
}
5271
}
5372

@@ -61,4 +80,15 @@ private void validate(APIGetResourceConfigMsg msg) {
6180
msg.getResourceUuid()));
6281
}
6382
}
83+
84+
private void validate(APIGetResourceConfigsMsg msg) {
85+
if (acMgr.isAdmin(msg.getSession())) {
86+
return;
87+
}
88+
89+
if (!CheckIfAccountCanAccessResource.check(Collections.singletonList(msg.getResourceUuid()), msg.getSession().getAccountUuid()).isEmpty()) {
90+
throw new ApiMessageInterceptionException(argerr("account has no access to the resource[uuid: %s]",
91+
msg.getResourceUuid()));
92+
}
93+
}
6494
}

resourceconfig/src/main/java/org/zstack/resourceconfig/ResourceConfigFacadeImpl.java

+22
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ private void handleApiMessage(APIMessage msg) {
5353
handle((APIGetResourceBindableConfigMsg) msg);
5454
} else if (msg instanceof APIGetResourceConfigMsg) {
5555
handle((APIGetResourceConfigMsg) msg);
56+
} else if (msg instanceof APIGetResourceConfigsMsg) {
57+
handle((APIGetResourceConfigsMsg) msg);
5658
} else {
5759
bus.dealWithUnknownMessage(msg);
5860
}
@@ -87,6 +89,26 @@ private void handle(APIGetResourceBindableConfigMsg msg) {
8789
bus.reply(msg, reply);
8890
}
8991

92+
private void handle(APIGetResourceConfigsMsg msg) {
93+
APIGetResourceConfigsReply reply = new APIGetResourceConfigsReply();
94+
List<String> identities = new ArrayList<>(msg.getNames().stream().map(msg::getIdentity).collect(Collectors.toList()));
95+
96+
reply.setConfigs(new ArrayList<>());
97+
for (String identity : identities) {
98+
ResourceConfig rc = getResourceConfig(identity);
99+
List<ResourceConfigInventory> configs = rc.getEffectiveResourceConfigs(msg.getResourceUuid());
100+
ResourceConfigStruct struct = new ResourceConfigStruct();
101+
struct.setEffectiveConfigs(configs);
102+
struct.setName(rc.globalConfig.getName());
103+
struct.setValue(configs.isEmpty() ? rc.defaultValue(String.class) : configs.get(0).getValue());
104+
105+
reply.getConfigs().add(struct);
106+
}
107+
108+
bus.reply(msg, reply);
109+
110+
}
111+
90112
private void handle(APIGetResourceConfigMsg msg) {
91113
ResourceConfig rc = getResourceConfig(msg.getIdentity());
92114
APIGetResourceConfigReply reply = new APIGetResourceConfigReply();

resourceconfig/src/main/java/org/zstack/resourceconfig/ResourceConfigMessage.java

+11
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,21 @@
22

33
import org.zstack.core.config.GlobalConfig;
44

5+
import java.util.List;
6+
57
public interface ResourceConfigMessage {
68
String getName();
9+
10+
default List<String> getNames() {
11+
return null;
12+
}
13+
714
String getCategory();
815
default String getIdentity() {
916
return GlobalConfig.produceIdentity(getCategory(), getName());
1017
}
18+
19+
default String getIdentity(String name) {
20+
return GlobalConfig.produceIdentity(getCategory(), name);
21+
}
1122
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package org.zstack.resourceconfig;
2+
3+
import java.util.List;
4+
5+
public class ResourceConfigStruct {
6+
private String value;
7+
private List<ResourceConfigInventory> effectiveConfigs;
8+
private String name;
9+
10+
public String getValue() {
11+
return value;
12+
}
13+
14+
public void setValue(String value) {
15+
this.value = value;
16+
}
17+
18+
public List<ResourceConfigInventory> getEffectiveConfigs() {
19+
return effectiveConfigs;
20+
}
21+
22+
public void setEffectiveConfigs(List<ResourceConfigInventory> effectiveConfigs) {
23+
this.effectiveConfigs = effectiveConfigs;
24+
}
25+
26+
public String getName() {
27+
return name;
28+
}
29+
30+
public void setName(String name) {
31+
this.name = name;
32+
}
33+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package org.zstack.resourceconfig
2+
3+
import org.zstack.resourceconfig.ResourceConfigInventory
4+
5+
doc {
6+
7+
title "资源级配置的数据结构"
8+
9+
field {
10+
name "value"
11+
desc ""
12+
type "String"
13+
since "4.7.0"
14+
}
15+
ref {
16+
name "effectiveConfigs"
17+
path "org.zstack.resourceconfig.ResourceConfigStruct.effectiveConfigs"
18+
desc "null"
19+
type "List"
20+
since "4.7.0"
21+
clz ResourceConfigInventory.class
22+
}
23+
field {
24+
name "name"
25+
desc ""
26+
type "String"
27+
since "4.7.0"
28+
}
29+
}

0 commit comments

Comments
 (0)