storageconfiguration_test.go 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504
  1. package azure
  2. import (
  3. "fmt"
  4. "testing"
  5. "github.com/opencost/opencost/core/pkg/log"
  6. "github.com/opencost/opencost/core/pkg/util/json"
  7. "github.com/opencost/opencost/pkg/cloud"
  8. )
  9. func TestStorageConfiguration_Validate(t *testing.T) {
  10. testCases := map[string]struct {
  11. config StorageConfiguration
  12. expected error
  13. }{
  14. "valid config Azure SharedKeyCredential": {
  15. config: StorageConfiguration{
  16. SubscriptionID: "subscriptionID",
  17. Account: "account",
  18. Container: "container",
  19. Path: "path",
  20. Cloud: "cloud",
  21. Authorizer: &SharedKeyCredential{
  22. AccessKey: "accessKey",
  23. Account: "account",
  24. },
  25. },
  26. expected: nil,
  27. },
  28. "access key invalid": {
  29. config: StorageConfiguration{
  30. SubscriptionID: "subscriptionID",
  31. Account: "account",
  32. Container: "container",
  33. Path: "path",
  34. Cloud: "cloud",
  35. Authorizer: &SharedKeyCredential{
  36. Account: "account",
  37. },
  38. },
  39. expected: fmt.Errorf("SharedKeyCredential: missing access key"),
  40. },
  41. "missing authorizer": {
  42. config: StorageConfiguration{
  43. SubscriptionID: "subscriptionID",
  44. Account: "account",
  45. Container: "container",
  46. Path: "path",
  47. Cloud: "cloud",
  48. Authorizer: nil,
  49. },
  50. expected: fmt.Errorf("StorageConfiguration: missing authorizer"),
  51. },
  52. "missing subscriptionID": {
  53. config: StorageConfiguration{
  54. SubscriptionID: "",
  55. Account: "account",
  56. Container: "container",
  57. Path: "path",
  58. Cloud: "cloud",
  59. Authorizer: &SharedKeyCredential{
  60. AccessKey: "accessKey",
  61. Account: "account",
  62. },
  63. },
  64. expected: fmt.Errorf("StorageConfiguration: missing Subcription ID"),
  65. },
  66. "missing account": {
  67. config: StorageConfiguration{
  68. SubscriptionID: "subscriptionID",
  69. Account: "",
  70. Container: "container",
  71. Path: "path",
  72. Cloud: "cloud",
  73. Authorizer: &SharedKeyCredential{
  74. AccessKey: "accessKey",
  75. Account: "account",
  76. },
  77. },
  78. expected: fmt.Errorf("StorageConfiguration: missing Account"),
  79. },
  80. "missing container": {
  81. config: StorageConfiguration{
  82. SubscriptionID: "subscriptionID",
  83. Account: "account",
  84. Container: "",
  85. Path: "path",
  86. Cloud: "cloud",
  87. Authorizer: &SharedKeyCredential{
  88. AccessKey: "accessKey",
  89. Account: "account",
  90. },
  91. },
  92. expected: fmt.Errorf("StorageConfiguration: missing Container"),
  93. },
  94. "missing path": {
  95. config: StorageConfiguration{
  96. SubscriptionID: "subscriptionID",
  97. Account: "account",
  98. Container: "container",
  99. Path: "",
  100. Cloud: "cloud",
  101. Authorizer: &SharedKeyCredential{
  102. AccessKey: "accessKey",
  103. Account: "account",
  104. },
  105. },
  106. expected: nil,
  107. },
  108. "missing cloud": {
  109. config: StorageConfiguration{
  110. SubscriptionID: "subscriptionID",
  111. Account: "account",
  112. Container: "container",
  113. Path: "path",
  114. Cloud: "",
  115. Authorizer: &SharedKeyCredential{
  116. AccessKey: "accessKey",
  117. Account: "account",
  118. },
  119. },
  120. expected: nil,
  121. },
  122. }
  123. for name, testCase := range testCases {
  124. t.Run(name, func(t *testing.T) {
  125. actual := testCase.config.Validate()
  126. actualString := "nil"
  127. if actual != nil {
  128. actualString = actual.Error()
  129. }
  130. expectedString := "nil"
  131. if testCase.expected != nil {
  132. expectedString = testCase.expected.Error()
  133. }
  134. if actualString != expectedString {
  135. t.Errorf("errors do not match: Actual: '%s', Expected: '%s", actualString, expectedString)
  136. }
  137. })
  138. }
  139. }
  140. func TestStorageConfiguration_Equals(t *testing.T) {
  141. testCases := map[string]struct {
  142. left StorageConfiguration
  143. right cloud.Config
  144. expected bool
  145. }{
  146. "matching config": {
  147. left: StorageConfiguration{
  148. SubscriptionID: "subscriptionID",
  149. Account: "account",
  150. Container: "container",
  151. Path: "path",
  152. Cloud: "cloud",
  153. Authorizer: &SharedKeyCredential{
  154. AccessKey: "accessKey",
  155. Account: "account",
  156. },
  157. },
  158. right: &StorageConfiguration{
  159. SubscriptionID: "subscriptionID",
  160. Account: "account",
  161. Container: "container",
  162. Path: "path",
  163. Cloud: "cloud",
  164. Authorizer: &SharedKeyCredential{
  165. AccessKey: "accessKey",
  166. Account: "account",
  167. },
  168. },
  169. expected: true,
  170. },
  171. "matching config AuthorizerHolder": {
  172. left: StorageConfiguration{
  173. SubscriptionID: "subscriptionID",
  174. Account: "account",
  175. Container: "container",
  176. Path: "path",
  177. Cloud: "cloud",
  178. Authorizer: &AuthorizerHolder{
  179. Authorizer: &DefaultAzureCredentialHolder{},
  180. },
  181. },
  182. right: &StorageConfiguration{
  183. SubscriptionID: "subscriptionID",
  184. Account: "account",
  185. Container: "container",
  186. Path: "path",
  187. Cloud: "cloud",
  188. Authorizer: &AuthorizerHolder{
  189. Authorizer: &DefaultAzureCredentialHolder{},
  190. },
  191. },
  192. expected: true,
  193. },
  194. "missing both authorizer": {
  195. left: StorageConfiguration{
  196. SubscriptionID: "subscriptionID",
  197. Account: "account",
  198. Container: "container",
  199. Path: "path",
  200. Cloud: "cloud",
  201. Authorizer: nil,
  202. },
  203. right: &StorageConfiguration{
  204. SubscriptionID: "subscriptionID",
  205. Account: "account",
  206. Container: "container",
  207. Path: "path",
  208. Cloud: "cloud",
  209. Authorizer: nil,
  210. },
  211. expected: true,
  212. },
  213. "missing left authorizer": {
  214. left: StorageConfiguration{
  215. SubscriptionID: "subscriptionID",
  216. Account: "account",
  217. Container: "container",
  218. Path: "path",
  219. Cloud: "cloud",
  220. Authorizer: nil,
  221. },
  222. right: &StorageConfiguration{
  223. SubscriptionID: "subscriptionID",
  224. Account: "account",
  225. Container: "container",
  226. Path: "path",
  227. Cloud: "cloud",
  228. Authorizer: &SharedKeyCredential{
  229. AccessKey: "accessKey",
  230. Account: "account",
  231. },
  232. },
  233. expected: false,
  234. },
  235. "missing right authorizer": {
  236. left: StorageConfiguration{
  237. SubscriptionID: "subscriptionID",
  238. Account: "account",
  239. Container: "container",
  240. Path: "path",
  241. Cloud: "cloud",
  242. Authorizer: &SharedKeyCredential{
  243. AccessKey: "accessKey",
  244. Account: "account",
  245. },
  246. },
  247. right: &StorageConfiguration{
  248. SubscriptionID: "subscriptionID",
  249. Account: "account",
  250. Container: "container",
  251. Path: "path",
  252. Cloud: "cloud",
  253. Authorizer: nil,
  254. },
  255. expected: false,
  256. },
  257. "differing storage authorizer": {
  258. left: StorageConfiguration{
  259. SubscriptionID: "subscriptionID",
  260. Account: "account",
  261. Container: "container",
  262. Path: "path",
  263. Cloud: "cloud",
  264. Authorizer: &SharedKeyCredential{
  265. AccessKey: "accessKey",
  266. Account: "account",
  267. },
  268. },
  269. right: &StorageConfiguration{
  270. SubscriptionID: "subscriptionID",
  271. Account: "account",
  272. Container: "container",
  273. Path: "path",
  274. Cloud: "cloud",
  275. Authorizer: &AuthorizerHolder{
  276. Authorizer: &DefaultAzureCredentialHolder{},
  277. },
  278. },
  279. expected: false,
  280. },
  281. "different subscriptionID": {
  282. left: StorageConfiguration{
  283. SubscriptionID: "subscriptionID",
  284. Account: "account",
  285. Container: "container",
  286. Path: "path",
  287. Cloud: "cloud",
  288. Authorizer: &SharedKeyCredential{
  289. AccessKey: "accessKey",
  290. Account: "account",
  291. },
  292. },
  293. right: &StorageConfiguration{
  294. SubscriptionID: "subscriptionID2",
  295. Account: "account",
  296. Container: "container",
  297. Path: "path",
  298. Cloud: "cloud",
  299. Authorizer: &SharedKeyCredential{
  300. AccessKey: "accessKey",
  301. Account: "account",
  302. },
  303. },
  304. expected: false,
  305. },
  306. "different account": {
  307. left: StorageConfiguration{
  308. SubscriptionID: "subscriptionID",
  309. Account: "account",
  310. Container: "container",
  311. Path: "path",
  312. Cloud: "cloud",
  313. Authorizer: &SharedKeyCredential{
  314. AccessKey: "accessKey",
  315. Account: "account",
  316. },
  317. },
  318. right: &StorageConfiguration{
  319. SubscriptionID: "subscriptionID",
  320. Account: "account2",
  321. Container: "container",
  322. Path: "path",
  323. Cloud: "cloud",
  324. Authorizer: &SharedKeyCredential{
  325. AccessKey: "accessKey",
  326. Account: "account",
  327. },
  328. },
  329. expected: false,
  330. },
  331. "different container": {
  332. left: StorageConfiguration{
  333. SubscriptionID: "subscriptionID",
  334. Account: "account",
  335. Container: "container",
  336. Path: "path",
  337. Cloud: "cloud",
  338. Authorizer: &SharedKeyCredential{
  339. AccessKey: "accessKey",
  340. Account: "account",
  341. },
  342. },
  343. right: &StorageConfiguration{
  344. SubscriptionID: "subscriptionID",
  345. Account: "account",
  346. Container: "container2",
  347. Path: "path",
  348. Cloud: "cloud",
  349. Authorizer: &SharedKeyCredential{
  350. AccessKey: "accessKey",
  351. Account: "account",
  352. },
  353. },
  354. expected: false,
  355. },
  356. "different path": {
  357. left: StorageConfiguration{
  358. SubscriptionID: "subscriptionID",
  359. Account: "account",
  360. Container: "container",
  361. Path: "path",
  362. Cloud: "cloud",
  363. Authorizer: &SharedKeyCredential{
  364. AccessKey: "accessKey",
  365. Account: "account",
  366. },
  367. },
  368. right: &StorageConfiguration{
  369. SubscriptionID: "subscriptionID",
  370. Account: "account",
  371. Container: "container",
  372. Path: "path2",
  373. Cloud: "cloud",
  374. Authorizer: &SharedKeyCredential{
  375. AccessKey: "accessKey",
  376. Account: "account",
  377. },
  378. },
  379. expected: false,
  380. },
  381. "different cloud": {
  382. left: StorageConfiguration{
  383. SubscriptionID: "subscriptionID",
  384. Account: "account",
  385. Container: "container",
  386. Path: "path",
  387. Cloud: "cloud",
  388. Authorizer: &SharedKeyCredential{
  389. AccessKey: "accessKey",
  390. Account: "account",
  391. },
  392. },
  393. right: &StorageConfiguration{
  394. SubscriptionID: "subscriptionID",
  395. Account: "account",
  396. Container: "container",
  397. Path: "path",
  398. Cloud: "cloud2",
  399. Authorizer: &SharedKeyCredential{
  400. AccessKey: "accessKey",
  401. Account: "account",
  402. },
  403. },
  404. expected: false,
  405. },
  406. "different config": {
  407. left: StorageConfiguration{
  408. SubscriptionID: "subscriptionID",
  409. Account: "account",
  410. Container: "container",
  411. Path: "path",
  412. Cloud: "cloud",
  413. Authorizer: &SharedKeyCredential{
  414. AccessKey: "accessKey",
  415. Account: "account",
  416. },
  417. },
  418. right: &SharedKeyCredential{
  419. AccessKey: "accessKey",
  420. Account: "account",
  421. },
  422. expected: false,
  423. },
  424. }
  425. for name, testCase := range testCases {
  426. t.Run(name, func(t *testing.T) {
  427. actual := testCase.left.Equals(testCase.right)
  428. if actual != testCase.expected {
  429. t.Errorf("incorrect result: Actual: '%t', Expected: '%t", actual, testCase.expected)
  430. }
  431. })
  432. }
  433. }
  434. func TestStorageConfiguration_JSON(t *testing.T) {
  435. testCases := map[string]struct {
  436. config StorageConfiguration
  437. }{
  438. "Empty Config": {
  439. config: StorageConfiguration{},
  440. },
  441. "Nil Authorizer": {
  442. config: StorageConfiguration{
  443. SubscriptionID: "subscriptionID",
  444. Account: "account",
  445. Container: "container",
  446. Path: "path",
  447. Cloud: "cloud",
  448. Authorizer: nil,
  449. },
  450. },
  451. "SharedKeyCredential Authorizer": {
  452. config: StorageConfiguration{
  453. SubscriptionID: "subscriptionID",
  454. Account: "account",
  455. Container: "container",
  456. Path: "path",
  457. Cloud: "cloud",
  458. Authorizer: &SharedKeyCredential{
  459. AccessKey: "accessKey",
  460. Account: "account",
  461. },
  462. },
  463. },
  464. "Default AuthorizerHolder Authorizer": {
  465. config: StorageConfiguration{
  466. SubscriptionID: "subscriptionID",
  467. Account: "account",
  468. Container: "container",
  469. Path: "path",
  470. Cloud: "cloud",
  471. Authorizer: &AuthorizerHolder{
  472. Authorizer: &DefaultAzureCredentialHolder{},
  473. },
  474. },
  475. },
  476. }
  477. for name, testCase := range testCases {
  478. t.Run(name, func(t *testing.T) {
  479. // test JSON Marshalling
  480. configJSON, err := json.Marshal(testCase.config)
  481. if err != nil {
  482. t.Errorf("failed to marshal configuration: %s", err.Error())
  483. }
  484. log.Info(string(configJSON))
  485. unmarshalledConfig := &StorageConfiguration{}
  486. err = json.Unmarshal(configJSON, unmarshalledConfig)
  487. if err != nil {
  488. t.Errorf("failed to unmarshal configuration: %s", err.Error())
  489. }
  490. if !testCase.config.Equals(unmarshalledConfig) {
  491. t.Error("config does not equal unmarshalled config")
  492. }
  493. })
  494. }
  495. }