loadbalancerl7rule.go 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  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 openstack
  15. import (
  16. "context"
  17. "fmt"
  18. "net/url"
  19. "yunion.io/x/jsonutils"
  20. "yunion.io/x/pkg/errors"
  21. api "yunion.io/x/cloudmux/pkg/apis/compute"
  22. "yunion.io/x/cloudmux/pkg/cloudprovider"
  23. "yunion.io/x/cloudmux/pkg/multicloud"
  24. )
  25. type SLoadbalancerL7RuleCreateParams struct {
  26. CompareType string `json:"compare_type"`
  27. Invert *bool `json:"invert"`
  28. Type string `json:"type"`
  29. Value string `json:"value"`
  30. AdminStateUp bool `json:"admin_state_up"`
  31. Tags []string `json:"tags"`
  32. }
  33. type SLoadbalancerL7Rule struct {
  34. multicloud.SResourceBase
  35. multicloud.SLoadbalancerRedirectBase
  36. OpenStackTags
  37. policy *SLoadbalancerL7Policy
  38. CreatedAt string `json:"created_at"`
  39. CompareType string `json:"compare_type"`
  40. ProvisioningStatus string `json:"provisioning_status"`
  41. Invert bool `json:"invert"`
  42. AdminStateUp bool `json:"admin_state_up"`
  43. UpdatedAt string `json:"updated_at"`
  44. Value string `json:"value"`
  45. Key string `json:"key"`
  46. ProjectID string `json:"project_id"`
  47. Type string `json:"type"`
  48. ID string `json:"id"`
  49. OperatingStatus string `json:"operating_status"`
  50. Tags []string `json:"tags"`
  51. }
  52. func (region *SRegion) CreateLoadbalancerL7Rule(l7policyId string, rule *cloudprovider.SLoadbalancerListenerRule) (*SLoadbalancerL7Rule, error) {
  53. type Params struct {
  54. L7Rule SLoadbalancerL7RuleCreateParams `json:"rule"`
  55. }
  56. l7ruleParams := Params{}
  57. l7ruleParams.L7Rule.AdminStateUp = true
  58. l7ruleParams.L7Rule.Type = "PATH"
  59. l7ruleParams.L7Rule.Value = rule.Path
  60. l7ruleParams.L7Rule.CompareType = "REGEX"
  61. body, err := region.lbPost(fmt.Sprintf("/v2/lbaas/l7policies/%s/rules", l7policyId), jsonutils.Marshal(l7ruleParams))
  62. if err != nil {
  63. return nil, errors.Wrapf(err, `region.lbPost(/v2/lbaas/l7policies/%s/rules), jsonutils.Marshal(l7ruleParams))`, l7policyId)
  64. }
  65. l7rule := SLoadbalancerL7Rule{}
  66. err = body.Unmarshal(&l7rule, "rule")
  67. if err != nil {
  68. return nil, errors.Wrap(err, `body.Unmarshal(&l7rule, "rule")`)
  69. }
  70. return &l7rule, nil
  71. }
  72. func (policy *SLoadbalancerL7Policy) fetchLoadbalancerL7Rules() error {
  73. l7rules, err := policy.region.GetLoadbalancerL7Rules(policy.ID)
  74. if err != nil {
  75. return errors.Wrapf(err, "policy.region.GetLoadbalancerL7Rules(%s)", policy.ID)
  76. }
  77. for i := 0; i < len(l7rules); i++ {
  78. l7rules[i].policy = policy
  79. }
  80. policy.l7rules = l7rules
  81. return nil
  82. }
  83. func (region *SRegion) GetLoadbalancerL7Rules(policyId string) ([]SLoadbalancerL7Rule, error) {
  84. l7rules := []SLoadbalancerL7Rule{}
  85. resource := fmt.Sprintf("/v2/lbaas/l7policies/%s/rules", policyId)
  86. query := url.Values{}
  87. for {
  88. resp, err := region.lbList(resource, query)
  89. if err != nil {
  90. return nil, errors.Wrap(err, "lbList")
  91. }
  92. part := struct {
  93. Rules []SLoadbalancerL7Rule
  94. RulesLinks SNextLinks
  95. }{}
  96. err = resp.Unmarshal(&part)
  97. if err != nil {
  98. return nil, errors.Wrap(err, "resp.Unmarshal")
  99. }
  100. l7rules = append(l7rules, part.Rules...)
  101. marker := part.RulesLinks.GetNextMark()
  102. if len(marker) == 0 {
  103. break
  104. }
  105. query.Set("marker", marker)
  106. }
  107. return l7rules, nil
  108. }
  109. func (region *SRegion) GetLoadbalancerL7RulebyId(policyId string, l7ruleId string) (*SLoadbalancerL7Rule, error) {
  110. body, err := region.lbGet(fmt.Sprintf("/v2/lbaas/l7policies/%s/rules/%s", policyId, l7ruleId))
  111. if err != nil {
  112. return nil, errors.Wrapf(err, `region.lbGet(/v2/lbaas/l7policies/%s/rules/%s )`, policyId, l7ruleId)
  113. }
  114. l7rule := SLoadbalancerL7Rule{}
  115. return &l7rule, body.Unmarshal(&l7rule, "rule")
  116. }
  117. func (l7r *SLoadbalancerL7Rule) GetName() string {
  118. return l7r.policy.Name + l7r.ID
  119. }
  120. func (l7r *SLoadbalancerL7Rule) GetId() string {
  121. return l7r.ID
  122. }
  123. func (l7r *SLoadbalancerL7Rule) GetGlobalId() string {
  124. return l7r.ID
  125. }
  126. func (l7r *SLoadbalancerL7Rule) GetStatus() string {
  127. switch l7r.ProvisioningStatus {
  128. case "ACTIVE":
  129. return api.LB_STATUS_ENABLED
  130. case "PENDING_CREATE":
  131. return api.LB_CREATING
  132. case "PENDING_UPDATE":
  133. return api.LB_SYNC_CONF
  134. case "PENDING_DELETE":
  135. return api.LB_STATUS_DELETING
  136. case "DELETED":
  137. return api.LB_STATUS_DELETED
  138. default:
  139. return api.LB_STATUS_UNKNOWN
  140. }
  141. }
  142. func (self *SLoadbalancerL7Rule) IsDefault() bool {
  143. return false
  144. }
  145. func (l7r *SLoadbalancerL7Rule) IsEmulated() bool {
  146. return false
  147. }
  148. func (l7r *SLoadbalancerL7Rule) Refresh() error {
  149. newL7r, err := l7r.policy.region.GetLoadbalancerL7RulebyId(l7r.policy.ID, l7r.ID)
  150. if err != nil {
  151. return err
  152. }
  153. return jsonutils.Update(l7r, newL7r)
  154. }
  155. func (l7r *SLoadbalancerL7Rule) GetCondition() string {
  156. return ""
  157. }
  158. func (l7r *SLoadbalancerL7Rule) GetDomain() string {
  159. return ""
  160. }
  161. func (l7r *SLoadbalancerL7Rule) GetPath() string {
  162. return l7r.Value
  163. }
  164. func (l7r *SLoadbalancerL7Rule) GetProjectId() string {
  165. return ""
  166. }
  167. func (l7r *SLoadbalancerL7Rule) GetBackendGroupId() string {
  168. return l7r.policy.RedirectPoolID
  169. }
  170. func (l7r *SLoadbalancerL7Rule) GetBackendGroups() ([]string, error) {
  171. return nil, cloudprovider.ErrNotImplemented
  172. }
  173. func (l7r *SLoadbalancerL7Rule) GetRedirectPool() (cloudprovider.SRedirectPool, error) {
  174. return cloudprovider.SRedirectPool{}, cloudprovider.ErrNotImplemented
  175. }
  176. func (l7r *SLoadbalancerL7Rule) Update(ctx context.Context, opts *cloudprovider.SLoadbalancerListenerRule) error {
  177. return cloudprovider.ErrNotImplemented
  178. }
  179. func (l7r *SLoadbalancerL7Rule) Delete(ctx context.Context) error {
  180. return l7r.policy.region.DeleteLoadbalancerListenerL7policy(l7r.policy.ID)
  181. }