package rainyun import ( "context" "fmt" "time" "git.yoresee.cc/nightstar/ry/internal/provider" ) // ServerService implements provider.ServerService for 雨云. type ServerService struct { client *client } // rainyunServer mirrors the Rainyun RCS API JSON fields (PascalCase). type rainyunServer struct { ID int `json:"ID"` HostName string `json:"HostName"` Status string `json:"status"` MainIPv4 string `json:"MainIPv4"` CPU int `json:"CPU"` Memory int `json:"memory"` Disk int `json:"disk"` OsName string `json:"OsName"` Zone string `json:"Zone"` ExpireDate int64 `json:"ExpDate"` } func (s *ServerService) List(ctx context.Context) ([]provider.Server, error) { var raw []rainyunServer if err := s.client.getList(ctx, "/product/rcs/", &raw); err != nil { return nil, err } servers := make([]provider.Server, len(raw)) for i, r := range raw { servers[i] = toServer(r) } return servers, nil } func (s *ServerService) Get(ctx context.Context, id string) (*provider.Server, error) { var raw rainyunServer path := fmt.Sprintf("/product/rcs/%s/", id) if err := s.client.get(ctx, path, &raw); err != nil { return nil, err } sv := toServer(raw) return &sv, nil } func (s *ServerService) Start(ctx context.Context, id string) error { return s.client.post(ctx, fmt.Sprintf("/product/rcs/%s/start", id), nil, nil) } func (s *ServerService) Stop(ctx context.Context, id string) error { return s.client.post(ctx, fmt.Sprintf("/product/rcs/%s/stop", id), nil, nil) } func (s *ServerService) Reboot(ctx context.Context, id string) error { return s.client.post(ctx, fmt.Sprintf("/product/rcs/%s/reboot", id), nil, nil) } func (s *ServerService) Reinstall(ctx context.Context, id, osTemplate string) error { body := map[string]string{"os": osTemplate} return s.client.post(ctx, fmt.Sprintf("/product/rcs/%s/changeos", id), body, nil) } func (s *ServerService) ResetPassword(ctx context.Context, id string) error { return s.client.post(ctx, fmt.Sprintf("/product/rcs/%s/reset-password", id), nil, nil) } func (s *ServerService) GetVNC(ctx context.Context, id string) (string, error) { var resp struct { VNCURL string `json:"vnc_url"` } if err := s.client.get(ctx, fmt.Sprintf("/product/rcs/%s/vnc", id), &resp); err != nil { return "", err } return resp.VNCURL, nil } func (s *ServerService) Upgrade(ctx context.Context, id, plan string) error { body := map[string]string{"plan": plan} return s.client.post(ctx, fmt.Sprintf("/product/rcs/%s/upgrade", id), body, nil) } // toServer maps a rainyunServer to the provider.Server model. func toServer(r rainyunServer) provider.Server { expire := time.Unix(r.ExpireDate, 0) return provider.Server{ ID: fmt.Sprintf("%d", r.ID), Name: r.HostName, Status: r.Status, IP: r.MainIPv4, CPU: r.CPU, Memory: r.Memory, Disk: r.Disk, OS: r.OsName, Region: r.Zone, ExpireAt: expire, Raw: r, } }