122 lines
3.5 KiB
Go
122 lines
3.5 KiB
Go
package user
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"strconv"
|
|
"time"
|
|
|
|
"github.com/beclab/Olares/framework/app-service/api/sys.bytetrade.io/v1alpha1"
|
|
iamv1alpha2 "github.com/beclab/api/iam/v1alpha2"
|
|
"k8s.io/apimachinery/pkg/api/resource"
|
|
"k8s.io/apimachinery/pkg/runtime"
|
|
"k8s.io/client-go/tools/clientcmd"
|
|
"sigs.k8s.io/controller-runtime/pkg/client"
|
|
)
|
|
|
|
func newUserClientFromKubeConfig(kubeconfig string) (client.Client, error) {
|
|
if kubeconfig == "" {
|
|
kubeconfig = os.Getenv("KUBECONFIG")
|
|
if kubeconfig == "" {
|
|
kubeconfig = clientcmd.RecommendedHomeFile
|
|
}
|
|
}
|
|
|
|
config, err := clientcmd.BuildConfigFromFlags("", kubeconfig)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to get kubeconfig: %w", err)
|
|
}
|
|
|
|
scheme := runtime.NewScheme()
|
|
|
|
if err := iamv1alpha2.AddToScheme(scheme); err != nil {
|
|
return nil, fmt.Errorf("failed to add user scheme: %w", err)
|
|
}
|
|
|
|
if err := v1alpha1.AddToScheme(scheme); err != nil {
|
|
return nil, fmt.Errorf("failed to add system scheme: %w", err)
|
|
}
|
|
|
|
userClient, err := client.New(config, client.Options{Scheme: scheme})
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to create user client: %w", err)
|
|
}
|
|
return userClient, nil
|
|
}
|
|
|
|
func validateResourceLimit(limit resourceLimit) error {
|
|
if limit.memoryLimit != "" {
|
|
memLimit, err := resource.ParseQuantity(limit.memoryLimit)
|
|
if err != nil {
|
|
return fmt.Errorf("invalid memory limit: %v", err)
|
|
}
|
|
minMemLimit, _ := resource.ParseQuantity(defaultMemoryLimit)
|
|
if memLimit.Cmp(minMemLimit) < 0 {
|
|
return fmt.Errorf("invalid memory limit: %s is less than minimum required: %s", memLimit.String(), minMemLimit.String())
|
|
}
|
|
}
|
|
|
|
if limit.cpuLimit != "" {
|
|
cpuLimit, err := resource.ParseQuantity(limit.cpuLimit)
|
|
if err != nil {
|
|
return fmt.Errorf("invalid cpu limit: %v", err)
|
|
}
|
|
minCPULimit, _ := resource.ParseQuantity(defaultCPULimit)
|
|
if cpuLimit.Cmp(minCPULimit) < 0 {
|
|
return fmt.Errorf("invalid cpu limit: %s is less than minimum required: %s", cpuLimit.String(), minCPULimit.String())
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func convertUserObjectToUserInfo(user iamv1alpha2.User) userInfo {
|
|
info := userInfo{
|
|
UID: string(user.UID),
|
|
Name: user.Name,
|
|
DisplayName: user.Spec.DisplayName,
|
|
Description: user.Spec.Description,
|
|
Email: user.Spec.Email,
|
|
State: string(user.Status.State),
|
|
CreationTimestamp: user.CreationTimestamp.Unix(),
|
|
}
|
|
|
|
if user.Annotations != nil {
|
|
if role, ok := user.Annotations[annotationKeyRole]; ok {
|
|
info.Roles = []string{role}
|
|
}
|
|
if terminusName, ok := user.Annotations["bytetrade.io/terminus-name"]; ok {
|
|
info.TerminusName = terminusName
|
|
}
|
|
if avatar, ok := user.Annotations["bytetrade.io/avatar"]; ok {
|
|
info.Avatar = avatar
|
|
}
|
|
if memoryLimit, ok := user.Annotations[annotationKeyMemoryLimit]; ok {
|
|
info.MemoryLimit = memoryLimit
|
|
}
|
|
if cpuLimit, ok := user.Annotations[annotationKeyCPULimit]; ok {
|
|
info.CpuLimit = cpuLimit
|
|
}
|
|
}
|
|
|
|
if user.Status.LastLoginTime != nil {
|
|
lastLogin := user.Status.LastLoginTime.Unix()
|
|
info.LastLoginTime = &lastLogin
|
|
}
|
|
|
|
return info
|
|
}
|
|
|
|
func printUserTableHeaders() {
|
|
fmt.Printf("%-20s %-10s %-10s %-30s %-10s %-10s %-10s\n", "NAME", "ROLE", "STATE", "CREATE TIME", "ACTIVATED", "MEMORY", "CPU")
|
|
}
|
|
|
|
func printUserTableRow(info userInfo) {
|
|
role := roleNormal
|
|
if len(info.Roles) > 0 {
|
|
role = info.Roles[0]
|
|
}
|
|
fmt.Printf("%-20s %-10s %-10s %-30s %-10s %-10s %-10s\n",
|
|
info.Name, role, info.State, time.Unix(info.CreationTimestamp, 0).Format(time.RFC3339), strconv.FormatBool(info.WizardComplete), info.MemoryLimit, info.CpuLimit)
|
|
}
|