parser_test.go 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349
  1. // Copyright 2019 Yunion
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. package cmdline
  15. import (
  16. "reflect"
  17. "testing"
  18. "yunion.io/x/jsonutils"
  19. "yunion.io/x/onecloud/pkg/apis/compute"
  20. )
  21. func TestParseSchedtagConfig(t *testing.T) {
  22. type args struct {
  23. desc string
  24. }
  25. tests := []struct {
  26. name string
  27. args args
  28. want *compute.SchedtagConfig
  29. wantErr bool
  30. }{
  31. {
  32. name: "empty input",
  33. args: args{""},
  34. want: nil,
  35. wantErr: true,
  36. },
  37. {
  38. name: "normal",
  39. args: args{"ssd:require"},
  40. want: &compute.SchedtagConfig{Id: "ssd", Strategy: "require"},
  41. wantErr: false,
  42. },
  43. {
  44. name: "with resource type",
  45. args: args{"ssd:require:zones"},
  46. want: &compute.SchedtagConfig{Id: "ssd", Strategy: "require", ResourceType: "zones"},
  47. wantErr: false,
  48. },
  49. {
  50. name: "invalid strategy",
  51. args: args{"ssd:require2"},
  52. want: nil,
  53. wantErr: true,
  54. },
  55. }
  56. for _, tt := range tests {
  57. t.Run(tt.name, func(t *testing.T) {
  58. got, err := ParseSchedtagConfig(tt.args.desc)
  59. if (err != nil) != tt.wantErr {
  60. t.Errorf("ParseSchedtagConfig() error = %v, wantErr %v", err, tt.wantErr)
  61. return
  62. }
  63. if !reflect.DeepEqual(got, tt.want) {
  64. t.Errorf("ParseSchedtagConfig() = %v, want %v", got, tt.want)
  65. }
  66. })
  67. }
  68. }
  69. func TestParseRange(t *testing.T) {
  70. type args struct {
  71. rangeStr string
  72. }
  73. tests := []struct {
  74. name string
  75. args args
  76. wantRet []int64
  77. wantErr bool
  78. }{
  79. {
  80. name: "range number and , test",
  81. args: args{"11-7,, 9-9, 10, 15, 1-2,4-5,,"},
  82. wantRet: []int64{1, 2, 4, 5, 7, 8, 9, 10, 11, 15},
  83. wantErr: false,
  84. },
  85. {
  86. name: "range,range",
  87. args: args{"1-2,4-5"},
  88. wantRet: []int64{1, 2, 4, 5},
  89. wantErr: false,
  90. },
  91. {
  92. name: "numbers",
  93. args: args{"1, 1"},
  94. wantRet: []int64{1},
  95. wantErr: false,
  96. },
  97. {
  98. name: "numbersErr",
  99. args: args{"1-, 1"},
  100. wantRet: nil,
  101. wantErr: true,
  102. },
  103. }
  104. for _, tt := range tests {
  105. t.Run(tt.name, func(t *testing.T) {
  106. gotRet, err := ParseRange(tt.args.rangeStr)
  107. if (err != nil) != tt.wantErr {
  108. t.Errorf("ParseRange() error = %v, wantErr %v", err, tt.wantErr)
  109. return
  110. }
  111. if !reflect.DeepEqual(gotRet, tt.wantRet) {
  112. t.Errorf("ParseRange() = %v, want %v", gotRet, tt.wantRet)
  113. }
  114. })
  115. }
  116. }
  117. func TestFetchDiskConfigsByJSON(t *testing.T) {
  118. type args struct {
  119. obj jsonutils.JSONObject
  120. }
  121. testDisks := []*compute.DiskConfig{
  122. {
  123. SizeMb: 1024,
  124. Medium: compute.DISK_TYPE_SSD,
  125. },
  126. {
  127. SizeMb: 2048,
  128. Medium: compute.DISK_TYPE_ROTATE,
  129. },
  130. }
  131. testDisksObj := map[string][]*compute.DiskConfig{"disks": testDisks}
  132. tests := []struct {
  133. name string
  134. args args
  135. want []*compute.DiskConfig
  136. wantErr bool
  137. }{
  138. {
  139. name: "empty",
  140. args: args{nil},
  141. want: nil,
  142. wantErr: false,
  143. },
  144. {
  145. name: "parse strings",
  146. args: args{obj: jsonutils.Marshal(
  147. map[string]string{
  148. "disk.0": "10g:/data1",
  149. "disk.1": "20g:ext4:ssd",
  150. },
  151. )},
  152. want: []*compute.DiskConfig{
  153. {
  154. Index: 0,
  155. SizeMb: 10 * 1024,
  156. Mountpoint: "/data1",
  157. },
  158. {
  159. Index: 1,
  160. SizeMb: 20 * 1024,
  161. Fs: "ext4",
  162. Medium: compute.DISK_TYPE_SSD,
  163. },
  164. },
  165. wantErr: false,
  166. },
  167. {
  168. name: "parse struct",
  169. args: args{obj: jsonutils.Marshal(testDisksObj)},
  170. want: testDisks,
  171. wantErr: false,
  172. },
  173. }
  174. for _, tt := range tests {
  175. t.Run(tt.name, func(t *testing.T) {
  176. got, err := FetchDiskConfigsByJSON(tt.args.obj)
  177. if (err != nil) != tt.wantErr {
  178. t.Errorf("FetchDiskConfigsByJSON() error = %v, wantErr %v", err, tt.wantErr)
  179. return
  180. }
  181. if !reflect.DeepEqual(got, tt.want) {
  182. t.Errorf("FetchDiskConfigsByJSON() = %v, want %v", got, tt.want)
  183. }
  184. })
  185. }
  186. }
  187. func TestParseIsolatedDevice(t *testing.T) {
  188. tests := []struct {
  189. desc string
  190. idx int
  191. want *compute.IsolatedDeviceConfig
  192. wantErr bool
  193. }{
  194. {
  195. desc: "device_path=/dev/nvme0",
  196. idx: 0,
  197. want: &compute.IsolatedDeviceConfig{
  198. DevicePath: "/dev/nvme0",
  199. },
  200. },
  201. {
  202. desc: "GPU_HPC:device_path=/dev/nvme0",
  203. idx: 0,
  204. want: &compute.IsolatedDeviceConfig{
  205. DevicePath: "/dev/nvme0",
  206. Model: "GPU_HPC",
  207. },
  208. },
  209. {
  210. desc: "GPU_HPC:device_path=/dev/nvme0:1d3ce781-2b64-4ee7-8d23-6bbcf478c54b",
  211. idx: 0,
  212. want: &compute.IsolatedDeviceConfig{
  213. Id: "1d3ce781-2b64-4ee7-8d23-6bbcf478c54b",
  214. DevicePath: "/dev/nvme0",
  215. Model: "GPU_HPC",
  216. },
  217. },
  218. }
  219. for _, tt := range tests {
  220. t.Run(tt.desc, func(t *testing.T) {
  221. got, err := ParseIsolatedDevice(tt.desc, tt.idx)
  222. if (err != nil) != tt.wantErr {
  223. t.Errorf("ParseIsolatedDevice() error = %v, wantErr %v", err, tt.wantErr)
  224. return
  225. }
  226. if !reflect.DeepEqual(got, tt.want) {
  227. t.Errorf("ParseIsolatedDevice() got = %v, want %v", got, tt.want)
  228. }
  229. })
  230. }
  231. }
  232. func TestParseBaremetalRootDiskMatcher(t *testing.T) {
  233. tests := []struct {
  234. args string
  235. want *compute.BaremetalRootDiskMatcher
  236. wantErr bool
  237. }{
  238. {
  239. args: "size=100G",
  240. want: &compute.BaremetalRootDiskMatcher{SizeMB: 102400},
  241. },
  242. {
  243. args: "device=/dev/sda",
  244. want: &compute.BaremetalRootDiskMatcher{Device: "/dev/sda"},
  245. },
  246. {
  247. args: "size_end=100G",
  248. want: &compute.BaremetalRootDiskMatcher{SizeMBRange: &compute.RootDiskMatcherSizeMBRange{End: 102400}},
  249. },
  250. {
  251. args: "size_end=100G,size_start=50G",
  252. want: &compute.BaremetalRootDiskMatcher{
  253. SizeMBRange: &compute.RootDiskMatcherSizeMBRange{
  254. Start: 51200,
  255. End: 102400,
  256. }},
  257. },
  258. }
  259. for _, tt := range tests {
  260. t.Run(tt.args, func(t *testing.T) {
  261. got, err := ParseBaremetalRootDiskMatcher(tt.args)
  262. if (err != nil) != tt.wantErr {
  263. t.Errorf("ParseBaremetalRootDiskMatcher() error = %v, wantErr %v", err, tt.wantErr)
  264. return
  265. }
  266. if !reflect.DeepEqual(got, tt.want) {
  267. t.Errorf("ParseBaremetalRootDiskMatcher() got = %v, want %v", got, tt.want)
  268. }
  269. })
  270. }
  271. }
  272. func TestParseNetworkConfig(t *testing.T) {
  273. tests := []struct {
  274. args string
  275. want *compute.NetworkConfig
  276. }{
  277. {
  278. args: "77a7d3a7-022d-4b48-8bb6-e37ea3a20c94",
  279. want: &compute.NetworkConfig{Network: "77a7d3a7-022d-4b48-8bb6-e37ea3a20c94"},
  280. },
  281. {
  282. args: "77a7d3a7-022d-4b48-8bb6-e37ea3a20c94:172.22.121.12",
  283. want: &compute.NetworkConfig{
  284. Network: "77a7d3a7-022d-4b48-8bb6-e37ea3a20c94",
  285. Address: "172.22.121.12",
  286. },
  287. },
  288. {
  289. args: "77a7d3a7-022d-4b48-8bb6-e37ea3a20c94:172.22.121.12:[fd:3ffe:3200:90::2]",
  290. want: &compute.NetworkConfig{
  291. Network: "77a7d3a7-022d-4b48-8bb6-e37ea3a20c94",
  292. Address: "172.22.121.12",
  293. Address6: "fd:3ffe:3200:90::2",
  294. },
  295. },
  296. {
  297. args: "77a7d3a7-022d-4b48-8bb6-e37ea3a20c94:172.22.121.12:[fd:3ffe:3200:90::2]:[teaming]",
  298. want: &compute.NetworkConfig{
  299. Network: "77a7d3a7-022d-4b48-8bb6-e37ea3a20c94",
  300. Address: "172.22.121.12",
  301. Address6: "fd:3ffe:3200:90::2",
  302. RequireTeaming: true,
  303. },
  304. },
  305. {
  306. args: "77a7d3a7-022d-4b48-8bb6-e37ea3a20c94:172.22.121.12:[fd:3ffe:3200:90::2]:wire=77a7d3a7-022d-4b48-8bb6-e37ea3a20c94",
  307. want: &compute.NetworkConfig{
  308. Network: "77a7d3a7-022d-4b48-8bb6-e37ea3a20c94",
  309. Address: "172.22.121.12",
  310. Address6: "fd:3ffe:3200:90::2",
  311. Wire: "77a7d3a7-022d-4b48-8bb6-e37ea3a20c94",
  312. },
  313. },
  314. {
  315. args: "77a7d3a7-022d-4b48-8bb6-e37ea3a20c94:172.22.121.12:[fd:3ffe:3200:90::2]:wire=77a7d3a7-022d-4b48-8bb6-e37ea3a20c94:[try-teaming]",
  316. want: &compute.NetworkConfig{
  317. Network: "77a7d3a7-022d-4b48-8bb6-e37ea3a20c94",
  318. Address: "172.22.121.12",
  319. Address6: "fd:3ffe:3200:90::2",
  320. Wire: "77a7d3a7-022d-4b48-8bb6-e37ea3a20c94",
  321. TryTeaming: true,
  322. },
  323. },
  324. }
  325. for _, tt := range tests {
  326. t.Run(tt.args, func(t *testing.T) {
  327. got, err := ParseNetworkConfig(tt.args, 0)
  328. if err != nil {
  329. t.Errorf("ParseNetworkConfig %s fail %s", tt.args, err)
  330. } else if !reflect.DeepEqual(got, tt.want) {
  331. t.Errorf("ParseNetworkConfig() got = %v, want %v", got, tt.want)
  332. }
  333. })
  334. }
  335. }