Skip to content

Commit 943a374

Browse files
committed
feat: add event list scenario
1 parent 9dc3e90 commit 943a374

File tree

14 files changed

+790
-123
lines changed

14 files changed

+790
-123
lines changed

apistructs/component_protocol.go

+1
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@ const (
120120
OnCancel OperationKey = "cancel"
121121
OnChangePageNoOperation OperationKey = "changePageNo"
122122
OnChangePageSizeOperation OperationKey = "changePageSize"
123+
OnChangeSortOperation OperationKey = "changeSort"
123124
// Issue
124125
MoveOutOperation OperationKey = "MoveOut"
125126
DragOperation OperationKey = "drag"

apistructs/steve.go

+3-54
Original file line numberDiff line numberDiff line change
@@ -17,29 +17,13 @@ import (
1717
"encoding/json"
1818
"fmt"
1919

20-
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
21-
2220
"github.com/erda-project/erda/pkg/strutil"
2321
)
2422

2523
const (
2624
SteveErrorType = "error"
2725
)
2826

29-
// SteveCollection is a resource collection returned from steve server.
30-
type SteveCollection struct {
31-
Type string `json:"type,omitempty"`
32-
Links map[string]string `json:"links"`
33-
CreateTypes map[string]string `json:"createTypes,omitempty"`
34-
Actions map[string]string `json:"actions"`
35-
ResourceType string `json:"resourceType"`
36-
Revision string `json:"revision"`
37-
Pagination *Pagination `json:"pagination,omitempty"`
38-
Continue string `json:"continue,omitempty"`
39-
// steve resources
40-
Data []SteveResource `json:"data"`
41-
}
42-
4327
var (
4428
BadRequest = SteveErrorCode{"BadRequest", 400}
4529
Unauthorized = SteveErrorCode{"Unauthorized", 401}
@@ -80,31 +64,6 @@ func (s SteveError) JSON() []byte {
8064
return data
8165
}
8266

83-
// SteveResource is a steve resource returned from steve server.
84-
type SteveResource struct {
85-
K8SResource
86-
ID string `json:"id,omitempty"`
87-
Type string `json:"type,omitempty"`
88-
Links map[string]string `json:"links"`
89-
}
90-
91-
// K8SResource is a original k8s resource.
92-
type K8SResource struct {
93-
metav1.TypeMeta
94-
Metadata metav1.ObjectMeta `json:"metadata,omitempty"`
95-
Spec interface{} `json:"spec,omitempty"`
96-
Status interface{} `json:"status,omitempty"`
97-
Extra interface{} `json:"extra,omitempty"`
98-
}
99-
100-
// Pagination used to paging query.
101-
type Pagination struct {
102-
Limit int `json:"limit,omitempty"` // maximum number of each page
103-
First string `json:"first,omitempty"` // first page link
104-
Next string `json:"next,omitempty"` // next page link
105-
Partial bool `json:"partial,omitempty"` // whether partial
106-
}
107-
10867
type K8SResType string
10968

11069
const (
@@ -114,6 +73,9 @@ const (
11473
K8SReplicaSet K8SResType = "apps.replicasets"
11574
K8SDaemonSet K8SResType = "apps.daemonsets"
11675
K8SStatefulSet K8SResType = "apps.statefulsets"
76+
K8SJob K8SResType = "batch.jobs"
77+
K8SCronJob K8SResType = "batch.cronjobs"
78+
K8SNamespace K8SResType = "namespace"
11779
K8SEvent K8SResType = "events"
11880
)
11981

@@ -152,16 +114,3 @@ func (k *SteveRequest) URLQueryString() map[string][]string {
152114
}
153115
return query
154116
}
155-
156-
func GetValue(obj interface{}, keys ...string) (interface{}, bool) {
157-
data, _ := obj.(map[string]interface{})
158-
for i, key := range keys {
159-
if i == len(keys)-1 {
160-
val, ok := data[key]
161-
return val, ok
162-
}
163-
data, _ = data[key].(map[string]interface{})
164-
}
165-
166-
return nil, false
167-
}

bundle/steve.go

+43-53
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,10 @@ import (
1818
"io/ioutil"
1919
"net/http"
2020
"reflect"
21+
"strconv"
2122

2223
"github.com/pkg/errors"
24+
"github.com/rancher/wrangler/pkg/data"
2325

2426
"github.com/erda-project/erda/apistructs"
2527
"github.com/erda-project/erda/bundle/apierrors"
@@ -31,7 +33,7 @@ import (
3133

3234
// GetSteveResource gets k8s resource from steve server.
3335
// Required fields: ClusterName, Name, Type.
34-
func (b *Bundle) GetSteveResource(req *apistructs.SteveRequest) (*apistructs.SteveResource, error) {
36+
func (b *Bundle) GetSteveResource(req *apistructs.SteveRequest) (data.Object, error) {
3537
if req.Type == "" || req.ClusterName == "" || req.Name == "" {
3638
return nil, errors.New("clusterName, name and type fields are required")
3739
}
@@ -60,20 +62,20 @@ func (b *Bundle) GetSteveResource(req *apistructs.SteveRequest) (*apistructs.Ste
6062
return nil, apierrors.ErrInvoke.InternalError(err)
6163
}
6264

63-
if err = isSteveError(data); err != nil {
64-
return nil, err
65+
obj := map[string]interface{}{}
66+
if err = json.Unmarshal(data, &obj); err != nil {
67+
return nil, apierrors.ErrInvoke.InternalError(err)
6568
}
6669

67-
var resource apistructs.SteveResource
68-
if err = json.Unmarshal(data, &resource); err != nil {
69-
return nil, apierrors.ErrInvoke.InternalError(err)
70+
if err = isSteveError(obj); err != nil {
71+
return nil, err
7072
}
71-
return &resource, nil
73+
return obj, nil
7274
}
7375

7476
// ListSteveResource lists k8s resource from steve server.
7577
// Required fields: ClusterName, Type.
76-
func (b *Bundle) ListSteveResource(req *apistructs.SteveRequest) (*apistructs.SteveCollection, error) {
78+
func (b *Bundle) ListSteveResource(req *apistructs.SteveRequest) (data.Object, error) {
7779
if req.Type == "" || req.ClusterName == "" {
7880
return nil, errors.New("clusterName and type fields are required")
7981
}
@@ -102,20 +104,20 @@ func (b *Bundle) ListSteveResource(req *apistructs.SteveRequest) (*apistructs.St
102104
return nil, apierrors.ErrInvoke.InternalError(err)
103105
}
104106

105-
if err = isSteveError(data); err != nil {
106-
return nil, err
107+
obj := map[string]interface{}{}
108+
if err = json.Unmarshal(data, &obj); err != nil {
109+
return nil, apierrors.ErrInvoke.InternalError(err)
107110
}
108111

109-
var collection apistructs.SteveCollection
110-
if err = json.Unmarshal(data, &collection); err != nil {
111-
return nil, apierrors.ErrInvoke.InternalError(err)
112+
if err = isSteveError(obj); err != nil {
113+
return nil, err
112114
}
113-
return &collection, nil
115+
return obj, nil
114116
}
115117

116118
// UpdateSteveResource update a k8s resource described by req.Obj from steve server.
117119
// Required fields: ClusterName, Type, Name, Obj
118-
func (b *Bundle) UpdateSteveResource(req *apistructs.SteveRequest) (*apistructs.SteveResource, error) {
120+
func (b *Bundle) UpdateSteveResource(req *apistructs.SteveRequest) (data.Object, error) {
119121
if req.Type == "" || req.ClusterName == "" || req.Name == "" {
120122
return nil, errors.New("clusterName, name and type fields are required")
121123
}
@@ -146,20 +148,20 @@ func (b *Bundle) UpdateSteveResource(req *apistructs.SteveRequest) (*apistructs.
146148
return nil, apierrors.ErrInvoke.InternalError(err)
147149
}
148150

149-
if err = isSteveError(data); err != nil {
150-
return nil, err
151+
obj := map[string]interface{}{}
152+
if err = json.Unmarshal(data, &obj); err != nil {
153+
return nil, apierrors.ErrInvoke.InternalError(err)
151154
}
152155

153-
var resource apistructs.SteveResource
154-
if err = json.Unmarshal(data, &resource); err != nil {
155-
return nil, apierrors.ErrInvoke.InternalError(err)
156+
if err = isSteveError(obj); err != nil {
157+
return nil, err
156158
}
157-
return &resource, nil
159+
return obj, nil
158160
}
159161

160162
// CreateSteveResource creates a k8s resource described by req.Obj from steve server.
161163
// Required fields: ClusterName, Type, Obj
162-
func (b *Bundle) CreateSteveResource(req *apistructs.SteveRequest) (*apistructs.SteveResource, error) {
164+
func (b *Bundle) CreateSteveResource(req *apistructs.SteveRequest) (data.Object, error) {
163165
if req.Type == "" || req.ClusterName == "" {
164166
return nil, errors.New("clusterName and type fields are required")
165167
}
@@ -190,15 +192,15 @@ func (b *Bundle) CreateSteveResource(req *apistructs.SteveRequest) (*apistructs.
190192
return nil, apierrors.ErrInvoke.InternalError(err)
191193
}
192194

193-
if err = isSteveError(data); err != nil {
194-
return nil, err
195+
obj := map[string]interface{}{}
196+
if err = json.Unmarshal(data, &obj); err != nil {
197+
return nil, apierrors.ErrInvoke.InternalError(err)
195198
}
196199

197-
var resource apistructs.SteveResource
198-
if err = json.Unmarshal(data, &resource); err != nil {
199-
return nil, apierrors.ErrInvoke.InternalError(err)
200+
if err = isSteveError(obj); err != nil {
201+
return nil, err
200202
}
201-
return &resource, nil
203+
return obj, nil
202204
}
203205

204206
// DeleteSteveResource delete a k8s resource from steve server.
@@ -231,39 +233,27 @@ func (b *Bundle) DeleteSteveResource(req *apistructs.SteveRequest) error {
231233
return apierrors.ErrInvoke.InternalError(err)
232234
}
233235

234-
return isSteveError(data)
236+
obj := map[string]interface{}{}
237+
if err = json.Unmarshal(data, &obj); err != nil {
238+
return apierrors.ErrInvoke.InternalError(err)
239+
}
240+
return isSteveError(obj)
235241
}
236242

237243
func isObjInvalid(obj interface{}) bool {
238244
v := reflect.ValueOf(obj)
239245
return v.Kind() == reflect.Ptr && !v.IsNil()
240246
}
241247

242-
func isSteveError(data []byte) error {
243-
if len(data) == 0 {
244-
return nil
245-
}
246-
var obj map[string]interface{}
247-
err := json.Unmarshal(data, &obj)
248-
if err != nil {
249-
return apierrors.ErrInvoke.InternalError(err)
250-
}
251-
252-
typ, ok := obj["type"].(string)
253-
if !ok {
254-
return apierrors.ErrInvoke.InternalError(errors.New("type field is null"))
255-
}
256-
257-
if typ != apistructs.SteveErrorType {
248+
func isSteveError(obj data.Object) error {
249+
if obj.String("type") != "error" {
258250
return nil
259251
}
260-
261-
var steveErr apistructs.SteveError
262-
if err = json.Unmarshal(data, &steveErr); err != nil {
263-
return apierrors.ErrInvoke.InternalError(err)
264-
}
265-
return toAPIError(steveErr.Status, apistructs.ErrorResponse{
266-
Code: steveErr.Code,
267-
Msg: steveErr.Message,
252+
status, _ := strconv.ParseInt(obj.String("status"), 10, 64)
253+
code := obj.String("code")
254+
message := obj.String("message")
255+
return toAPIError(int(status), apistructs.ErrorResponse{
256+
Code: code,
257+
Msg: message,
268258
})
269259
}

bundle/steve_node.go

+7-1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
package bundle
1515

1616
import (
17+
"encoding/json"
1718
"errors"
1819
"io/ioutil"
1920
"net/http"
@@ -56,7 +57,12 @@ func (b *Bundle) PatchNode(req *apistructs.SteveRequest) error {
5657
if err != nil {
5758
return apierrors.ErrInvoke.InternalError(err)
5859
}
59-
return isSteveError(data)
60+
61+
obj := map[string]interface{}{}
62+
if err = json.Unmarshal(data, &obj); err != nil {
63+
return apierrors.ErrInvoke.InternalError(err)
64+
}
65+
return isSteveError(obj)
6066
}
6167

6268
// LabelNode labels a node.

modules/cmp/steve/aggregator.go

-5
Original file line numberDiff line numberDiff line change
@@ -225,11 +225,6 @@ func (a *Aggregator) ServeHTTP(rw http.ResponseWriter, req *http.Request) {
225225
a.Add(cluster)
226226
if s, ok = a.servers.Load(cluster.Name); !ok {
227227
rw.WriteHeader(http.StatusInternalServerError)
228-
rw.Write(apistructs.SteveError{
229-
SteveErrorCode: apistructs.ServerError,
230-
Type: "error",
231-
Message: "Internal server error",
232-
}.JSON())
233228
rw.Write(apistructs.NewSteveError(apistructs.ServerError, "Internal server error").JSON())
234229
}
235230
}

modules/openapi/api/apis/cmp/cmp_k8s_create.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@
1414
package cmp
1515

1616
import (
17-
"github.com/erda-project/erda/apistructs"
17+
"github.com/rancher/apiserver/pkg/types"
18+
1819
"github.com/erda-project/erda/modules/openapi/api/apis"
1920
)
2021

@@ -28,7 +29,6 @@ var CMP_STEVE_CREATE = apis.ApiSpec{
2829
Audit: nil,
2930
CheckLogin: true,
3031
Doc: "create a k8s resource",
31-
RequestType: apistructs.K8SResource{},
32-
ResponseType: apistructs.SteveCollection{},
32+
ResponseType: types.RawResource{},
3333
IsOpenAPI: true,
3434
}

modules/openapi/api/apis/cmp/cmp_k8s_get.go

+3-2
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@
1414
package cmp
1515

1616
import (
17-
"github.com/erda-project/erda/apistructs"
17+
"github.com/rancher/apiserver/pkg/types"
18+
1819
"github.com/erda-project/erda/modules/openapi/api/apis"
1920
)
2021

@@ -28,6 +29,6 @@ var CMP_STEVE_GET = apis.ApiSpec{
2829
Audit: nil,
2930
CheckLogin: true,
3031
Doc: "get a k8s resource",
31-
ResponseType: apistructs.SteveResource{},
32+
ResponseType: types.RawResource{},
3233
IsOpenAPI: true,
3334
}

modules/openapi/api/apis/cmp/cmp_k8s_list.go

+3-2
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@
1414
package cmp
1515

1616
import (
17-
"github.com/erda-project/erda/apistructs"
17+
"github.com/rancher/apiserver/pkg/types"
18+
1819
"github.com/erda-project/erda/modules/openapi/api/apis"
1920
)
2021

@@ -28,6 +29,6 @@ var CMP_STEVE_LIST = apis.ApiSpec{
2829
Audit: nil,
2930
CheckLogin: true,
3031
Doc: "list a type of k8s resource",
31-
ResponseType: apistructs.SteveCollection{},
32+
ResponseType: types.GenericCollection{},
3233
IsOpenAPI: true,
3334
}

modules/openapi/api/apis/cmp/cmp_k8s_update.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@
1414
package cmp
1515

1616
import (
17-
"github.com/erda-project/erda/apistructs"
17+
"github.com/rancher/apiserver/pkg/types"
18+
1819
"github.com/erda-project/erda/modules/openapi/api/apis"
1920
)
2021

@@ -28,7 +29,6 @@ var CMP_STEVE_UPDATE = apis.ApiSpec{
2829
Audit: nil,
2930
CheckLogin: true,
3031
Doc: "update a k8s resource",
31-
RequestType: apistructs.K8SResource{},
32-
ResponseType: apistructs.SteveResource{},
32+
ResponseType: types.RawResource{},
3333
IsOpenAPI: true,
3434
}

0 commit comments

Comments
 (0)