1- package service
1+ package service
2+
3+ import (
4+ "bytes"
5+ "encoding/json"
6+ "fmt"
7+ "net/http"
8+ "os"
9+ "strconv"
10+ "strings"
11+ "time"
12+
13+ vms "github.com/easy-cloud-Knet/KWS_Control/structure"
14+ "github.com/easy-cloud-Knet/KWS_Control/util"
15+ )
16+
17+ type CmsClient struct {
18+ baseURL string
19+ client * http.Client
20+ }
21+
22+ type CmsResponse struct {
23+ IP string `json:"ip"`
24+ MacAddr string `json:"macAddr"`
25+ SdnUUID string `json:"sdnUUID"`
26+ }
27+
28+ type CmsRequest struct {
29+ Subnet string `json:"Subnet"`
30+ }
31+
32+ // fmt.Sprintf("%s/New/Instance", CMS_HOST)
33+ func NewCmsClient () * CmsClient {
34+ CMS_HOST := os .Getenv ("CMS_HOST" )
35+ return & CmsClient {
36+ baseURL : CMS_HOST ,
37+ client : & http.Client {
38+ Timeout : 10 * time .Second ,
39+ },
40+ }
41+ }
42+
43+ func (c * CmsClient ) CmsRequest (Subnet string ) (* CmsResponse , error ) {
44+ log := util .GetLogger ()
45+
46+ req_url := fmt .Sprintf ("http://%s/New/Instance" , c .baseURL )
47+ reqBody := CmsRequest {Subnet : Subnet }
48+ jsonBody , err := json .Marshal (reqBody )
49+ if err != nil {
50+ log .Error ("CMS : failed to marshal JSON: %w" , err )
51+ return nil , err
52+ }
53+
54+ req , err := http .NewRequest ("POST" , req_url , bytes .NewBuffer (jsonBody ))
55+ if err != nil {
56+ log .Error ("CMS : failed to NewRequest: %w" , err )
57+ return nil , err
58+ }
59+ resp , err := c .client .Do (req )
60+ if err != nil {
61+ log .Error ("CMS : failed to create request: %w" , err )
62+ return nil , err
63+ }
64+
65+ defer resp .Body .Close ()
66+
67+ if resp .StatusCode != http .StatusOK {
68+ log .Error ("CMS : CMS returned status: %s" , resp .Status )
69+ return nil , err
70+ }
71+ var addrResp CmsResponse
72+ if err := json .NewDecoder (resp .Body ).Decode (& addrResp ); err != nil {
73+ log .Error ("CMS : failed to decode CMS response: %w" , err )
74+ return nil , err
75+ }
76+
77+ return & addrResp , nil
78+ }
79+
80+ func (c * CmsClient ) AddCmsSubnet (ctx * vms.ControlContext , uuid vms.UUID ) (* CmsResponse , error ) {
81+ log := util .GetLogger ()
82+
83+ ip , err := GetVMIPByUUID (ctx , uuid )
84+ if err != nil {
85+ log .Error ("AddCmsSubnet : GetVMIPByUUID: %w" , err )
86+ return nil , err
87+ }
88+ subnet , err := GetSubnetFromIP (ip )
89+ if err != nil {
90+ log .Error ("AddCmsSubnet : GetSubnetFromIP: %v" , err )
91+ return nil , err
92+ }
93+ temp , err := c .CmsRequest (subnet )
94+ if err != nil {
95+ log .Error ("AddCmsSubnet : c.CmsRequest(subnet): %v" , err )
96+ return nil , err
97+ }
98+
99+ return temp , nil
100+
101+ }
102+
103+ func (c * CmsClient ) NewCmsSubnet (ctx * vms.ControlContext ) (* CmsResponse , error ) {
104+ log := util .GetLogger ()
105+
106+ last_subnet := ctx .Last_subnet
107+ next_last_subnet := Find_subnet (last_subnet )
108+ log .Info ("NewCmsSubnet : next_last_subnet: %s" , next_last_subnet )
109+
110+ temp , err := c .CmsRequest (next_last_subnet )
111+ if err != nil {
112+ log .Error ("AddCmsSubnet : c.CmsRequest(subnet): %v" , err )
113+ return nil , err
114+ }
115+ _ , err = ctx .DB .Exec ("UPDATE subnet SET last_subnet = ? WHERE id = 1" , next_last_subnet )
116+ if err != nil {
117+ log .Error ("Failed to update last_subnet in database: %v" , err )
118+ return nil , err
119+ }
120+ ctx .Last_subnet = next_last_subnet
121+ return temp , nil
122+ }
123+
124+ func Find_subnet (last_subnet string ) string {
125+ value := make ([]int , 3 )
126+ j := 0
127+ for i := 0 ; i < 3 ; i ++ {
128+ var temp string
129+ for last_subnet [j ] != '.' {
130+ temp = temp + string (last_subnet [j ])
131+ j ++
132+ }
133+ value [i ], _ = strconv .Atoi (temp )
134+ j ++
135+ }
136+
137+ if value [2 ] >= 255 {
138+ if value [1 ] >= 255 {
139+ if value [0 ] >= 255 {
140+ return "err"
141+ } else {
142+ value [0 ]++
143+ value [1 ] = 0
144+ value [2 ] = 0
145+ }
146+ } else {
147+ value [1 ]++
148+ value [2 ] = 0
149+ }
150+ } else {
151+ value [2 ]++
152+ }
153+
154+ result := fmt .Sprintf ("%s.%s.%s." , strconv .Itoa (value [0 ]), strconv .Itoa (value [1 ]), strconv .Itoa (value [2 ]))
155+ return result
156+ }
157+
158+ func GetVMIPByUUID (ctx * vms.ControlContext , uuid vms.UUID ) (string , error ) {
159+ core , ok := ctx .VMLocation [uuid ]
160+ if ! ok {
161+ return "" , fmt .Errorf ("UUID %s not found in VMLocation" , uuid )
162+ }
163+
164+ vmInfo , ok := core .VMInfoIdx [uuid ]
165+ if ! ok {
166+ return "" , fmt .Errorf ("VMInfo for UUID %s not found in Core" , uuid )
167+ }
168+
169+ return vmInfo .IP_VM , nil
170+ }
171+
172+ func GetSubnetFromIP (ip string ) (string , error ) {
173+ parts := strings .Split (ip , "." )
174+ if len (parts ) != 4 {
175+ return "" , fmt .Errorf ("invalid IP format: %s" , ip )
176+ }
177+
178+ return strings .Join (parts [:3 ], "." ) + "." , nil
179+ }
0 commit comments