Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
MeterSphere
metersphere
提交
ac369fea
M
metersphere
项目概览
MeterSphere
/
metersphere
上一次同步 大约 3 年
通知
25
Star
1
Fork
1
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
M
metersphere
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
ac369fea
编写于
3月 24, 2020
作者:
C
Captain.B
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
关于并发数
上级
db211cb7
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
112 addition
and
77 deletion
+112
-77
backend/src/main/java/io/metersphere/engine/AbstractEngine.java
...d/src/main/java/io/metersphere/engine/AbstractEngine.java
+81
-0
backend/src/main/java/io/metersphere/engine/docker/DockerTestEngine.java
...n/java/io/metersphere/engine/docker/DockerTestEngine.java
+27
-9
backend/src/main/java/io/metersphere/engine/kubernetes/KubernetesTestEngine.java
...o/metersphere/engine/kubernetes/KubernetesTestEngine.java
+4
-68
未找到文件。
backend/src/main/java/io/metersphere/engine/AbstractEngine.java
0 → 100644
浏览文件 @
ac369fea
package
io.metersphere.engine
;
import
com.alibaba.fastjson.JSON
;
import
com.alibaba.fastjson.JSONArray
;
import
com.alibaba.fastjson.JSONObject
;
import
io.metersphere.base.domain.FileMetadata
;
import
io.metersphere.base.domain.LoadTestWithBLOBs
;
import
io.metersphere.base.domain.TestResource
;
import
io.metersphere.base.domain.TestResourcePool
;
import
io.metersphere.commons.constants.ResourcePoolTypeEnum
;
import
io.metersphere.commons.constants.TestStatus
;
import
io.metersphere.commons.exception.MSException
;
import
io.metersphere.commons.utils.CommonBeanFactory
;
import
io.metersphere.service.LoadTestService
;
import
io.metersphere.service.TestResourcePoolService
;
import
io.metersphere.service.TestResourceService
;
import
org.apache.commons.collections.CollectionUtils
;
import
org.apache.commons.lang3.StringUtils
;
import
java.util.List
;
public
abstract
class
AbstractEngine
implements
Engine
{
protected
FileMetadata
jmxFile
;
protected
List
<
FileMetadata
>
csvFiles
;
protected
LoadTestWithBLOBs
loadTest
;
protected
LoadTestService
loadTestService
;
protected
Integer
threadNum
;
protected
List
<
TestResource
>
resourceList
;
@Override
public
boolean
init
(
LoadTestWithBLOBs
loadTest
,
FileMetadata
fileMetadata
,
List
<
FileMetadata
>
csvFiles
)
{
this
.
loadTest
=
loadTest
;
this
.
jmxFile
=
fileMetadata
;
this
.
csvFiles
=
csvFiles
;
TestResourcePoolService
testResourcePoolService
=
CommonBeanFactory
.
getBean
(
TestResourcePoolService
.
class
);
TestResourceService
testResourceService
=
CommonBeanFactory
.
getBean
(
TestResourceService
.
class
);
this
.
loadTestService
=
CommonBeanFactory
.
getBean
(
LoadTestService
.
class
);
String
loadConfiguration
=
loadTest
.
getLoadConfiguration
();
JSONArray
jsonArray
=
JSON
.
parseArray
(
loadConfiguration
);
for
(
int
i
=
0
;
i
<
jsonArray
.
size
();
i
++)
{
JSONObject
o
=
jsonArray
.
getJSONObject
(
i
);
if
(
StringUtils
.
equals
(
o
.
getString
(
"key"
),
"TargetLevel"
))
{
threadNum
=
o
.
getInteger
(
"value"
);
}
}
String
resourcePoolId
=
loadTest
.
getTestResourcePoolId
();
if
(
StringUtils
.
isBlank
(
resourcePoolId
))
{
MSException
.
throwException
(
"Resource Pool ID is empty"
);
}
TestResourcePool
resourcePool
=
testResourcePoolService
.
getResourcePool
(
resourcePoolId
);
if
(
resourcePool
==
null
)
{
MSException
.
throwException
(
"Resource Pool is empty"
);
}
if
(!
ResourcePoolTypeEnum
.
K8S
.
name
().
equals
(
resourcePool
.
getType
()))
{
MSException
.
throwException
(
"Invalid Resource Pool type."
);
}
this
.
resourceList
=
testResourceService
.
getResourcesByPoolId
(
resourcePool
.
getId
());
if
(
CollectionUtils
.
isEmpty
(
this
.
resourceList
))
{
MSException
.
throwException
(
"Test Resource is empty"
);
}
return
true
;
}
protected
Integer
getSumThreadNum
()
{
List
<
LoadTestWithBLOBs
>
loadTests
=
loadTestService
.
selectByTestResourcePoolId
(
loadTest
.
getTestResourcePoolId
());
// 使用当前资源池正在运行的测试占用的并发数
return
loadTests
.
stream
().
filter
(
t
->
TestStatus
.
Running
.
name
().
equals
(
t
.
getStatus
())).
map
(
t
->
{
Integer
s
=
0
;
String
loadConfiguration
=
t
.
getLoadConfiguration
();
JSONArray
jsonArray
=
JSON
.
parseArray
(
loadConfiguration
);
for
(
int
i
=
0
;
i
<
jsonArray
.
size
();
i
++)
{
JSONObject
o
=
jsonArray
.
getJSONObject
(
i
);
if
(
StringUtils
.
equals
(
o
.
getString
(
"key"
),
"TargetLevel"
))
{
s
=
o
.
getInteger
(
"value"
);
}
}
return
s
;
}).
reduce
(
Integer:
:
sum
).
orElse
(
0
);
}
}
backend/src/main/java/io/metersphere/engine/docker/DockerTestEngine.java
浏览文件 @
ac369fea
package
io.metersphere.engine.docker
;
import
com.alibaba.fastjson.JSON
;
import
io.metersphere.base.domain.FileMetadata
;
import
io.metersphere.base.domain.LoadTestWithBLOBs
;
import
io.metersphere.commons.exception.MSException
;
import
io.metersphere.commons.utils.CommonBeanFactory
;
import
io.metersphere.controller.request.TestRequest
;
import
io.metersphere.engine.Engine
;
import
io.metersphere.dto.NodeDTO
;
import
io.metersphere.engine.AbstractEngine
;
import
io.metersphere.engine.EngineContext
;
import
io.metersphere.engine.EngineFactory
;
import
org.apache.commons.lang3.StringUtils
;
import
org.springframework.web.client.RestTemplate
;
import
java.util.HashMap
;
import
java.util.List
;
public
class
DockerTestEngine
implements
Engine
{
private
EngineContext
context
;
public
class
DockerTestEngine
extends
AbstractEngine
{
private
RestTemplate
restTemplate
;
RestTemplate
restTemplate
;
@Override
public
boolean
init
(
EngineContext
context
)
{
public
boolean
init
(
LoadTestWithBLOBs
loadTest
,
FileMetadata
fileMetadata
,
List
<
FileMetadata
>
csvFiles
)
{
super
.
init
(
loadTest
,
fileMetadata
,
csvFiles
);
this
.
restTemplate
=
CommonBeanFactory
.
getBean
(
RestTemplate
.
class
);
// todo 初始化操作
this
.
context
=
context
;
return
true
;
}
@Override
public
void
start
()
{
Integer
runningSumThreadNum
=
getSumThreadNum
();
Integer
integer
=
resourceList
.
stream
().
map
(
r
->
{
NodeDTO
nodeDTO
=
JSON
.
parseObject
(
r
.
getConfiguration
(),
NodeDTO
.
class
);
return
nodeDTO
.
getMaxConcurrency
();
}).
reduce
(
Integer:
:
sum
).
orElse
(
0
);
// todo 运行测试
// RestTemplate restTemplate = new RestTemplate();
EngineContext
context
=
null
;
try
{
context
=
EngineFactory
.
createContext
(
loadTest
,
jmxFile
,
csvFiles
);
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
String
testId
=
context
.
getTestId
();
String
content
=
context
.
getContent
();
...
...
@@ -42,7 +60,7 @@ public class DockerTestEngine implements Engine {
List
containerList
=
restTemplate
.
getForObject
(
taskStatusUri
,
List
.
class
);
for
(
int
i
=
0
;
i
<
containerList
.
size
();
i
++)
{
HashMap
h
=
(
HashMap
)
containerList
.
get
(
i
);
if
(
StringUtils
.
equals
((
String
)
h
.
get
(
"State"
),
"running"
))
{
if
(
StringUtils
.
equals
((
String
)
h
.
get
(
"State"
),
"running"
))
{
MSException
.
throwException
(
"the test is running!"
);
}
}
...
...
@@ -55,7 +73,7 @@ public class DockerTestEngine implements Engine {
// TODO 停止运行测试
// RestTemplate restTemplate = new RestTemplate();
String
testId
=
context
.
getTes
tId
();
String
testId
=
loadTest
.
ge
tId
();
String
uri
=
"http://localhost:8082/jmeter/container/stop/"
+
testId
;
restTemplate
.
postForObject
(
uri
,
""
,
String
.
class
);
...
...
backend/src/main/java/io/metersphere/engine/kubernetes/KubernetesTestEngine.java
浏览文件 @
ac369fea
package
io.metersphere.engine.kubernetes
;
import
com.alibaba.fastjson.JSON
;
import
com.alibaba.fastjson.JSONArray
;
import
com.alibaba.fastjson.JSONObject
;
import
io.fabric8.kubernetes.api.model.ConfigMap
;
import
io.fabric8.kubernetes.api.model.ObjectMeta
;
import
io.fabric8.kubernetes.client.KubernetesClient
;
import
io.metersphere.base.domain.FileMetadata
;
import
io.metersphere.base.domain.LoadTestWithBLOBs
;
import
io.metersphere.base.domain.TestResource
;
import
io.metersphere.base.domain.TestResourcePool
;
import
io.metersphere.commons.constants.ResourcePoolTypeEnum
;
import
io.metersphere.commons.constants.TestStatus
;
import
io.metersphere.commons.exception.MSException
;
import
io.metersphere.commons.utils.CommonBeanFactory
;
import
io.metersphere.commons.utils.LogUtil
;
import
io.metersphere.engine.Engine
;
import
io.metersphere.engine.
Abstract
Engine
;
import
io.metersphere.engine.EngineContext
;
import
io.metersphere.engine.EngineFactory
;
import
io.metersphere.engine.kubernetes.crds.jmeter.Jmeter
;
import
io.metersphere.engine.kubernetes.crds.jmeter.JmeterSpec
;
import
io.metersphere.engine.kubernetes.provider.ClientCredential
;
import
io.metersphere.engine.kubernetes.provider.KubernetesProvider
;
import
io.metersphere.service.LoadTestService
;
import
io.metersphere.service.TestResourcePoolService
;
import
io.metersphere.service.TestResourceService
;
import
org.apache.commons.collections.CollectionUtils
;
import
org.apache.commons.collections.MapUtils
;
import
org.apache.commons.lang3.StringUtils
;
import
java.util.HashMap
;
import
java.util.List
;
public
class
KubernetesTestEngine
implements
Engine
{
private
FileMetadata
jmxFile
;
private
List
<
FileMetadata
>
csvFiles
;
private
LoadTestWithBLOBs
loadTest
;
private
LoadTestService
loadTestService
;
private
Integer
threadNum
;
private
String
resourcePoolId
;
private
List
<
TestResource
>
resourceList
;
public
class
KubernetesTestEngine
extends
AbstractEngine
{
@Override
public
boolean
init
(
LoadTestWithBLOBs
loadTest
,
FileMetadata
fileMetadata
,
List
<
FileMetadata
>
csvFiles
)
{
this
.
loadTest
=
loadTest
;
this
.
jmxFile
=
fileMetadata
;
this
.
csvFiles
=
csvFiles
;
TestResourcePoolService
testResourcePoolService
=
CommonBeanFactory
.
getBean
(
TestResourcePoolService
.
class
);
TestResourceService
testResourceService
=
CommonBeanFactory
.
getBean
(
TestResourceService
.
class
);
this
.
loadTestService
=
CommonBeanFactory
.
getBean
(
LoadTestService
.
class
);
String
loadConfiguration
=
loadTest
.
getLoadConfiguration
();
JSONArray
jsonArray
=
JSON
.
parseArray
(
loadConfiguration
);
for
(
int
i
=
0
;
i
<
jsonArray
.
size
();
i
++)
{
JSONObject
o
=
jsonArray
.
getJSONObject
(
i
);
if
(
StringUtils
.
equals
(
"resourcePoolId"
,
o
.
getString
(
"key"
)))
{
resourcePoolId
=
o
.
getString
(
"value"
);
}
if
(
StringUtils
.
equals
(
o
.
getString
(
"key"
),
"TargetLevel"
))
{
threadNum
=
o
.
getInteger
(
"value"
);
}
}
if
(
StringUtils
.
isBlank
(
resourcePoolId
))
{
MSException
.
throwException
(
"Resource Pool ID is empty"
);
}
TestResourcePool
resourcePool
=
testResourcePoolService
.
getResourcePool
(
resourcePoolId
);
if
(
resourcePool
==
null
)
{
MSException
.
throwException
(
"Resource Pool is empty"
);
}
if
(!
ResourcePoolTypeEnum
.
K8S
.
name
().
equals
(
resourcePool
.
getType
()))
{
MSException
.
throwException
(
"Invalid Resource Pool type."
);
}
this
.
resourceList
=
testResourceService
.
getResourcesByPoolId
(
resourcePool
.
getId
());
if
(
CollectionUtils
.
isEmpty
(
this
.
resourceList
))
{
MSException
.
throwException
(
"Test Resource is empty"
);
}
super
.
init
(
loadTest
,
fileMetadata
,
csvFiles
);
return
true
;
}
@Override
public
void
start
()
{
Integer
sumThreadNum
=
getSumThreadNum
();
// resourceList size 1
List
<
LoadTestWithBLOBs
>
loadTests
=
loadTestService
.
selectByTestResourcePoolId
(
resourcePoolId
);
// 使用当前资源池正在运行的测试占用的并发数
Integer
sumThreadNum
=
loadTests
.
stream
().
filter
(
t
->
TestStatus
.
Running
.
name
().
equals
(
t
.
getStatus
())).
map
(
t
->
{
Integer
s
=
0
;
String
loadConfiguration
=
t
.
getLoadConfiguration
();
JSONArray
jsonArray
=
JSON
.
parseArray
(
loadConfiguration
);
for
(
int
i
=
0
;
i
<
jsonArray
.
size
();
i
++)
{
JSONObject
o
=
jsonArray
.
getJSONObject
(
i
);
if
(
StringUtils
.
equals
(
o
.
getString
(
"key"
),
"TargetLevel"
))
{
s
=
o
.
getInteger
(
"value"
);
}
}
return
s
;
}).
reduce
(
Integer:
:
sum
).
orElse
(
0
);
resourceList
.
forEach
(
r
->
{
String
configuration
=
r
.
getConfiguration
();
ClientCredential
clientCredential
=
JSON
.
parseObject
(
configuration
,
ClientCredential
.
class
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录