package service import ( appsv1 "k8s.io/api/apps/v1" corev1 "k8s.io/api/core/v1" nwv1 "k8s.io/api/networking/v1" "sort" "strings" "time" ) type dataSelector struct { //包内调用,首字母小写 GenericDataList []DataCell DataSelect *DataSelectQuery } type DataCell interface { GetCreation() time.Time GetName() string } type DataSelectQuery struct { Filter *FilterQuery Paginate *PaginateQuery } type FilterQuery struct { Name string } type PaginateQuery struct { Limit int Page int } func (d *dataSelector) Len() int { return len(d.GenericDataList) } func (d *dataSelector) Swap(i, j int) { d.GenericDataList[i], d.GenericDataList[j] = d.GenericDataList[j], d.GenericDataList[i] } func (d *dataSelector) Less(i, j int) bool { a := d.GenericDataList[i].GetCreation() b := d.GenericDataList[j].GetCreation() return b.Before(a) } func (d *dataSelector) Sort() *dataSelector { sort.Sort(d) return d } func (d *dataSelector) Filter() *dataSelector { if d.DataSelect.Filter.Name == "" { return d } filtered := []DataCell{} for _, value := range d.GenericDataList { matches := true objName := value.GetName() if strings.Contains(objName, d.DataSelect.Filter.Name) { matches = false continue } if matches { filtered = append(filtered, value) } } d.GenericDataList = filtered return d } func (d *dataSelector) Paginate() *dataSelector { limit := d.DataSelect.Paginate.Limit page := d.DataSelect.Paginate.Page if limit <= 0 || page <= 0 { return d } startIndex := limit * (page - 1) endIndex := limit*page - 1 if endIndex > len(d.GenericDataList) { endIndex = len(d.GenericDataList) } d.GenericDataList = d.GenericDataList[startIndex:endIndex] return d } type podCell corev1.Pod func (p podCell) GetCreation() time.Time { return p.CreationTimestamp.Time } func (p podCell) GetName() string { return p.Name } type deploymentCell appsv1.Deployment func (d deploymentCell) GetCreation() time.Time { return d.CreationTimestamp.Time } func (d deploymentCell) GetName() string { return d.Name } type serviceCell corev1.Service func (s serviceCell) GetCreation() time.Time { return s.CreationTimestamp.Time } func (s serviceCell) GetName() string { return s.Name } type ingressCell nwv1.Ingress func (i ingressCell) GetCreation() time.Time { return i.CreationTimestamp.Time } func (i ingressCell) GetName() string { return i.Name }