DomainService.go 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952
  1. //
  2. // Copyright 2016, Sander van Harmelen
  3. //
  4. // Licensed under the Apache License, Version 2.0 (the "License");
  5. // you may not use this file except in compliance with the License.
  6. // You may obtain a copy of the License at
  7. //
  8. // http://www.apache.org/licenses/LICENSE-2.0
  9. //
  10. // Unless required by applicable law or agreed to in writing, software
  11. // distributed under the License is distributed on an "AS IS" BASIS,
  12. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. // See the License for the specific language governing permissions and
  14. // limitations under the License.
  15. //
  16. package cloudstack
  17. import (
  18. "encoding/json"
  19. "fmt"
  20. "net/url"
  21. "strconv"
  22. "strings"
  23. )
  24. type CreateDomainParams struct {
  25. p map[string]interface{}
  26. }
  27. func (p *CreateDomainParams) toURLValues() url.Values {
  28. u := url.Values{}
  29. if p.p == nil {
  30. return u
  31. }
  32. if v, found := p.p["domainid"]; found {
  33. u.Set("domainid", v.(string))
  34. }
  35. if v, found := p.p["name"]; found {
  36. u.Set("name", v.(string))
  37. }
  38. if v, found := p.p["networkdomain"]; found {
  39. u.Set("networkdomain", v.(string))
  40. }
  41. if v, found := p.p["parentdomainid"]; found {
  42. u.Set("parentdomainid", v.(string))
  43. }
  44. return u
  45. }
  46. func (p *CreateDomainParams) SetDomainid(v string) {
  47. if p.p == nil {
  48. p.p = make(map[string]interface{})
  49. }
  50. p.p["domainid"] = v
  51. return
  52. }
  53. func (p *CreateDomainParams) SetName(v string) {
  54. if p.p == nil {
  55. p.p = make(map[string]interface{})
  56. }
  57. p.p["name"] = v
  58. return
  59. }
  60. func (p *CreateDomainParams) SetNetworkdomain(v string) {
  61. if p.p == nil {
  62. p.p = make(map[string]interface{})
  63. }
  64. p.p["networkdomain"] = v
  65. return
  66. }
  67. func (p *CreateDomainParams) SetParentdomainid(v string) {
  68. if p.p == nil {
  69. p.p = make(map[string]interface{})
  70. }
  71. p.p["parentdomainid"] = v
  72. return
  73. }
  74. // You should always use this function to get a new CreateDomainParams instance,
  75. // as then you are sure you have configured all required params
  76. func (s *DomainService) NewCreateDomainParams(name string) *CreateDomainParams {
  77. p := &CreateDomainParams{}
  78. p.p = make(map[string]interface{})
  79. p.p["name"] = name
  80. return p
  81. }
  82. // Creates a domain
  83. func (s *DomainService) CreateDomain(p *CreateDomainParams) (*CreateDomainResponse, error) {
  84. resp, err := s.cs.newRequest("createDomain", p.toURLValues())
  85. if err != nil {
  86. return nil, err
  87. }
  88. var r CreateDomainResponse
  89. if err := json.Unmarshal(resp, &r); err != nil {
  90. return nil, err
  91. }
  92. return &r, nil
  93. }
  94. type CreateDomainResponse struct {
  95. Cpuavailable string `json:"cpuavailable,omitempty"`
  96. Cpulimit string `json:"cpulimit,omitempty"`
  97. Cputotal int64 `json:"cputotal,omitempty"`
  98. Haschild bool `json:"haschild,omitempty"`
  99. Id string `json:"id,omitempty"`
  100. Ipavailable string `json:"ipavailable,omitempty"`
  101. Iplimit string `json:"iplimit,omitempty"`
  102. Iptotal int64 `json:"iptotal,omitempty"`
  103. Level int `json:"level,omitempty"`
  104. Memoryavailable string `json:"memoryavailable,omitempty"`
  105. Memorylimit string `json:"memorylimit,omitempty"`
  106. Memorytotal int64 `json:"memorytotal,omitempty"`
  107. Name string `json:"name,omitempty"`
  108. Networkavailable string `json:"networkavailable,omitempty"`
  109. Networkdomain string `json:"networkdomain,omitempty"`
  110. Networklimit string `json:"networklimit,omitempty"`
  111. Networktotal int64 `json:"networktotal,omitempty"`
  112. Parentdomainid string `json:"parentdomainid,omitempty"`
  113. Parentdomainname string `json:"parentdomainname,omitempty"`
  114. Path string `json:"path,omitempty"`
  115. Primarystorageavailable string `json:"primarystorageavailable,omitempty"`
  116. Primarystoragelimit string `json:"primarystoragelimit,omitempty"`
  117. Primarystoragetotal int64 `json:"primarystoragetotal,omitempty"`
  118. Projectavailable string `json:"projectavailable,omitempty"`
  119. Projectlimit string `json:"projectlimit,omitempty"`
  120. Projecttotal int64 `json:"projecttotal,omitempty"`
  121. Secondarystorageavailable string `json:"secondarystorageavailable,omitempty"`
  122. Secondarystoragelimit string `json:"secondarystoragelimit,omitempty"`
  123. Secondarystoragetotal int64 `json:"secondarystoragetotal,omitempty"`
  124. Snapshotavailable string `json:"snapshotavailable,omitempty"`
  125. Snapshotlimit string `json:"snapshotlimit,omitempty"`
  126. Snapshottotal int64 `json:"snapshottotal,omitempty"`
  127. State string `json:"state,omitempty"`
  128. Templateavailable string `json:"templateavailable,omitempty"`
  129. Templatelimit string `json:"templatelimit,omitempty"`
  130. Templatetotal int64 `json:"templatetotal,omitempty"`
  131. Vmavailable string `json:"vmavailable,omitempty"`
  132. Vmlimit string `json:"vmlimit,omitempty"`
  133. Vmtotal int64 `json:"vmtotal,omitempty"`
  134. Volumeavailable string `json:"volumeavailable,omitempty"`
  135. Volumelimit string `json:"volumelimit,omitempty"`
  136. Volumetotal int64 `json:"volumetotal,omitempty"`
  137. Vpcavailable string `json:"vpcavailable,omitempty"`
  138. Vpclimit string `json:"vpclimit,omitempty"`
  139. Vpctotal int64 `json:"vpctotal,omitempty"`
  140. }
  141. type UpdateDomainParams struct {
  142. p map[string]interface{}
  143. }
  144. func (p *UpdateDomainParams) toURLValues() url.Values {
  145. u := url.Values{}
  146. if p.p == nil {
  147. return u
  148. }
  149. if v, found := p.p["id"]; found {
  150. u.Set("id", v.(string))
  151. }
  152. if v, found := p.p["name"]; found {
  153. u.Set("name", v.(string))
  154. }
  155. if v, found := p.p["networkdomain"]; found {
  156. u.Set("networkdomain", v.(string))
  157. }
  158. return u
  159. }
  160. func (p *UpdateDomainParams) SetId(v string) {
  161. if p.p == nil {
  162. p.p = make(map[string]interface{})
  163. }
  164. p.p["id"] = v
  165. return
  166. }
  167. func (p *UpdateDomainParams) SetName(v string) {
  168. if p.p == nil {
  169. p.p = make(map[string]interface{})
  170. }
  171. p.p["name"] = v
  172. return
  173. }
  174. func (p *UpdateDomainParams) SetNetworkdomain(v string) {
  175. if p.p == nil {
  176. p.p = make(map[string]interface{})
  177. }
  178. p.p["networkdomain"] = v
  179. return
  180. }
  181. // You should always use this function to get a new UpdateDomainParams instance,
  182. // as then you are sure you have configured all required params
  183. func (s *DomainService) NewUpdateDomainParams(id string) *UpdateDomainParams {
  184. p := &UpdateDomainParams{}
  185. p.p = make(map[string]interface{})
  186. p.p["id"] = id
  187. return p
  188. }
  189. // Updates a domain with a new name
  190. func (s *DomainService) UpdateDomain(p *UpdateDomainParams) (*UpdateDomainResponse, error) {
  191. resp, err := s.cs.newRequest("updateDomain", p.toURLValues())
  192. if err != nil {
  193. return nil, err
  194. }
  195. var r UpdateDomainResponse
  196. if err := json.Unmarshal(resp, &r); err != nil {
  197. return nil, err
  198. }
  199. return &r, nil
  200. }
  201. type UpdateDomainResponse struct {
  202. Cpuavailable string `json:"cpuavailable,omitempty"`
  203. Cpulimit string `json:"cpulimit,omitempty"`
  204. Cputotal int64 `json:"cputotal,omitempty"`
  205. Haschild bool `json:"haschild,omitempty"`
  206. Id string `json:"id,omitempty"`
  207. Ipavailable string `json:"ipavailable,omitempty"`
  208. Iplimit string `json:"iplimit,omitempty"`
  209. Iptotal int64 `json:"iptotal,omitempty"`
  210. Level int `json:"level,omitempty"`
  211. Memoryavailable string `json:"memoryavailable,omitempty"`
  212. Memorylimit string `json:"memorylimit,omitempty"`
  213. Memorytotal int64 `json:"memorytotal,omitempty"`
  214. Name string `json:"name,omitempty"`
  215. Networkavailable string `json:"networkavailable,omitempty"`
  216. Networkdomain string `json:"networkdomain,omitempty"`
  217. Networklimit string `json:"networklimit,omitempty"`
  218. Networktotal int64 `json:"networktotal,omitempty"`
  219. Parentdomainid string `json:"parentdomainid,omitempty"`
  220. Parentdomainname string `json:"parentdomainname,omitempty"`
  221. Path string `json:"path,omitempty"`
  222. Primarystorageavailable string `json:"primarystorageavailable,omitempty"`
  223. Primarystoragelimit string `json:"primarystoragelimit,omitempty"`
  224. Primarystoragetotal int64 `json:"primarystoragetotal,omitempty"`
  225. Projectavailable string `json:"projectavailable,omitempty"`
  226. Projectlimit string `json:"projectlimit,omitempty"`
  227. Projecttotal int64 `json:"projecttotal,omitempty"`
  228. Secondarystorageavailable string `json:"secondarystorageavailable,omitempty"`
  229. Secondarystoragelimit string `json:"secondarystoragelimit,omitempty"`
  230. Secondarystoragetotal int64 `json:"secondarystoragetotal,omitempty"`
  231. Snapshotavailable string `json:"snapshotavailable,omitempty"`
  232. Snapshotlimit string `json:"snapshotlimit,omitempty"`
  233. Snapshottotal int64 `json:"snapshottotal,omitempty"`
  234. State string `json:"state,omitempty"`
  235. Templateavailable string `json:"templateavailable,omitempty"`
  236. Templatelimit string `json:"templatelimit,omitempty"`
  237. Templatetotal int64 `json:"templatetotal,omitempty"`
  238. Vmavailable string `json:"vmavailable,omitempty"`
  239. Vmlimit string `json:"vmlimit,omitempty"`
  240. Vmtotal int64 `json:"vmtotal,omitempty"`
  241. Volumeavailable string `json:"volumeavailable,omitempty"`
  242. Volumelimit string `json:"volumelimit,omitempty"`
  243. Volumetotal int64 `json:"volumetotal,omitempty"`
  244. Vpcavailable string `json:"vpcavailable,omitempty"`
  245. Vpclimit string `json:"vpclimit,omitempty"`
  246. Vpctotal int64 `json:"vpctotal,omitempty"`
  247. }
  248. type DeleteDomainParams struct {
  249. p map[string]interface{}
  250. }
  251. func (p *DeleteDomainParams) toURLValues() url.Values {
  252. u := url.Values{}
  253. if p.p == nil {
  254. return u
  255. }
  256. if v, found := p.p["cleanup"]; found {
  257. vv := strconv.FormatBool(v.(bool))
  258. u.Set("cleanup", vv)
  259. }
  260. if v, found := p.p["id"]; found {
  261. u.Set("id", v.(string))
  262. }
  263. return u
  264. }
  265. func (p *DeleteDomainParams) SetCleanup(v bool) {
  266. if p.p == nil {
  267. p.p = make(map[string]interface{})
  268. }
  269. p.p["cleanup"] = v
  270. return
  271. }
  272. func (p *DeleteDomainParams) SetId(v string) {
  273. if p.p == nil {
  274. p.p = make(map[string]interface{})
  275. }
  276. p.p["id"] = v
  277. return
  278. }
  279. // You should always use this function to get a new DeleteDomainParams instance,
  280. // as then you are sure you have configured all required params
  281. func (s *DomainService) NewDeleteDomainParams(id string) *DeleteDomainParams {
  282. p := &DeleteDomainParams{}
  283. p.p = make(map[string]interface{})
  284. p.p["id"] = id
  285. return p
  286. }
  287. // Deletes a specified domain
  288. func (s *DomainService) DeleteDomain(p *DeleteDomainParams) (*DeleteDomainResponse, error) {
  289. resp, err := s.cs.newRequest("deleteDomain", p.toURLValues())
  290. if err != nil {
  291. return nil, err
  292. }
  293. var r DeleteDomainResponse
  294. if err := json.Unmarshal(resp, &r); err != nil {
  295. return nil, err
  296. }
  297. // If we have a async client, we need to wait for the async result
  298. if s.cs.async {
  299. b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
  300. if err != nil {
  301. if err == AsyncTimeoutErr {
  302. return &r, err
  303. }
  304. return nil, err
  305. }
  306. if err := json.Unmarshal(b, &r); err != nil {
  307. return nil, err
  308. }
  309. }
  310. return &r, nil
  311. }
  312. type DeleteDomainResponse struct {
  313. JobID string `json:"jobid,omitempty"`
  314. Displaytext string `json:"displaytext,omitempty"`
  315. Success bool `json:"success,omitempty"`
  316. }
  317. type ListDomainsParams struct {
  318. p map[string]interface{}
  319. }
  320. func (p *ListDomainsParams) toURLValues() url.Values {
  321. u := url.Values{}
  322. if p.p == nil {
  323. return u
  324. }
  325. if v, found := p.p["id"]; found {
  326. u.Set("id", v.(string))
  327. }
  328. if v, found := p.p["keyword"]; found {
  329. u.Set("keyword", v.(string))
  330. }
  331. if v, found := p.p["level"]; found {
  332. vv := strconv.Itoa(v.(int))
  333. u.Set("level", vv)
  334. }
  335. if v, found := p.p["listall"]; found {
  336. vv := strconv.FormatBool(v.(bool))
  337. u.Set("listall", vv)
  338. }
  339. if v, found := p.p["name"]; found {
  340. u.Set("name", v.(string))
  341. }
  342. if v, found := p.p["page"]; found {
  343. vv := strconv.Itoa(v.(int))
  344. u.Set("page", vv)
  345. }
  346. if v, found := p.p["pagesize"]; found {
  347. vv := strconv.Itoa(v.(int))
  348. u.Set("pagesize", vv)
  349. }
  350. return u
  351. }
  352. func (p *ListDomainsParams) SetId(v string) {
  353. if p.p == nil {
  354. p.p = make(map[string]interface{})
  355. }
  356. p.p["id"] = v
  357. return
  358. }
  359. func (p *ListDomainsParams) SetKeyword(v string) {
  360. if p.p == nil {
  361. p.p = make(map[string]interface{})
  362. }
  363. p.p["keyword"] = v
  364. return
  365. }
  366. func (p *ListDomainsParams) SetLevel(v int) {
  367. if p.p == nil {
  368. p.p = make(map[string]interface{})
  369. }
  370. p.p["level"] = v
  371. return
  372. }
  373. func (p *ListDomainsParams) SetListall(v bool) {
  374. if p.p == nil {
  375. p.p = make(map[string]interface{})
  376. }
  377. p.p["listall"] = v
  378. return
  379. }
  380. func (p *ListDomainsParams) SetName(v string) {
  381. if p.p == nil {
  382. p.p = make(map[string]interface{})
  383. }
  384. p.p["name"] = v
  385. return
  386. }
  387. func (p *ListDomainsParams) SetPage(v int) {
  388. if p.p == nil {
  389. p.p = make(map[string]interface{})
  390. }
  391. p.p["page"] = v
  392. return
  393. }
  394. func (p *ListDomainsParams) SetPagesize(v int) {
  395. if p.p == nil {
  396. p.p = make(map[string]interface{})
  397. }
  398. p.p["pagesize"] = v
  399. return
  400. }
  401. // You should always use this function to get a new ListDomainsParams instance,
  402. // as then you are sure you have configured all required params
  403. func (s *DomainService) NewListDomainsParams() *ListDomainsParams {
  404. p := &ListDomainsParams{}
  405. p.p = make(map[string]interface{})
  406. return p
  407. }
  408. // This is a courtesy helper function, which in some cases may not work as expected!
  409. func (s *DomainService) GetDomainID(name string, opts ...OptionFunc) (string, int, error) {
  410. p := &ListDomainsParams{}
  411. p.p = make(map[string]interface{})
  412. p.p["name"] = name
  413. for _, fn := range opts {
  414. if err := fn(s.cs, p); err != nil {
  415. return "", -1, err
  416. }
  417. }
  418. l, err := s.ListDomains(p)
  419. if err != nil {
  420. return "", -1, err
  421. }
  422. if l.Count == 0 {
  423. return "", l.Count, fmt.Errorf("No match found for %s: %+v", name, l)
  424. }
  425. if l.Count == 1 {
  426. return l.Domains[0].Id, l.Count, nil
  427. }
  428. if l.Count > 1 {
  429. for _, v := range l.Domains {
  430. if v.Name == name {
  431. return v.Id, l.Count, nil
  432. }
  433. }
  434. }
  435. return "", l.Count, fmt.Errorf("Could not find an exact match for %s: %+v", name, l)
  436. }
  437. // This is a courtesy helper function, which in some cases may not work as expected!
  438. func (s *DomainService) GetDomainByName(name string, opts ...OptionFunc) (*Domain, int, error) {
  439. id, count, err := s.GetDomainID(name, opts...)
  440. if err != nil {
  441. return nil, count, err
  442. }
  443. r, count, err := s.GetDomainByID(id, opts...)
  444. if err != nil {
  445. return nil, count, err
  446. }
  447. return r, count, nil
  448. }
  449. // This is a courtesy helper function, which in some cases may not work as expected!
  450. func (s *DomainService) GetDomainByID(id string, opts ...OptionFunc) (*Domain, int, error) {
  451. p := &ListDomainsParams{}
  452. p.p = make(map[string]interface{})
  453. p.p["id"] = id
  454. for _, fn := range opts {
  455. if err := fn(s.cs, p); err != nil {
  456. return nil, -1, err
  457. }
  458. }
  459. l, err := s.ListDomains(p)
  460. if err != nil {
  461. if strings.Contains(err.Error(), fmt.Sprintf(
  462. "Invalid parameter id value=%s due to incorrect long value format, "+
  463. "or entity does not exist", id)) {
  464. return nil, 0, fmt.Errorf("No match found for %s: %+v", id, l)
  465. }
  466. return nil, -1, err
  467. }
  468. if l.Count == 0 {
  469. return nil, l.Count, fmt.Errorf("No match found for %s: %+v", id, l)
  470. }
  471. if l.Count == 1 {
  472. return l.Domains[0], l.Count, nil
  473. }
  474. return nil, l.Count, fmt.Errorf("There is more then one result for Domain UUID: %s!", id)
  475. }
  476. // Lists domains and provides detailed information for listed domains
  477. func (s *DomainService) ListDomains(p *ListDomainsParams) (*ListDomainsResponse, error) {
  478. resp, err := s.cs.newRequest("listDomains", p.toURLValues())
  479. if err != nil {
  480. return nil, err
  481. }
  482. var r ListDomainsResponse
  483. if err := json.Unmarshal(resp, &r); err != nil {
  484. return nil, err
  485. }
  486. return &r, nil
  487. }
  488. type ListDomainsResponse struct {
  489. Count int `json:"count"`
  490. Domains []*Domain `json:"domain"`
  491. }
  492. type Domain struct {
  493. Cpuavailable string `json:"cpuavailable,omitempty"`
  494. Cpulimit string `json:"cpulimit,omitempty"`
  495. Cputotal int64 `json:"cputotal,omitempty"`
  496. Haschild bool `json:"haschild,omitempty"`
  497. Id string `json:"id,omitempty"`
  498. Ipavailable string `json:"ipavailable,omitempty"`
  499. Iplimit string `json:"iplimit,omitempty"`
  500. Iptotal int64 `json:"iptotal,omitempty"`
  501. Level int `json:"level,omitempty"`
  502. Memoryavailable string `json:"memoryavailable,omitempty"`
  503. Memorylimit string `json:"memorylimit,omitempty"`
  504. Memorytotal int64 `json:"memorytotal,omitempty"`
  505. Name string `json:"name,omitempty"`
  506. Networkavailable string `json:"networkavailable,omitempty"`
  507. Networkdomain string `json:"networkdomain,omitempty"`
  508. Networklimit string `json:"networklimit,omitempty"`
  509. Networktotal int64 `json:"networktotal,omitempty"`
  510. Parentdomainid string `json:"parentdomainid,omitempty"`
  511. Parentdomainname string `json:"parentdomainname,omitempty"`
  512. Path string `json:"path,omitempty"`
  513. Primarystorageavailable string `json:"primarystorageavailable,omitempty"`
  514. Primarystoragelimit string `json:"primarystoragelimit,omitempty"`
  515. Primarystoragetotal int64 `json:"primarystoragetotal,omitempty"`
  516. Projectavailable string `json:"projectavailable,omitempty"`
  517. Projectlimit string `json:"projectlimit,omitempty"`
  518. Projecttotal int64 `json:"projecttotal,omitempty"`
  519. Secondarystorageavailable string `json:"secondarystorageavailable,omitempty"`
  520. Secondarystoragelimit string `json:"secondarystoragelimit,omitempty"`
  521. Secondarystoragetotal int64 `json:"secondarystoragetotal,omitempty"`
  522. Snapshotavailable string `json:"snapshotavailable,omitempty"`
  523. Snapshotlimit string `json:"snapshotlimit,omitempty"`
  524. Snapshottotal int64 `json:"snapshottotal,omitempty"`
  525. State string `json:"state,omitempty"`
  526. Templateavailable string `json:"templateavailable,omitempty"`
  527. Templatelimit string `json:"templatelimit,omitempty"`
  528. Templatetotal int64 `json:"templatetotal,omitempty"`
  529. Vmavailable string `json:"vmavailable,omitempty"`
  530. Vmlimit string `json:"vmlimit,omitempty"`
  531. Vmtotal int64 `json:"vmtotal,omitempty"`
  532. Volumeavailable string `json:"volumeavailable,omitempty"`
  533. Volumelimit string `json:"volumelimit,omitempty"`
  534. Volumetotal int64 `json:"volumetotal,omitempty"`
  535. Vpcavailable string `json:"vpcavailable,omitempty"`
  536. Vpclimit string `json:"vpclimit,omitempty"`
  537. Vpctotal int64 `json:"vpctotal,omitempty"`
  538. }
  539. type ListDomainChildrenParams struct {
  540. p map[string]interface{}
  541. }
  542. func (p *ListDomainChildrenParams) toURLValues() url.Values {
  543. u := url.Values{}
  544. if p.p == nil {
  545. return u
  546. }
  547. if v, found := p.p["id"]; found {
  548. u.Set("id", v.(string))
  549. }
  550. if v, found := p.p["isrecursive"]; found {
  551. vv := strconv.FormatBool(v.(bool))
  552. u.Set("isrecursive", vv)
  553. }
  554. if v, found := p.p["keyword"]; found {
  555. u.Set("keyword", v.(string))
  556. }
  557. if v, found := p.p["listall"]; found {
  558. vv := strconv.FormatBool(v.(bool))
  559. u.Set("listall", vv)
  560. }
  561. if v, found := p.p["name"]; found {
  562. u.Set("name", v.(string))
  563. }
  564. if v, found := p.p["page"]; found {
  565. vv := strconv.Itoa(v.(int))
  566. u.Set("page", vv)
  567. }
  568. if v, found := p.p["pagesize"]; found {
  569. vv := strconv.Itoa(v.(int))
  570. u.Set("pagesize", vv)
  571. }
  572. return u
  573. }
  574. func (p *ListDomainChildrenParams) SetId(v string) {
  575. if p.p == nil {
  576. p.p = make(map[string]interface{})
  577. }
  578. p.p["id"] = v
  579. return
  580. }
  581. func (p *ListDomainChildrenParams) SetIsrecursive(v bool) {
  582. if p.p == nil {
  583. p.p = make(map[string]interface{})
  584. }
  585. p.p["isrecursive"] = v
  586. return
  587. }
  588. func (p *ListDomainChildrenParams) SetKeyword(v string) {
  589. if p.p == nil {
  590. p.p = make(map[string]interface{})
  591. }
  592. p.p["keyword"] = v
  593. return
  594. }
  595. func (p *ListDomainChildrenParams) SetListall(v bool) {
  596. if p.p == nil {
  597. p.p = make(map[string]interface{})
  598. }
  599. p.p["listall"] = v
  600. return
  601. }
  602. func (p *ListDomainChildrenParams) SetName(v string) {
  603. if p.p == nil {
  604. p.p = make(map[string]interface{})
  605. }
  606. p.p["name"] = v
  607. return
  608. }
  609. func (p *ListDomainChildrenParams) SetPage(v int) {
  610. if p.p == nil {
  611. p.p = make(map[string]interface{})
  612. }
  613. p.p["page"] = v
  614. return
  615. }
  616. func (p *ListDomainChildrenParams) SetPagesize(v int) {
  617. if p.p == nil {
  618. p.p = make(map[string]interface{})
  619. }
  620. p.p["pagesize"] = v
  621. return
  622. }
  623. // You should always use this function to get a new ListDomainChildrenParams instance,
  624. // as then you are sure you have configured all required params
  625. func (s *DomainService) NewListDomainChildrenParams() *ListDomainChildrenParams {
  626. p := &ListDomainChildrenParams{}
  627. p.p = make(map[string]interface{})
  628. return p
  629. }
  630. // This is a courtesy helper function, which in some cases may not work as expected!
  631. func (s *DomainService) GetDomainChildrenID(name string, opts ...OptionFunc) (string, int, error) {
  632. p := &ListDomainChildrenParams{}
  633. p.p = make(map[string]interface{})
  634. p.p["name"] = name
  635. for _, fn := range opts {
  636. if err := fn(s.cs, p); err != nil {
  637. return "", -1, err
  638. }
  639. }
  640. l, err := s.ListDomainChildren(p)
  641. if err != nil {
  642. return "", -1, err
  643. }
  644. if l.Count == 0 {
  645. return "", l.Count, fmt.Errorf("No match found for %s: %+v", name, l)
  646. }
  647. if l.Count == 1 {
  648. return l.DomainChildren[0].Id, l.Count, nil
  649. }
  650. if l.Count > 1 {
  651. for _, v := range l.DomainChildren {
  652. if v.Name == name {
  653. return v.Id, l.Count, nil
  654. }
  655. }
  656. }
  657. return "", l.Count, fmt.Errorf("Could not find an exact match for %s: %+v", name, l)
  658. }
  659. // This is a courtesy helper function, which in some cases may not work as expected!
  660. func (s *DomainService) GetDomainChildrenByName(name string, opts ...OptionFunc) (*DomainChildren, int, error) {
  661. id, count, err := s.GetDomainChildrenID(name, opts...)
  662. if err != nil {
  663. return nil, count, err
  664. }
  665. r, count, err := s.GetDomainChildrenByID(id, opts...)
  666. if err != nil {
  667. return nil, count, err
  668. }
  669. return r, count, nil
  670. }
  671. // This is a courtesy helper function, which in some cases may not work as expected!
  672. func (s *DomainService) GetDomainChildrenByID(id string, opts ...OptionFunc) (*DomainChildren, int, error) {
  673. p := &ListDomainChildrenParams{}
  674. p.p = make(map[string]interface{})
  675. p.p["id"] = id
  676. for _, fn := range opts {
  677. if err := fn(s.cs, p); err != nil {
  678. return nil, -1, err
  679. }
  680. }
  681. l, err := s.ListDomainChildren(p)
  682. if err != nil {
  683. if strings.Contains(err.Error(), fmt.Sprintf(
  684. "Invalid parameter id value=%s due to incorrect long value format, "+
  685. "or entity does not exist", id)) {
  686. return nil, 0, fmt.Errorf("No match found for %s: %+v", id, l)
  687. }
  688. return nil, -1, err
  689. }
  690. if l.Count == 0 {
  691. return nil, l.Count, fmt.Errorf("No match found for %s: %+v", id, l)
  692. }
  693. if l.Count == 1 {
  694. return l.DomainChildren[0], l.Count, nil
  695. }
  696. return nil, l.Count, fmt.Errorf("There is more then one result for DomainChildren UUID: %s!", id)
  697. }
  698. // Lists all children domains belonging to a specified domain
  699. func (s *DomainService) ListDomainChildren(p *ListDomainChildrenParams) (*ListDomainChildrenResponse, error) {
  700. resp, err := s.cs.newRequest("listDomainChildren", p.toURLValues())
  701. if err != nil {
  702. return nil, err
  703. }
  704. var r ListDomainChildrenResponse
  705. if err := json.Unmarshal(resp, &r); err != nil {
  706. return nil, err
  707. }
  708. return &r, nil
  709. }
  710. type ListDomainChildrenResponse struct {
  711. Count int `json:"count"`
  712. DomainChildren []*DomainChildren `json:"domainchildren"`
  713. }
  714. type DomainChildren struct {
  715. Cpuavailable string `json:"cpuavailable,omitempty"`
  716. Cpulimit string `json:"cpulimit,omitempty"`
  717. Cputotal int64 `json:"cputotal,omitempty"`
  718. Haschild bool `json:"haschild,omitempty"`
  719. Id string `json:"id,omitempty"`
  720. Ipavailable string `json:"ipavailable,omitempty"`
  721. Iplimit string `json:"iplimit,omitempty"`
  722. Iptotal int64 `json:"iptotal,omitempty"`
  723. Level int `json:"level,omitempty"`
  724. Memoryavailable string `json:"memoryavailable,omitempty"`
  725. Memorylimit string `json:"memorylimit,omitempty"`
  726. Memorytotal int64 `json:"memorytotal,omitempty"`
  727. Name string `json:"name,omitempty"`
  728. Networkavailable string `json:"networkavailable,omitempty"`
  729. Networkdomain string `json:"networkdomain,omitempty"`
  730. Networklimit string `json:"networklimit,omitempty"`
  731. Networktotal int64 `json:"networktotal,omitempty"`
  732. Parentdomainid string `json:"parentdomainid,omitempty"`
  733. Parentdomainname string `json:"parentdomainname,omitempty"`
  734. Path string `json:"path,omitempty"`
  735. Primarystorageavailable string `json:"primarystorageavailable,omitempty"`
  736. Primarystoragelimit string `json:"primarystoragelimit,omitempty"`
  737. Primarystoragetotal int64 `json:"primarystoragetotal,omitempty"`
  738. Projectavailable string `json:"projectavailable,omitempty"`
  739. Projectlimit string `json:"projectlimit,omitempty"`
  740. Projecttotal int64 `json:"projecttotal,omitempty"`
  741. Secondarystorageavailable string `json:"secondarystorageavailable,omitempty"`
  742. Secondarystoragelimit string `json:"secondarystoragelimit,omitempty"`
  743. Secondarystoragetotal int64 `json:"secondarystoragetotal,omitempty"`
  744. Snapshotavailable string `json:"snapshotavailable,omitempty"`
  745. Snapshotlimit string `json:"snapshotlimit,omitempty"`
  746. Snapshottotal int64 `json:"snapshottotal,omitempty"`
  747. State string `json:"state,omitempty"`
  748. Templateavailable string `json:"templateavailable,omitempty"`
  749. Templatelimit string `json:"templatelimit,omitempty"`
  750. Templatetotal int64 `json:"templatetotal,omitempty"`
  751. Vmavailable string `json:"vmavailable,omitempty"`
  752. Vmlimit string `json:"vmlimit,omitempty"`
  753. Vmtotal int64 `json:"vmtotal,omitempty"`
  754. Volumeavailable string `json:"volumeavailable,omitempty"`
  755. Volumelimit string `json:"volumelimit,omitempty"`
  756. Volumetotal int64 `json:"volumetotal,omitempty"`
  757. Vpcavailable string `json:"vpcavailable,omitempty"`
  758. Vpclimit string `json:"vpclimit,omitempty"`
  759. Vpctotal int64 `json:"vpctotal,omitempty"`
  760. }
  761. type LinkDomainToLdapParams struct {
  762. p map[string]interface{}
  763. }
  764. func (p *LinkDomainToLdapParams) toURLValues() url.Values {
  765. u := url.Values{}
  766. if p.p == nil {
  767. return u
  768. }
  769. if v, found := p.p["accounttype"]; found {
  770. vv := strconv.Itoa(v.(int))
  771. u.Set("accounttype", vv)
  772. }
  773. if v, found := p.p["admin"]; found {
  774. u.Set("admin", v.(string))
  775. }
  776. if v, found := p.p["domainid"]; found {
  777. u.Set("domainid", v.(string))
  778. }
  779. if v, found := p.p["name"]; found {
  780. u.Set("name", v.(string))
  781. }
  782. if v, found := p.p["type"]; found {
  783. u.Set("type", v.(string))
  784. }
  785. return u
  786. }
  787. func (p *LinkDomainToLdapParams) SetAccounttype(v int) {
  788. if p.p == nil {
  789. p.p = make(map[string]interface{})
  790. }
  791. p.p["accounttype"] = v
  792. return
  793. }
  794. func (p *LinkDomainToLdapParams) SetAdmin(v string) {
  795. if p.p == nil {
  796. p.p = make(map[string]interface{})
  797. }
  798. p.p["admin"] = v
  799. return
  800. }
  801. func (p *LinkDomainToLdapParams) SetDomainid(v string) {
  802. if p.p == nil {
  803. p.p = make(map[string]interface{})
  804. }
  805. p.p["domainid"] = v
  806. return
  807. }
  808. func (p *LinkDomainToLdapParams) SetName(v string) {
  809. if p.p == nil {
  810. p.p = make(map[string]interface{})
  811. }
  812. p.p["name"] = v
  813. return
  814. }
  815. func (p *LinkDomainToLdapParams) SetType(v string) {
  816. if p.p == nil {
  817. p.p = make(map[string]interface{})
  818. }
  819. p.p["domainType"] = v
  820. return
  821. }
  822. // You should always use this function to get a new LinkDomainToLdapParams instance,
  823. // as then you are sure you have configured all required params
  824. func (s *DomainService) NewLinkDomainToLdapParams(accounttype int, domainid string, name string, domainType string) *LinkDomainToLdapParams {
  825. p := &LinkDomainToLdapParams{}
  826. p.p = make(map[string]interface{})
  827. p.p["accounttype"] = accounttype
  828. p.p["domainid"] = domainid
  829. p.p["name"] = name
  830. p.p["domainType"] = domainType
  831. return p
  832. }
  833. // link an existing cloudstack domain to group or OU in ldap
  834. func (s *DomainService) LinkDomainToLdap(p *LinkDomainToLdapParams) (*LinkDomainToLdapResponse, error) {
  835. resp, err := s.cs.newRequest("linkDomainToLdap", p.toURLValues())
  836. if err != nil {
  837. return nil, err
  838. }
  839. var r LinkDomainToLdapResponse
  840. if err := json.Unmarshal(resp, &r); err != nil {
  841. return nil, err
  842. }
  843. return &r, nil
  844. }
  845. type LinkDomainToLdapResponse struct {
  846. Accountid string `json:"accountid,omitempty"`
  847. Accounttype int `json:"accounttype,omitempty"`
  848. Domainid int64 `json:"domainid,omitempty"`
  849. Name string `json:"name,omitempty"`
  850. Type string `json:"type,omitempty"`
  851. }