Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
水淹萌龙
kubesphere
提交
5c322256
K
kubesphere
项目概览
水淹萌龙
/
kubesphere
与 Fork 源项目一致
Fork自
KubeSphere / kubesphere
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
K
kubesphere
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
5c322256
编写于
5月 15, 2019
作者:
J
Jeff
提交者:
zryfish
5月 15, 2019
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
add quota left to namespace quota
上级
322ba8be
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
59 addition
and
19 deletion
+59
-19
pkg/apis/resources/v1alpha2/register.go
pkg/apis/resources/v1alpha2/register.go
+1
-0
pkg/models/quotas/quotas.go
pkg/models/quotas/quotas.go
+58
-19
未找到文件。
pkg/apis/resources/v1alpha2/register.go
浏览文件 @
5c322256
...
...
@@ -180,6 +180,7 @@ func addWebService(c *restful.Container) error {
webservice
.
Route
(
webservice
.
GET
(
"/quotas"
)
.
To
(
quotas
.
GetClusterQuotas
)
.
Deprecate
()
.
Doc
(
"get whole cluster's resource usage"
)
.
Writes
(
models
.
ResourceQuota
{})
.
Metadata
(
restfulspec
.
KeyOpenAPITags
,
tags
))
...
...
pkg/models/quotas/quotas.go
浏览文件 @
5c322256
...
...
@@ -37,18 +37,33 @@ const (
servicesKey
=
"count/services"
statefulsetsKey
=
"count/statefulsets.apps"
persistentvolumeclaimsKey
=
"persistentvolumeclaims"
storageClassesKey
=
"count/storageClass"
namespaceKey
=
"count/namespace"
jobsKey
=
"count/jobs.batch"
cronJobsKey
=
"count/cronjobs.batch"
)
type
NamespacedResourceQuota
struct
{
Namespace
string
`json:"namespace,omitempty"`
Data
struct
{
v1
.
ResourceQuotaStatus
// quota left status, do the math on the side, cause it's
// a lot easier with go-client library
Left
v1
.
ResourceList
`json:"left,omitempty"`
}
`json:"data,omitempty"`
}
var
(
resourceMap
=
map
[
string
]
string
{
daemonsetsKey
:
resources
.
DaemonSets
,
deploymentsKey
:
resources
.
Deployments
,
ingressKey
:
resources
.
Ingresses
,
servicesKey
:
resources
.
Services
,
statefulsetsKey
:
resources
.
StatefulSets
,
persistentvolumeclaimsKey
:
resources
.
PersistentVolumeClaims
,
podsKey
:
resources
.
Pods
,
namespaceKey
:
resources
.
Namespaces
,
storageClassesKey
:
resources
.
StorageClasses
,
jobsKey
:
resources
.
Jobs
,
cronJobsKey
:
resources
.
CronJobs
}
resourceMap
=
map
[
string
]
string
{
daemonsetsKey
:
resources
.
DaemonSets
,
deploymentsKey
:
resources
.
Deployments
,
ingressKey
:
resources
.
Ingresses
,
servicesKey
:
resources
.
Services
,
statefulsetsKey
:
resources
.
StatefulSets
,
persistentvolumeclaimsKey
:
resources
.
PersistentVolumeClaims
,
podsKey
:
resources
.
Pods
,
jobsKey
:
resources
.
Jobs
,
cronJobsKey
:
resources
.
CronJobs
}
)
func
getUsage
(
namespace
,
resource
string
)
(
int
,
error
)
{
...
...
@@ -61,12 +76,14 @@ func getUsage(namespace, resource string) (int, error) {
}
if
err
!=
nil
{
glog
.
Error
(
err
)
return
0
,
err
}
return
result
.
TotalCount
,
nil
}
// no one use this api anymore, marked as deprecated
func
GetClusterQuotas
()
(
*
models
.
ResourceQuota
,
error
)
{
quota
:=
v1
.
ResourceQuotaStatus
{
Hard
:
make
(
v1
.
ResourceList
),
Used
:
make
(
v1
.
ResourceList
)}
...
...
@@ -85,7 +102,7 @@ func GetClusterQuotas() (*models.ResourceQuota, error) {
}
func
GetNamespaceQuotas
(
namespace
string
)
(
*
models
.
ResourceQuota
,
error
)
{
func
GetNamespaceQuotas
(
namespace
string
)
(
*
Namespaced
ResourceQuota
,
error
)
{
quota
,
err
:=
getNamespaceResourceQuota
(
namespace
)
if
err
!=
nil
{
glog
.
Error
(
err
)
...
...
@@ -95,23 +112,43 @@ func GetNamespaceQuotas(namespace string) (*models.ResourceQuota, error) {
quota
=
&
v1
.
ResourceQuotaStatus
{
Hard
:
make
(
v1
.
ResourceList
),
Used
:
make
(
v1
.
ResourceList
)}
}
for
k
,
v
:=
range
resourceMap
{
if
_
,
exist
:=
quota
.
Used
[
v1
.
ResourceName
(
k
)];
!
exist
{
if
k
==
namespaceKey
||
k
==
storageClassesKey
{
continue
var
resourceQuotaLeft
=
v1
.
ResourceList
{}
for
key
,
hardLimit
:=
range
quota
.
Hard
{
if
used
,
ok
:=
quota
.
Used
[
key
];
ok
{
left
:=
hardLimit
.
DeepCopy
()
left
.
Sub
(
used
)
if
hardLimit
.
Cmp
(
used
)
<
0
{
left
=
resource
.
MustParse
(
"0"
)
}
used
,
err
:=
getUsage
(
namespace
,
v
)
resourceQuotaLeft
[
key
]
=
left
}
}
// add extra quota usage, cause user may not specify them
for
key
,
val
:=
range
resourceMap
{
// only add them when they don't exist in quotastatus
if
_
,
ok
:=
quota
.
Used
[
v1
.
ResourceName
(
key
)];
!
ok
{
used
,
err
:=
getUsage
(
namespace
,
val
)
if
err
!=
nil
{
glog
.
Error
(
err
)
return
nil
,
err
}
var
quantity
resource
.
Quantity
quantity
.
Set
(
int64
(
used
))
quota
.
Used
[
v1
.
ResourceName
(
k
)]
=
quantity
quota
.
Used
[
v1
.
ResourceName
(
key
)]
=
*
(
resource
.
NewQuantity
(
int64
(
used
),
resource
.
DecimalSI
))
}
}
return
&
models
.
ResourceQuota
{
Namespace
:
namespace
,
Data
:
*
quota
},
nil
var
result
=
NamespacedResourceQuota
{
Namespace
:
namespace
,
}
result
.
Data
.
Hard
=
quota
.
Hard
result
.
Data
.
Used
=
quota
.
Used
result
.
Data
.
Left
=
resourceQuotaLeft
return
&
result
,
nil
}
func
updateNamespaceQuota
(
tmpResourceList
,
resourceList
v1
.
ResourceList
)
{
...
...
@@ -127,14 +164,16 @@ func updateNamespaceQuota(tmpResourceList, resourceList v1.ResourceList) {
tmpResourceList
[
res
]
=
usage
}
}
}
func
getNamespaceResourceQuota
(
namespace
string
)
(
*
v1
.
ResourceQuotaStatus
,
error
)
{
resourceQuotaLister
:=
informers
.
SharedInformerFactory
()
.
Core
()
.
V1
()
.
ResourceQuotas
()
.
Lister
()
quotaList
,
err
:=
resourceQuotaLister
.
ResourceQuotas
(
namespace
)
.
List
(
labels
.
Everything
())
if
err
!=
nil
||
len
(
quotaList
)
==
0
{
if
err
!=
nil
{
glog
.
Error
(
err
)
return
nil
,
err
}
else
if
len
(
quotaList
)
==
0
{
return
nil
,
nil
}
quotaStatus
:=
v1
.
ResourceQuotaStatus
{
Hard
:
make
(
v1
.
ResourceList
),
Used
:
make
(
v1
.
ResourceList
)}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录