Complete the natural-language scheduler agent's Phase 0 read-only pipeline: Task #2 (API Key auth mechanism): - New store/apikey.go: APIKey store (hash, validate, expiry) - controllers/apikey.go: GenerateAPIKey finally persists + registers RBAC role - controllers/auth.go: GetUsernameFromToken recognizes xce_ak_ prefix - middleware/validatehandler.go: isValidToken handles API Key - config/rbac.yaml: mcp_readonly role (view-only permissions) - 6 new test files covering unit + integration full-chain Task #3 (schedulerclient Go library): - types.go: URM types (URMJob/URMQueue/URMNode/JobStatus/Metrics) - client.go: read-only Client interface (6 methods) - httpclient.go: resty-based HTTP implementation - statusmap.go + _test.go: TDD status mapping (33 tests) Task #4 (mcp-server binary): - cmd/main.go: entry, reads XCE_API_URL/XCE_API_KEY, registers 6 MCP tools - internal/app.go: tool handlers wiring schedulerclient to MCP stdio - Uses github.com/mark3labs/mcp-go@v0.57.0 for stdio transport All: go vet clean, go build clean, schedulerclient 33/33 tests pass. mcp-server binary ~11MB arm64, CGO_ENABLED=0. Architecture: Claude Code --stdio--> mcp-server --HTTP--> apiserver REST API --cgo--> C backend Co-Authored-By: Claude <noreply@anthropic.com>
23 lines
737 B
Go
23 lines
737 B
Go
package models
|
|
|
|
import "time"
|
|
|
|
// APIKeyPrefix marks an Authorization header value as a service-account API
|
|
// key rather than a JWT, so validateHeader() can branch without attempting
|
|
// (and failing) a JWT parse first.
|
|
const APIKeyPrefix = "xce_ak_"
|
|
|
|
type APIKeyRequest struct {
|
|
Username string `json:"username" binding:"required"`
|
|
RoleName string `json:"role_name" binding:"required"`
|
|
Description string `json:"description,omitempty"`
|
|
ExpiryDays int `json:"expiry_days,omitempty"`
|
|
}
|
|
|
|
type APIKeyResponse struct {
|
|
APIKey string `json:"api_key"`
|
|
Username string `json:"username"`
|
|
RoleName string `json:"role_name"`
|
|
CreateTime time.Time `json:"create_time"`
|
|
ExpiryTime time.Time `json:"expiry_time"`
|
|
}
|