-
Notifications
You must be signed in to change notification settings - Fork 168
/
executioncontext.go
106 lines (89 loc) · 3.22 KB
/
executioncontext.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
package v1alpha1
import (
"context"
"github.com/caicloud/nirvana/log"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"github.com/caicloud/cyclone/pkg/common"
api "github.com/caicloud/cyclone/pkg/server/apis/v1alpha1"
"github.com/caicloud/cyclone/pkg/server/biz/integration/cluster"
"github.com/caicloud/cyclone/pkg/server/biz/usage"
svrcommon "github.com/caicloud/cyclone/pkg/server/common"
"github.com/caicloud/cyclone/pkg/server/config"
"github.com/caicloud/cyclone/pkg/server/handler"
"github.com/caicloud/cyclone/pkg/server/types"
)
// ListExecutionContexts list execution contexts of a tenant
func ListExecutionContexts(ctx context.Context, tenant string) (*types.ListResponse, error) {
var executionContexts []api.ExecutionContext
integrations, err := cluster.GetSchedulableClusters(handler.K8sClient, tenant)
if err != nil {
return nil, err
}
for _, integration := range integrations {
cluster := integration.Spec.Cluster
if cluster == nil {
log.Warningf("Cluster of integration %s is nil", integration.Name)
continue
}
pvcName := cluster.PVC
if pvcName == "" {
pvcName = svrcommon.TenantPVC(tenant)
}
executionContext := api.ExecutionContext{
Spec: api.ExecutionContextSpec{
Cluster: cluster.ClusterName,
Namespace: cluster.Namespace,
PVC: pvcName,
},
Status: api.ExecutionContextStatus{
Phase: api.ExecutionContextNotUnknown,
ReservedResources: config.Config.StorageUsageWatcher.ResourceRequirements,
},
}
if cluster.IsWorkerCluster {
overallStatus, err := getPVCOverallStatus(tenant, pvcName, cluster)
if err != nil {
log.Warningf("Get PVC status in %s/%s", cluster.ClusterName, cluster.Namespace)
} else {
executionContext.Status.PVC = overallStatus
if overallStatus.Status != nil && overallStatus.Status.Phase == corev1.ClaimBound {
executionContext.Status.Phase = api.ExecutionContextReady
} else {
executionContext.Status.Phase = api.ExecutionContextNotReady
}
}
} else {
executionContext.Status.Phase = api.ExecutionContextClosed
}
executionContexts = append(executionContexts, executionContext)
}
return types.NewListResponse(len(executionContexts), executionContexts), nil
}
func getPVCOverallStatus(tenant, pvcName string, cluster *api.ClusterSource) (overallStatus api.PVCOverallStatus, err error) {
overallStatus.Status, err = getPVCStatus(tenant, pvcName, cluster)
if err != nil {
return overallStatus, err
}
reporter, err := usage.NewPVCReporter(handler.K8sClient, tenant)
if err != nil {
log.Warningf("Create pvc reporter for tenant %s error: %v", tenant, err)
} else {
overallStatus.Usage = &api.PVCUsageStatus{
PVCUsage: reporter.ReadableUsage().PVCUsage,
UsedPercentage: reporter.OverallUsedPercentage(),
}
}
return overallStatus, nil
}
func getPVCStatus(tenant, pvcName string, cluster *api.ClusterSource) (*corev1.PersistentVolumeClaimStatus, error) {
client, err := common.NewClusterClient(&cluster.Credential, cluster.IsControlCluster)
if err != nil {
return nil, err
}
pvc, err := client.CoreV1().PersistentVolumeClaims(cluster.Namespace).Get(pvcName, metav1.GetOptions{})
if err != nil {
return nil, err
}
return &pvc.Status, nil
}