@@ -11,54 +11,102 @@ import (
1111 "github.com/easy-cloud-Knet/KWS_Control/util"
1212)
1313
14+ // CmsClient는 CMS서비스에 서브넷/인스턴스 생성을 요청하는 HTTP 클라이언트.
1415type CmsClient struct {
1516 baseURL string
1617 client * http.Client
1718}
1819
19- type NewSubnetRequest struct {
20- IP string `json:"ip "`
20+ type CmsNewInstanceResponse struct {
21+ IP string `json:"IP "`
2122 MacAddr string `json:"macAddr"`
2223 SdnUUID string `json:"sdnUUID"`
2324}
2425
25- type subnetRequest struct {
26+ type CmsDeleteInstanceResponse struct {
27+ Detail string `json:"detail,omitempty"`
28+ }
29+
30+ type cmsNewInstanceRequestBody struct {
2631 Subnet string `json:"Subnet"`
2732}
2833
34+ type cmsDeleteInstanceRequestBody struct {
35+ IP string `json:"IP"`
36+ }
37+
2938func NewCmsClient () * CmsClient {
30- CMS_HOST := os .Getenv ("CMS_HOST" )
31- if CMS_HOST == "" {
39+ host := os .Getenv ("CMS_HOST" )
40+ if host == "" {
3241 log := util .GetLogger ()
3342 log .Error ("CMS_HOST Re:Check your env variable" , true )
34- CMS_HOST = "localhost:8080"
35- log .Warn ("CMS_HOST set: %s" , CMS_HOST , true )
43+ host = "localhost:8080"
44+ log .Warn ("CMS_HOST set: %s" , host , true )
3645 }
3746 return & CmsClient {
38- baseURL : CMS_HOST ,
47+ baseURL : host ,
3948 client : & http.Client {
4049 Timeout : 10 * time .Second ,
4150 },
4251 }
4352}
4453
45- func (c * CmsClient ) RequestSubnet ( subnet string ) (* NewSubnetRequest , error ) {
54+ func (c * CmsClient ) RequestDeleteInstance ( ip string ) (* CmsDeleteInstanceResponse , error ) {
4655 log := util .GetLogger ()
4756
4857 reqURL := fmt .Sprintf ("http://%s/New/Instance" , c .baseURL )
49- reqBody := subnetRequest {Subnet : subnet }
50- jsonBody , err := json .Marshal (reqBody )
58+ jsonBody , err := json .Marshal (cmsDeleteInstanceRequestBody {IP : ip })
5159 if err != nil {
52- log .Error ("CMS : failed to marshal JSON: %v" , err )
53- return nil , fmt .Errorf ("RequestSubnet : failed to marshal JSON: %w" , err )
60+ log .Error ("CmsClient.RequestDeleteInstance : failed to marshal JSON: %v" , err )
61+ return nil , fmt .Errorf ("CmsClient.RequestDeleteInstance : failed to marshal JSON: %w" , err )
5462 }
63+ req , err := http .NewRequest ("DELETE" , reqURL , bytes .NewBuffer (jsonBody ))
64+ if err != nil {
65+ log .Error ("CmsClient.RequestDeleteInstance : failed to NewRequest: %v" , err )
66+ return nil , fmt .Errorf ("CmsClient.RequestDeleteInstance: failed to create HTTP request: %w" , err )
67+ }
68+ req .Header .Set ("Content-Type" , "application/json" )
69+ req .Header .Set ("Accept" , "application/json" )
5570
56- req , err := http .NewRequest ("POST" , reqURL , bytes .NewBuffer (jsonBody ))
71+ log .DebugInfo ("Making request to: %s" , reqURL )
72+ log .DebugInfo ("Request body: %s" , string (jsonBody ))
73+
74+ resp , err := c .client .Do (req )
75+ if err != nil {
76+ log .Error ("CmsClient.RequestDeleteInstance : failed to send request: %v" , err )
77+ return nil , fmt .Errorf ("CmsClient.RequestDeleteInstance: failed to send request: %w" , err )
78+ }
79+ defer resp .Body .Close ()
80+
81+ if resp .StatusCode != http .StatusOK {
82+ log .Error ("CmsClient.RequestDeleteInstance : CMS returned status: %s" , resp .Status )
83+ return nil , fmt .Errorf ("CmsClient.RequestDeleteInstance: CMS server returned non-OK status: %s" , resp .Status )
84+ }
85+
86+ var addrResp CmsDeleteInstanceResponse
87+ if err := json .NewDecoder (resp .Body ).Decode (& addrResp ); err != nil {
88+ log .Error ("CmsClient.RequestDeleteInstance : failed to decode CMS response: %v" , err )
89+ return nil , fmt .Errorf ("CmsClient.RequestDeleteInstance: failed to decode response: %w" , err )
90+ }
91+ return & addrResp , nil
92+ }
93+
94+ // RequestNewInstance는 주어진 서브넷에 대해 CMS에 새 인스턴스 할당을 요청한다.
95+ func (c * CmsClient ) RequestNewInstance (subnet string ) (* CmsNewInstanceResponse , error ) {
96+ log := util .GetLogger ()
97+
98+ reqURL := fmt .Sprintf ("http://%s/New/Instance" , c .baseURL )
99+ jsonBody , err := json .Marshal (cmsNewInstanceRequestBody {Subnet : subnet })
57100 if err != nil {
58- log .Error ("CMS : failed to NewRequest : %v" , err )
59- return nil , fmt .Errorf ("RequestSubnet : failed to create HTTP request : %w" , err )
101+ log .Error ("CmsClient.RequestNewInstance : failed to marshal JSON : %v" , err )
102+ return nil , fmt .Errorf ("CmsClient.RequestNewInstance : failed to marshal JSON : %w" , err )
60103 }
61104
105+ req , err := http .NewRequest ("POST" , reqURL , bytes .NewBuffer (jsonBody ))
106+ if err != nil {
107+ log .Error ("CmsClient.RequestNewInstance : failed to NewRequest: %v" , err )
108+ return nil , fmt .Errorf ("CmsClient.RequestNewInstance: failed to create HTTP request: %w" , err )
109+ }
62110 req .Header .Set ("Content-Type" , "application/json" )
63111 req .Header .Set ("Accept" , "application/json" )
64112
@@ -67,21 +115,20 @@ func (c *CmsClient) RequestSubnet(subnet string) (*NewSubnetRequest, error) {
67115
68116 resp , err := c .client .Do (req )
69117 if err != nil {
70- log .Error ("CMS : failed to send request: %v" , err )
71- return nil , fmt .Errorf ("RequestSubnet : failed to send request: %w" , err )
118+ log .Error ("CmsClient.RequestNewInstance : failed to send request: %v" , err )
119+ return nil , fmt .Errorf ("CmsClient.RequestNewInstance : failed to send request: %w" , err )
72120 }
73121 defer resp .Body .Close ()
74122
75123 if resp .StatusCode != http .StatusOK {
76- log .Error ("CMS : CMS returned status: %s" , resp .Status )
77- return nil , fmt .Errorf ("CMS server returned non-OK status: %s" , resp .Status )
124+ log .Error ("CmsClient.RequestNewInstance : CMS returned status: %s" , resp .Status )
125+ return nil , fmt .Errorf ("CmsClient.RequestNewInstance: CMS server returned non-OK status: %s" , resp .Status )
78126 }
79127
80- var addrResp NewSubnetRequest
128+ var addrResp CmsNewInstanceResponse
81129 if err := json .NewDecoder (resp .Body ).Decode (& addrResp ); err != nil {
82- log .Error ("CMS : failed to decode CMS response: %v" , err )
83- return nil , fmt .Errorf ("RequestSubnet : failed to decode response: %w" , err )
130+ log .Error ("CmsClient.RequestNewInstance : failed to decode CMS response: %v" , err )
131+ return nil , fmt .Errorf ("CmsClient.RequestNewInstance : failed to decode response: %w" , err )
84132 }
85-
86133 return & addrResp , nil
87134}
0 commit comments