loadbalancermasterslavebackendgroup.go 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  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 aliyun
  15. import (
  16. "context"
  17. "fmt"
  18. "yunion.io/x/jsonutils"
  19. api "yunion.io/x/cloudmux/pkg/apis/compute"
  20. "yunion.io/x/cloudmux/pkg/cloudprovider"
  21. "yunion.io/x/cloudmux/pkg/multicloud"
  22. )
  23. type SLoadbalancerMasterSlaveBackendGroup struct {
  24. multicloud.SLoadbalancerBackendGroupBase
  25. AliyunTags
  26. lb *SLoadbalancer
  27. MasterSlaveServerGroupId string
  28. MasterSlaveServerGroupName string
  29. }
  30. func (backendgroup *SLoadbalancerMasterSlaveBackendGroup) GetLoadbalancerId() string {
  31. return backendgroup.lb.GetId()
  32. }
  33. func (backendgroup *SLoadbalancerMasterSlaveBackendGroup) GetProtocolType() string {
  34. return ""
  35. }
  36. func (backendgroup *SLoadbalancerMasterSlaveBackendGroup) GetScheduler() string {
  37. return ""
  38. }
  39. func (backendgroup *SLoadbalancerMasterSlaveBackendGroup) GetHealthCheck() (*cloudprovider.SLoadbalancerHealthCheck, error) {
  40. return nil, nil
  41. }
  42. func (backendgroup *SLoadbalancerMasterSlaveBackendGroup) GetStickySession() (*cloudprovider.SLoadbalancerStickySession, error) {
  43. return nil, nil
  44. }
  45. func (backendgroup *SLoadbalancerMasterSlaveBackendGroup) GetName() string {
  46. return backendgroup.MasterSlaveServerGroupName
  47. }
  48. func (backendgroup *SLoadbalancerMasterSlaveBackendGroup) GetId() string {
  49. return backendgroup.MasterSlaveServerGroupId
  50. }
  51. func (backendgroup *SLoadbalancerMasterSlaveBackendGroup) GetGlobalId() string {
  52. return backendgroup.GetId()
  53. }
  54. func (backendgroup *SLoadbalancerMasterSlaveBackendGroup) GetStatus() string {
  55. return api.LB_STATUS_ENABLED
  56. }
  57. func (backendgroup *SLoadbalancerMasterSlaveBackendGroup) IsEmulated() bool {
  58. return false
  59. }
  60. func (backendgroup *SLoadbalancerMasterSlaveBackendGroup) Refresh() error {
  61. return nil
  62. }
  63. func (backendgroup *SLoadbalancerMasterSlaveBackendGroup) IsDefault() bool {
  64. return false
  65. }
  66. func (backendgroup *SLoadbalancerMasterSlaveBackendGroup) GetType() string {
  67. return api.LB_BACKENDGROUP_TYPE_MASTER_SLAVE
  68. }
  69. func (region *SRegion) GetLoadbalancerMasterSlaveBackendgroups(loadbalancerId string) ([]SLoadbalancerMasterSlaveBackendGroup, error) {
  70. params := map[string]string{}
  71. params["RegionId"] = region.RegionId
  72. params["LoadBalancerId"] = loadbalancerId
  73. body, err := region.lbRequest("DescribeMasterSlaveServerGroups", params)
  74. if err != nil {
  75. return nil, err
  76. }
  77. backendgroups := []SLoadbalancerMasterSlaveBackendGroup{}
  78. return backendgroups, body.Unmarshal(&backendgroups, "MasterSlaveServerGroups", "MasterSlaveServerGroup")
  79. }
  80. func (region *SRegion) GetLoadbalancerMasterSlaveBackends(backendgroupId string) ([]SLoadbalancerMasterSlaveBackend, error) {
  81. params := map[string]string{}
  82. params["RegionId"] = region.RegionId
  83. params["MasterSlaveServerGroupId"] = backendgroupId
  84. body, err := region.lbRequest("DescribeMasterSlaveServerGroupAttribute", params)
  85. if err != nil {
  86. return nil, err
  87. }
  88. backends := []SLoadbalancerMasterSlaveBackend{}
  89. return backends, body.Unmarshal(&backends, "MasterSlaveBackendServers", "MasterSlaveBackendServer")
  90. }
  91. func (backendgroup *SLoadbalancerMasterSlaveBackendGroup) GetILoadbalancerBackends() ([]cloudprovider.ICloudLoadbalancerBackend, error) {
  92. backends, err := backendgroup.lb.region.GetLoadbalancerMasterSlaveBackends(backendgroup.MasterSlaveServerGroupId)
  93. if err != nil {
  94. return nil, err
  95. }
  96. ibackends := []cloudprovider.ICloudLoadbalancerBackend{}
  97. for i := 0; i < len(backends); i++ {
  98. backends[i].lbbg = backendgroup
  99. ibackends = append(ibackends, &backends[i])
  100. }
  101. return ibackends, nil
  102. }
  103. func (backendgroup *SLoadbalancerMasterSlaveBackendGroup) GetILoadbalancerBackendById(backendId string) (cloudprovider.ICloudLoadbalancerBackend, error) {
  104. backends, err := backendgroup.GetILoadbalancerBackends()
  105. if err != nil {
  106. return nil, err
  107. }
  108. for i := 0; i < len(backends); i++ {
  109. if backends[i].GetGlobalId() == backendId {
  110. return backends[i], nil
  111. }
  112. }
  113. return nil, cloudprovider.ErrNotFound
  114. }
  115. func (region *SRegion) CreateLoadbalancerMasterSlaveBackendGroup(name, loadbalancerId string, backends []cloudprovider.SLoadbalancerBackend) (*SLoadbalancerMasterSlaveBackendGroup, error) {
  116. params := map[string]string{}
  117. params["RegionId"] = region.RegionId
  118. params["MasterSlaveServerGroupName"] = name
  119. params["LoadBalancerId"] = loadbalancerId
  120. if len(backends) != 2 {
  121. return nil, fmt.Errorf("master slave backendgorup must contain two backend")
  122. }
  123. servers := jsonutils.NewArray()
  124. for _, backend := range backends {
  125. serverType := "Slave"
  126. if backend.Index == 0 {
  127. serverType = "Master"
  128. }
  129. servers.Add(
  130. jsonutils.Marshal(
  131. map[string]string{
  132. "ServerId": backend.ExternalId,
  133. "Port": fmt.Sprintf("%d", backend.Port),
  134. "Weight": fmt.Sprintf("%d", backend.Weight),
  135. "ServerType": serverType,
  136. },
  137. ))
  138. }
  139. params["MasterSlaveBackendServers"] = servers.String()
  140. body, err := region.lbRequest("CreateMasterSlaveServerGroup", params)
  141. if err != nil {
  142. return nil, err
  143. }
  144. groupId, err := body.GetString("MasterSlaveServerGroupId")
  145. if err != nil {
  146. return nil, err
  147. }
  148. return region.GetLoadbalancerMasterSlaveBackendgroupById(groupId)
  149. }
  150. func (region *SRegion) GetLoadbalancerMasterSlaveBackendgroupById(groupId string) (*SLoadbalancerMasterSlaveBackendGroup, error) {
  151. params := map[string]string{}
  152. params["RegionId"] = region.RegionId
  153. params["MasterSlaveServerGroupId"] = groupId
  154. params["NeedInstanceDetail"] = "true"
  155. body, err := region.lbRequest("DescribeMasterSlaveServerGroupAttribute", params)
  156. if err != nil {
  157. return nil, err
  158. }
  159. group := &SLoadbalancerMasterSlaveBackendGroup{}
  160. return group, body.Unmarshal(group)
  161. }
  162. func (region *SRegion) DeleteLoadbalancerMasterSlaveBackendgroup(groupId string) error {
  163. params := map[string]string{}
  164. params["RegionId"] = region.RegionId
  165. params["MasterSlaveServerGroupId"] = groupId
  166. _, err := region.lbRequest("DeleteMasterSlaveServerGroup", params)
  167. return err
  168. }
  169. func (backendgroup *SLoadbalancerMasterSlaveBackendGroup) Delete(ctx context.Context) error {
  170. return backendgroup.lb.region.DeleteLoadbalancerMasterSlaveBackendgroup(backendgroup.MasterSlaveServerGroupId)
  171. }
  172. func (backendgroup *SLoadbalancerMasterSlaveBackendGroup) AddBackendServer(opts *cloudprovider.SLoadbalancerBackend) (cloudprovider.ICloudLoadbalancerBackend, error) {
  173. return nil, cloudprovider.ErrNotSupported
  174. }
  175. func (backendgroup *SLoadbalancerMasterSlaveBackendGroup) RemoveBackendServer(opts *cloudprovider.SLoadbalancerBackend) error {
  176. return cloudprovider.ErrNotSupported
  177. }
  178. func (backendgroup *SLoadbalancerMasterSlaveBackendGroup) GetProjectId() string {
  179. return backendgroup.lb.GetProjectId()
  180. }