package main import ( "bytes" "context" "encoding/json" "fmt" "net/http" "strings" "git.cin.su/m/Assistant/contracts/capability" ) type httpAdmissionClient struct { baseURL string client *http.Client } func newHTTPAdmissionClient(baseURL string, client *http.Client) *httpAdmissionClient { return &httpAdmissionClient{baseURL: strings.TrimRight(baseURL, "/"), client: client} } func (c *httpAdmissionClient) Admit(ctx context.Context, leaseID string, request capability.AdmissionRequest) (capability.AdmissionDecision, capability.AdmissionLease, error) { payload, err := json.Marshal(struct { LeaseID string `json:"lease_id"` Request capability.AdmissionRequest `json:"request"` }{leaseID, request}) if err != nil { return capability.AdmissionDecision{}, capability.AdmissionLease{}, err } req, err := http.NewRequestWithContext(ctx, http.MethodPost, c.baseURL+"/v1/internal/cognitive/admission", bytes.NewReader(payload)) if err != nil { return capability.AdmissionDecision{}, capability.AdmissionLease{}, err } req.Header.Set("Content-Type", "application/json") resp, err := c.client.Do(req) if err != nil { return capability.AdmissionDecision{}, capability.AdmissionLease{}, err } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { return capability.AdmissionDecision{}, capability.AdmissionLease{}, fmt.Errorf("admission status %d", resp.StatusCode) } var result struct { Decision capability.AdmissionDecision `json:"decision"` Lease capability.AdmissionLease `json:"lease"` } if err := json.NewDecoder(resp.Body).Decode(&result); err != nil { return capability.AdmissionDecision{}, capability.AdmissionLease{}, err } return result.Decision, result.Lease, nil } func (c *httpAdmissionClient) Release(ctx context.Context, lease capability.AdmissionLease) error { req, err := http.NewRequestWithContext(ctx, http.MethodPost, c.baseURL+"/v1/internal/cognitive/admission/"+lease.ID+"/release", nil) if err != nil { return err } resp, err := c.client.Do(req) if err != nil { return err } defer resp.Body.Close() if resp.StatusCode != http.StatusNoContent { return fmt.Errorf("admission release status %d", resp.StatusCode) } return nil }