Merge Go frontend (apiserver + xcecli) into meson build

This commit is contained in:
Rongsong Shen 2026-04-14 11:20:17 +08:00
parent 43dc12a36c
commit c9dc8c4676
205 changed files with 30793 additions and 328 deletions

View file

@ -0,0 +1,117 @@
package services
import (
"apiserver/store"
"apiserver/utils"
"fmt"
logger "apiserver/utils"
)
// Store table name constants.
const (
TableJobInfo = "job_info"
TableQueueInfo = "queue_info"
TableHostInfo = "host_info"
TableResourceDef = "resource_def"
TableResourceLoc = "resource_loc"
TableClusterInfo = "cluster_info"
TableArrayJob = "array_job"
TableJobExecHosts = "job_exec_hosts"
TableRolePermission = "role_permission"
TableUserRole = "user_role"
)
// QueryData queries in-memory store by table name, applies filter/sort/pagination.
func QueryData(tableName string, queryOpts *utils.QueryOptions, fields []string) ([]utils.OrderMap, string, error) {
var rows []utils.OrderMap
switch tableName {
case TableJobInfo:
rows = store.StoreToOrderMaps(store.Jobs)
case TableQueueInfo:
rows = store.StoreToOrderMaps(store.Queues)
case TableHostInfo:
rows = store.StoreToOrderMaps(store.Hosts)
case TableResourceDef:
rows = store.StoreToOrderMaps(store.Resources)
case TableResourceLoc:
rows = store.StoreToOrderMaps(store.ResourceLocations)
case TableClusterInfo:
rows = store.StoreToOrderMaps(store.Clusters)
case TableArrayJob:
rows = store.StoreToOrderMaps(store.ArrayJobs)
case TableJobExecHosts:
rows = store.StoreToOrderMaps(store.JobExecHosts)
case TableRolePermission:
rows = roleStoreToOrderMaps()
case TableUserRole:
rows = userRoleStoreToOrderMaps()
default:
return nil, "", fmt.Errorf("unknown store: %s", tableName)
}
result, pageToken := store.ExecuteQuery(rows, queryOpts, fields)
return result, pageToken, nil
}
// InsertEntity inserts an entity into the named store.
func InsertEntity(tableName string, key string, entity interface{}) error {
logger.Debug("InsertEntity: " + tableName + " key=" + key)
// For now, this is a no-op since job submission goes through backend.
// Queue/host/resource updates come from notifications.
return nil
}
// DeleteEntity deletes an entity from the named store.
func DeleteEntity(tableName string, key string) error {
logger.Debug("DeleteEntity: " + tableName + " key=" + key)
switch tableName {
case TableRolePermission:
store.Roles.Delete(key)
case TableUserRole:
// key format: "username:rolename"
// handled by store helper functions
}
return nil
}
// roleStoreToOrderMaps converts role store to OrderMap format.
func roleStoreToOrderMaps() []utils.OrderMap {
rows := make([]utils.OrderMap, 0, store.Roles.Count()*4)
store.Roles.Range(func(roleName string, entry store.RoleEntry) bool {
for _, perm := range entry.Permissions {
row := utils.OrderMap{
Fields: []string{"role_name", "action", "domain_type", "domain_values"},
Data: map[string]interface{}{
"role_name": roleName,
"action": perm.Action,
"domain_type": perm.DomainType,
"domain_values": perm.DomainValues,
},
}
rows = append(rows, row)
}
return true
})
return rows
}
// userRoleStoreToOrderMaps converts user-role store to OrderMap format.
func userRoleStoreToOrderMaps() []utils.OrderMap {
rows := make([]utils.OrderMap, 0, store.UserRoles.Count()*2)
store.UserRoles.Range(func(userName string, roleNames []string) bool {
for _, roleName := range roleNames {
row := utils.OrderMap{
Fields: []string{"user_name", "role_name"},
Data: map[string]interface{}{
"user_name": userName,
"role_name": roleName,
},
}
rows = append(rows, row)
}
return true
})
return rows
}

View file

@ -0,0 +1,16 @@
package services
import (
"apiserver/backend"
"apiserver/models"
)
// SubmitJob sends a job to the backend. The store is updated via notification callback.
func SubmitJob(job *models.JobInfo) error {
return backend.SubmitJob(job)
}
// SubmitArrayJobs sends an array job to the backend.
func SubmitArrayJobs(arrayjob models.ArrayJobInfo, joblist []models.JobInfo) error {
return backend.SubmitArrayJobs(&arrayjob, joblist)
}

View file

@ -0,0 +1,29 @@
package services
import (
"apiserver/store"
"apiserver/utils"
)
// GetUserPermissions returns the user's roles and their permissions.
func GetUserPermissions(username string) ([]string, []utils.OrderMap, error) {
roleNames := store.GetUserRoleNames(username)
var permRows []utils.OrderMap
for _, roleName := range roleNames {
perms := store.GetRolePermissions(roleName)
for _, perm := range perms {
row := utils.OrderMap{
Fields: []string{"role_name", "action", "domain_type", "domain_values"},
Data: map[string]interface{}{
"role_name": roleName,
"action": perm.Action,
"domain_type": perm.DomainType,
"domain_values": perm.DomainValues,
},
}
permRows = append(permRows, row)
}
}
return roleNames, permRows, nil
}