natdtable.go 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. // Copyright 2023 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 volcengine
  15. import (
  16. "fmt"
  17. "strconv"
  18. api "yunion.io/x/cloudmux/pkg/apis/compute"
  19. "yunion.io/x/cloudmux/pkg/cloudprovider"
  20. "yunion.io/x/cloudmux/pkg/multicloud"
  21. "yunion.io/x/pkg/errors"
  22. )
  23. type SDNATEntry struct {
  24. multicloud.SResourceBase
  25. VolcEngineTags
  26. nat *SNatGateway
  27. NatGatewayId string
  28. DnatEntryId string
  29. DnatEntryName string
  30. Protocol string
  31. InternalIp string
  32. InternalPort string
  33. ExternalIp string
  34. ExternalPort string
  35. Status string
  36. }
  37. func (dentry *SDNATEntry) GetName() string {
  38. if len(dentry.DnatEntryName) > 0 {
  39. return dentry.DnatEntryName
  40. }
  41. return dentry.DnatEntryId
  42. }
  43. func (dentry *SDNATEntry) GetId() string {
  44. return dentry.DnatEntryId
  45. }
  46. func (dentry *SDNATEntry) GetGlobalId() string {
  47. return dentry.DnatEntryId
  48. }
  49. func (dentry *SDNATEntry) GetStatus() string {
  50. switch dentry.Status {
  51. case "Creating":
  52. return api.NAT_STATUS_ALLOCATE
  53. case "Available":
  54. return api.NAT_STAUTS_AVAILABLE
  55. case "Deleteting":
  56. return api.NAT_STATUS_DELETING
  57. default:
  58. return api.NAT_STATUS_UNKNOWN
  59. }
  60. }
  61. func (dentry *SDNATEntry) GetIpProtocol() string {
  62. return dentry.Protocol
  63. }
  64. func (dentry *SDNATEntry) GetExternalIp() string {
  65. return dentry.ExternalIp
  66. }
  67. func (dentry *SDNATEntry) GetExternalPort() int {
  68. port, _ := strconv.Atoi(dentry.ExternalPort)
  69. return port
  70. }
  71. func (dentry *SDNATEntry) GetInternalIp() string {
  72. return dentry.InternalIp
  73. }
  74. func (dentry *SDNATEntry) GetInternalPort() int {
  75. port, _ := strconv.Atoi(dentry.InternalPort)
  76. return port
  77. }
  78. func (dentry *SDNATEntry) Delete() error {
  79. return dentry.nat.vpc.region.DeleteDnatEntry(dentry.DnatEntryId)
  80. }
  81. func (nat *SNatGateway) getDnatEntries() ([]SDNATEntry, error) {
  82. entries := make([]SDNATEntry, 0)
  83. pageNumber := 1
  84. for {
  85. parts, total, err := nat.vpc.region.GetDnatEntries(nat.NatGatewayId, pageNumber, 50)
  86. if err != nil {
  87. return nil, err
  88. }
  89. entries = append(entries, parts...)
  90. if len(entries) >= total {
  91. break
  92. }
  93. pageNumber += 1
  94. }
  95. return entries, nil
  96. }
  97. func (region *SRegion) GetDnatEntries(natGatewayId string, pageNumber int, pageSize int) ([]SDNATEntry, int, error) {
  98. if pageSize > 100 || pageSize <= 0 {
  99. pageSize = 100
  100. }
  101. params := make(map[string]string)
  102. params["NatGatewayId"] = natGatewayId
  103. params["PageSize"] = fmt.Sprintf("%d", pageSize)
  104. params["PageNumber"] = fmt.Sprintf("%d", pageNumber)
  105. body, err := region.natRequest("DescribeDnatEntries", params)
  106. if err != nil {
  107. return nil, 0, errors.Wrapf(err, "DescribeDnatEntries fail")
  108. }
  109. entries := make([]SDNATEntry, 0)
  110. err = body.Unmarshal(&entries, "DnatEntries")
  111. if err != nil {
  112. return nil, 0, errors.Wrapf(err, "Unmarshal entries fail")
  113. }
  114. total, _ := body.Int("TotalCount")
  115. return entries, int(total), nil
  116. }
  117. func (region *SRegion) GetDnatEntry(natGatewayId string, dnatEntryID string) (SDNATEntry, error) {
  118. params := make(map[string]string)
  119. params["NatGatewayId"] = natGatewayId
  120. params["DnatEntryIds.1"] = dnatEntryID
  121. body, err := region.natRequest("DescribeDnatEntries", params)
  122. if err != nil {
  123. return SDNATEntry{}, errors.Wrapf(err, "DescribeDnatEntries fail")
  124. }
  125. entries := make([]SDNATEntry, 0)
  126. err = body.Unmarshal(&entries, "DnatEntries")
  127. if err != nil {
  128. return SDNATEntry{}, errors.Wrapf(err, "Unmarshal entries fail")
  129. }
  130. if len(entries) == 0 {
  131. return SDNATEntry{}, cloudprovider.ErrNotFound
  132. }
  133. return entries[0], nil
  134. }
  135. func (region *SRegion) CreateDnatEntry(rule cloudprovider.SNatDRule, natGatewayId string) (string, error) {
  136. params := make(map[string]string)
  137. params["NatGatewayId"] = natGatewayId
  138. params["ExternalIp"] = rule.ExternalIP
  139. params["ExternalPort"] = strconv.Itoa(rule.ExternalPort)
  140. params["InternalIp"] = rule.InternalIP
  141. params["InternalPort"] = strconv.Itoa(rule.InternalPort)
  142. params["Protocol"] = rule.Protocol
  143. body, err := region.natRequest("CreateDnatEntry", params)
  144. if err != nil {
  145. return "", err
  146. }
  147. entryID, _ := body.GetString("DnatEntryId")
  148. return entryID, nil
  149. }
  150. func (region *SRegion) DeleteDnatEntry(dnatEntryId string) error {
  151. params := make(map[string]string)
  152. params["DnatEntryId"] = dnatEntryId
  153. _, err := region.natRequest("DeleteDnatEntry", params)
  154. return err
  155. }