Merge pull request #3340 from tb365/bugfix/tb-bugfix-1022

huawei & qcloud & aws bugfix
This commit is contained in:
yunion-ci-robot
2019-10-25 16:19:07 +08:00
committed by GitHub
7 changed files with 216 additions and 95 deletions
+40 -20
View File
@@ -93,22 +93,21 @@ func (lbcert *SLoadbalancerCertificate) AllowPerformStatus(ctx context.Context,
return false
}
func (self *SLoadbalancerCertificate) AllowUpdateItem(ctx context.Context, userCred mcclient.TokenCredential) bool {
return false
}
func (lbcert *SLoadbalancerCertificate) ValidateUpdateData(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data *jsonutils.JSONDict) (*jsonutils.JSONDict, error) {
data.Set("certificate", jsonutils.NewString(lbcert.Certificate))
data.Set("private_key", jsonutils.NewString(lbcert.PrivateKey))
data, err := LoadbalancerCertificateManager.validateCertKey(ctx, data)
if err != nil {
return nil, err
if data.Contains("certificate") || data.Contains("private_key") {
return nil, httperrors.NewForbiddenError("not allowed update content of certificate")
}
if _, err := lbcert.SVirtualResourceBase.ValidateUpdateData(ctx, userCred, query, data); err != nil {
updateData := jsonutils.NewDict()
if name, err := data.GetString("name"); err == nil {
updateData.Set("name", jsonutils.NewString(name))
}
if _, err := lbcert.SVirtualResourceBase.ValidateUpdateData(ctx, userCred, query, updateData); err != nil {
return nil, err
}
return data, nil
return updateData, nil
}
func (lbcert *SLoadbalancerCertificate) PostCreate(ctx context.Context, userCred mcclient.TokenCredential, ownerProjId mcclient.IIdentityProvider, query jsonutils.JSONObject, data jsonutils.JSONObject) {
@@ -219,17 +218,38 @@ func (man *SLoadbalancerCertificateManager) ListItemFilter(ctx context.Context,
if err != nil {
return nil, err
}
data := query.(*jsonutils.JSONDict)
q, err = validators.ApplyModelFilters(q, data, []*validators.ModelFilterOptions{
{Key: "cloudregion", ModelKeyword: "cloudregion", OwnerId: userCred},
{Key: "manager", ModelKeyword: "cloudprovider", OwnerId: userCred},
})
if err != nil {
return nil, err
}
data := query.(*jsonutils.JSONDict)
if jsonutils.QueryBoolean(query, "usable", false) {
q = q.IsNotEmpty("certificate").IsNotEmpty("private_key")
region, _ := data.GetString("cloudregion")
manager, _ := data.GetString("manager")
// 证书可用包含两类:1.本地证书内容不为空 2.公有云中已经存在,但是证书内容不完整的证书
if len(region) > 0 || len(manager) > 0 {
q2 := CachedLoadbalancerCertificateManager.Query("certificate_id").IsFalse("pending_deleted")
if len(region) > 0 {
q2 = q2.Equals("cloudregion_id", region)
}
if len(manager) > 0 {
q2 = q2.Equals("manager_id", manager)
}
count, err := q2.CountWithError()
if err != sql.ErrNoRows {
return nil, err
}
if count > 0 {
conditionA := sqlchemy.AND(sqlchemy.IsNotEmpty(q.Field("certificate")), sqlchemy.IsNotEmpty(q.Field("private_key")))
conditionB := sqlchemy.In(q.Field("id"), q2.SubQuery())
q = q.Filter(sqlchemy.OR(conditionA, conditionB))
} else {
q = q.IsNotEmpty("certificate").IsNotEmpty("private_key")
}
} else {
q = q.IsNotEmpty("certificate").IsNotEmpty("private_key")
}
}
return q, nil
+66 -23
View File
@@ -16,12 +16,17 @@ package regiondrivers
import (
"context"
"database/sql"
"fmt"
"regexp"
"yunion.io/x/jsonutils"
"yunion.io/x/pkg/errors"
"yunion.io/x/pkg/utils"
api "yunion.io/x/onecloud/pkg/apis/compute"
"yunion.io/x/onecloud/pkg/cloudcommon/db"
"yunion.io/x/onecloud/pkg/cloudcommon/db/lockman"
"yunion.io/x/onecloud/pkg/cloudcommon/db/taskman"
"yunion.io/x/onecloud/pkg/cloudcommon/validators"
"yunion.io/x/onecloud/pkg/cloudprovider"
@@ -31,8 +36,6 @@ import (
"yunion.io/x/onecloud/pkg/util/billing"
"yunion.io/x/onecloud/pkg/util/rand"
"yunion.io/x/onecloud/pkg/util/seclib2"
"yunion.io/x/pkg/errors"
"yunion.io/x/pkg/utils"
)
type SHuaWeiRegionDriver struct {
@@ -928,6 +931,48 @@ func (self *SHuaWeiRegionDriver) RequestCreateLoadbalancerListener(ctx context.C
return nil
}
func (self *SHuaWeiRegionDriver) syncLoadbalancerAcl(ctx context.Context, userCred mcclient.TokenCredential, lbacl *models.SCachedLoadbalancerAcl) (jsonutils.JSONObject, error) {
iRegion, err := lbacl.GetIRegion()
if err != nil {
return nil, err
}
acl := &cloudprovider.SLoadbalancerAccessControlList{
Name: lbacl.Name,
Entrys: []cloudprovider.SLoadbalancerAccessControlListEntry{},
}
lblis, err := lbacl.GetListener()
if err == nil {
if api.LB_BOOL_ON == lblis.AclStatus {
acl.AccessControlEnable = true
}
} else {
return nil, fmt.Errorf("huaweiRegionDriver.syncLoadbalancerAcl %s", err)
}
_localAcl, err := db.FetchById(models.LoadbalancerAclManager, lbacl.AclId)
if err != nil {
return nil, errors.Wrap(err, "huaweiRegionDriver.FetchById.LoaclAcl")
}
localAcl := _localAcl.(*models.SLoadbalancerAcl)
if localAcl.AclEntries != nil {
for _, entry := range *localAcl.AclEntries {
acl.Entrys = append(acl.Entrys, cloudprovider.SLoadbalancerAccessControlListEntry{CIDR: entry.Cidr, Comment: entry.Comment})
}
}
lockman.LockRawObject(ctx, "acl", lbacl.Id)
defer lockman.ReleaseRawObject(ctx, "acl", lbacl.Id)
iLoadbalancerAcl, err := iRegion.GetILoadBalancerAclById(lbacl.ExternalId)
if err != nil {
return nil, err
}
return nil, iLoadbalancerAcl.Sync(acl)
}
func (self *SHuaWeiRegionDriver) RequestSyncLoadbalancerListener(ctx context.Context, userCred mcclient.TokenCredential, lblis *models.SLoadbalancerListener, task taskman.ITask) error {
taskman.LocalTaskRun(task, func() (jsonutils.JSONObject, error) {
{
@@ -1142,7 +1187,7 @@ func (self *SHuaWeiRegionDriver) RequestDeleteLoadbalancerBackendGroup(ctx conte
}
iRegion, err := lbbg.GetIRegion()
if err != nil {
return nil, err
return nil, errors.Wrap(err, "huaweiRegionDriver.RequestDeleteLoadbalancerBackendGroup.")
}
loadbalancer := lbbg.GetLoadbalancer()
if loadbalancer == nil {
@@ -1154,12 +1199,12 @@ func (self *SHuaWeiRegionDriver) RequestDeleteLoadbalancerBackendGroup(ctx conte
return nil, nil
}
return nil, err
return nil, errors.Wrap(err, "huaweiRegionDriver.RequestDeleteLoadbalancerBackendGroup.GetILoadBalancerById")
}
cachedLbbgs, err := models.HuaweiCachedLbbgManager.GetCachedBackendGroups(lbbg.GetId())
if err != nil {
return nil, err
return nil, errors.Wrap(err, "huaweiRegionDriver.RequestDeleteLoadbalancerBackendGroup.GetCachedBackendGroups")
}
for _, cachedLbbg := range cachedLbbgs {
@@ -1172,43 +1217,41 @@ func (self *SHuaWeiRegionDriver) RequestDeleteLoadbalancerBackendGroup(ctx conte
if err == cloudprovider.ErrNotFound {
continue
}
return nil, err
return nil, errors.Wrap(err, "huaweiRegionDriver.RequestDeleteLoadbalancerBackendGroup.GetILoadBalancerBackendGroupById")
}
cachedLbbs, err := cachedLbbg.GetCachedBackends()
ilbbs, err := iLoadbalancerBackendGroup.GetILoadbalancerBackends()
if err != nil {
return nil, err
return nil, errors.Wrap(err, "huaweiRegionDriver.RequestDeleteLoadbalancerBackendGroup.GetILoadbalancerBackends")
}
for _, cachedLbb := range cachedLbbs {
if len(cachedLbb.ExternalId) == 0 {
for _, ilbb := range ilbbs {
iLoadbalancerBackendGroup.RemoveBackendServer(ilbb.GetId(), ilbb.GetWeight(), ilbb.GetPort())
_cachedLbb, err := db.FetchByExternalId(models.HuaweiCachedLbManager, ilbb.GetGlobalId())
if err != nil {
if err != sql.ErrNoRows {
return nil, errors.Wrap(err, "huaweiRegionDriver.RequestDeleteLoadbalancerBackendGroup.FetchByExternalId")
}
continue
}
_lbb, err := db.FetchById(models.LoadbalancerBackendManager, cachedLbb.BackendId)
cachedLbb := _cachedLbb.(*models.SHuaweiCachedLb)
err = db.DeleteModel(ctx, userCred, cachedLbb)
if err != nil {
return nil, err
}
lbb := _lbb.(*models.SLoadbalancerBackend)
iLoadbalancerBackendGroup.RemoveBackendServer(cachedLbb.ExternalId, lbb.Weight, lbb.Port)
cachedLbb.SetModelManager(models.HuaweiCachedLbManager, &cachedLbb)
err = db.DeleteModel(ctx, userCred, &cachedLbb)
if err != nil {
return nil, err
return nil, errors.Wrap(err, "huaweiRegionDriver.RequestDeleteLoadbalancerBackendGroup.DeleteModel")
}
}
err = iLoadbalancerBackendGroup.Delete()
if err != nil {
return nil, err
return nil, errors.Wrap(err, "huaweiRegionDriver.RequestDeleteLoadbalancerBackendGroup.Delete")
}
cachedLbbg.SetModelManager(models.HuaweiCachedLbbgManager, &cachedLbbg)
err = db.DeleteModel(ctx, userCred, &cachedLbbg)
if err != nil {
return nil, err
return nil, errors.Wrap(err, "huaweiRegionDriver.RequestDeleteLoadbalancerBackendGroup.DeleteModel")
}
}
+2 -18
View File
@@ -292,15 +292,6 @@ func (self *SManagedVirtualizationRegionDriver) createLoadbalancerAcl(ctx contex
Entrys: []cloudprovider.SLoadbalancerAccessControlListEntry{},
}
lblis, err := lbacl.GetListener()
if err == nil {
if api.LB_BOOL_ON == lblis.AclStatus {
acl.AccessControlEnable = true
}
} else {
return nil, fmt.Errorf("regionDriver.createLoadbalancerAcl %s", err)
}
_originAcl, err := db.FetchById(models.LoadbalancerAclManager, lbacl.AclId)
if err != nil {
return nil, errors.Wrap(err, "regionDriver.FetchAcl")
@@ -316,6 +307,8 @@ func (self *SManagedVirtualizationRegionDriver) createLoadbalancerAcl(ctx contex
if err != nil {
return nil, err
}
lbacl.SetModelManager(models.CachedLoadbalancerAclManager, lbacl)
if err := db.SetExternalId(lbacl, userCred, iLoadbalancerAcl.GetGlobalId()); err != nil {
return nil, err
}
@@ -340,15 +333,6 @@ func (self *SManagedVirtualizationRegionDriver) syncLoadbalancerAcl(ctx context.
Entrys: []cloudprovider.SLoadbalancerAccessControlListEntry{},
}
lblis, err := lbacl.GetListener()
if err == nil {
if api.LB_BOOL_ON == lblis.AclStatus {
acl.AccessControlEnable = true
}
} else {
return nil, fmt.Errorf("regionDriver.syncLoadbalancerAcl %s", err)
}
_localAcl, err := db.FetchById(models.LoadbalancerAclManager, lbacl.AclId)
if err != nil {
return nil, errors.Wrap(err, "regionDriver.FetchById.LoaclAcl")
+86 -16
View File
@@ -16,6 +16,7 @@ package regiondrivers
import (
"context"
"database/sql"
"fmt"
"regexp"
@@ -145,6 +146,8 @@ func (self *SQcloudRegionDriver) ValidateCreateLoadbalancerListenerData(ctx cont
return nil, httperrors.NewConflictError(err.Error())
}
}
data.Set("backend_group_id", jsonutils.NewString(lbbg.GetId()))
}
}
@@ -303,33 +306,100 @@ func (self *SQcloudRegionDriver) RequestDeleteLoadbalancerBackend(ctx context.Co
}
iRegion, err := lb.GetIRegion()
if err != nil {
return nil, err
return nil, errors.Wrap(err, "qcloudRegion.RequestDeleteLoadbalancerBackend.GetIRegion")
}
// ===========兼容腾讯云,未关联具体转发规则时,直接删除本地数据即可===============
if iRegion.GetProvider() == api.CLOUD_PROVIDER_QCLOUD {
count, err := lbbg.RefCount()
if err != nil {
return nil, err
}
if count == 0 {
return nil, nil
}
count, err := lbbg.RefCount()
if err != nil {
return nil, errors.Wrap(err, "qcloudRegion.RequestDeleteLoadbalancerBackend.RefCount")
}
if count == 0 {
return nil, nil
}
iLoadbalancer, err := iRegion.GetILoadBalancerById(lb.ExternalId)
if err != nil {
return nil, err
}
iLoadbalancerBackendGroup, err := iLoadbalancer.GetILoadBalancerBackendGroupById(lbbg.ExternalId)
if err != nil {
return nil, err
return nil, errors.Wrap(err, "qcloudRegion.RequestDeleteLoadbalancerBackend.GetLoadbalancerListeners")
}
guest := lbb.GetGuest()
if guest == nil {
return nil, fmt.Errorf("failed to find guest for lbb %s", lbb.Name)
}
return nil, iLoadbalancerBackendGroup.RemoveBackendServer(guest.ExternalId, lbb.Weight, lbb.Port)
// delete
if forword, _ := iLoadbalancer.GetMetadata().Int("Forward"); forword == 0 {
iLoadbalancerBackendGroup, err := iLoadbalancer.GetILoadBalancerBackendGroupById(lbbg.ExternalId)
if err != nil {
return nil, errors.Wrap(err, "qcloudRegion.RequestDeleteLoadbalancerBackend.GetLoadbalancerListenerRules")
}
return nil, iLoadbalancerBackendGroup.RemoveBackendServer(guest.ExternalId, lbb.Weight, lbb.Port)
} else {
lblis, err := lbbg.GetLoadbalancerListeners()
if err != nil {
if err != sql.ErrNoRows {
return nil, errors.Wrap(err, "qcloudRegion.RequestDeleteLoadbalancerBackend.GetLoadbalancerListeners")
}
} else {
for i := range lblis {
_lblis := lblis[i]
if utils.IsInStringArray(_lblis.ListenerType, []string{api.LB_LISTENER_TYPE_UDP, api.LB_LISTENER_TYPE_TCP}) {
external_id := fmt.Sprintf("%s/%s", lb.ExternalId, _lblis.ExternalId)
iLoadbalancerBackendGroup, err := iLoadbalancer.GetILoadBalancerBackendGroupById(external_id)
if err != nil {
return nil, errors.Wrap(err, "qcloudRegion.RequestDeleteLoadbalancerBackend.GetILoadBalancerBackendGroupById")
}
backends, err := iLoadbalancerBackendGroup.GetILoadbalancerBackends()
if err != nil {
return nil, errors.Wrap(err, "qcloudRegion.RequestDeleteLoadbalancerBackend.listener.GetILoadbalancerBackends")
}
for i := range backends {
if backends[i].GetBackendId() == guest.ExternalId && backends[i].GetPort() == lbb.Port && backends[i].GetWeight() == lbb.Weight {
err = iLoadbalancerBackendGroup.RemoveBackendServer(guest.ExternalId, lbb.Weight, lbb.Port)
if err != nil {
return nil, errors.Wrap(err, "qcloudRegion.RequestDeleteLoadbalancerBackend.listener.RemoveBackendServer")
}
}
}
}
}
}
lbrs, err := lbbg.GetLoadbalancerListenerRules()
if err != nil {
if err != sql.ErrNoRows {
return nil, errors.Wrap(err, "qcloudRegion.RequestDeleteLoadbalancerBackend.GetLoadbalancerListenerRules")
}
} else {
for i := range lbrs {
lbr := lbrs[i]
external_id := fmt.Sprintf("%s/%s", lb.ExternalId, lbr.ExternalId)
iLoadbalancerBackendGroup, err := iLoadbalancer.GetILoadBalancerBackendGroupById(external_id)
if err != nil {
return nil, errors.Wrap(err, "qcloudRegion.RequestDeleteLoadbalancerBackend.GetILoadBalancerBackendGroupById")
}
backends, err := iLoadbalancerBackendGroup.GetILoadbalancerBackends()
if err != nil {
return nil, errors.Wrap(err, "qcloudRegion.RequestDeleteLoadbalancerBackend.listener.GetILoadbalancerBackends")
}
for i := range backends {
if backends[i].GetBackendId() == guest.ExternalId && backends[i].GetPort() == lbb.Port && backends[i].GetWeight() == lbb.Weight {
err = iLoadbalancerBackendGroup.RemoveBackendServer(guest.ExternalId, lbb.Weight, lbb.Port)
if err != nil {
return nil, errors.Wrap(err, "qcloudRegion.RequestDeleteLoadbalancerBackend.rule.RemoveBackendServer")
}
}
}
}
}
}
return nil, nil
})
return nil
}
@@ -511,7 +581,7 @@ func (self *SQcloudRegionDriver) RequestCreateLoadbalancerListenerRule(ctx conte
}
// ====腾讯云添加后端服务器=====
if len(rule.BackendGroupID) > 0 {
ilbbg, err := iLoadbalancer.GetILoadBalancerBackendGroupById(rule.BackendGroupID)
ilbbg, err := iLoadbalancer.GetILoadBalancerBackendGroupById(iListenerRule.GetBackendGroupId())
if err != nil {
return nil, fmt.Errorf("failed to find backend group for listener rule %s: %s", lbr.Name, err)
}
+1 -1
View File
@@ -142,7 +142,7 @@ func (self *SEipAddress) Associate(instanceId string) error {
if err != nil {
return err
}
err = cloudprovider.WaitStatus(self, api.EIP_STATUS_READY, 10*time.Second, 180*time.Second)
err = cloudprovider.WaitStatusWithDelay(self, api.EIP_STATUS_READY, 5*time.Second, 10*time.Second, 180*time.Second)
return err
}
+3 -7
View File
@@ -143,13 +143,9 @@ func onecloudHealthCodeToQcloud(codes string) int {
// https://cloud.tencent.com/document/product/214/30693
// todo: 1.限制比较多必须加参数校验 2.Onecloud 不支持双向证书可能存在兼容性问题
// 应用型负载均衡 https监听默认开启SNI。传统型不支持设置SNI
// 应用型负载均衡 传统型不支持设置SNI
func (self *SLoadbalancer) CreateILoadBalancerListener(listener *cloudprovider.SLoadbalancerListener) (cloudprovider.ICloudLoadbalancerListener, error) {
sniSwitch := 0
if listener.ListenerType == api.LB_LISTENER_TYPE_HTTPS {
sniSwitch = 1
}
hc := getHealthCheck(listener)
cert := getCertificate(listener)
@@ -481,7 +477,7 @@ func (self *SRegion) CreateLoadbalancerListener(lbid, name, protocol string, por
params["ListenerNames.0"] = name
}
if utils.IsInStringArray(protocol, []string{"TCP", "UDP", "TCP_SSL"}) {
if utils.IsInStringArray(protocol, []string{PROTOCOL_TCP, PROTOCOL_UDP, PROTOCOL_TCP_SSL}) {
params = healthCheckParams(LB_TYPE_APPLICATION, params, healthCheck, "HealthCheck.")
if scheduler != nil && len(*scheduler) > 0 {
@@ -492,7 +488,7 @@ func (self *SRegion) CreateLoadbalancerListener(lbid, name, protocol string, por
params["SessionExpireTime"] = strconv.Itoa(*sessionExpireTime)
}
} else {
if sniSwitch != nil {
if protocol == PROTOCOL_HTTPS && sniSwitch != nil {
params["SniSwitch"] = strconv.Itoa(*sniSwitch)
}
}
+18 -10
View File
@@ -34,6 +34,14 @@ var HTTP_CODES = []string{
api.LB_HEALTH_CHECK_HTTP_CODE_5xx,
}
const (
PROTOCOL_TCP = "TCP"
PROTOCOL_UDP = "UDP"
PROTOCOL_TCP_SSL = "TCP_SSL"
PROTOCOL_HTTP = "HTTP"
PROTOCOL_HTTPS = "HTTPS"
)
type certificate struct {
SSLMode string `json:"SSLMode"`
CERTCAID string `json:"CertCaId"`
@@ -266,15 +274,15 @@ func (self *SLBListener) GetMetadata() *jsonutils.JSONDict {
func (self *SLBListener) GetListenerType() string {
switch self.Protocol {
case "TCP":
case PROTOCOL_TCP:
return api.LB_LISTENER_TYPE_TCP
case "UDP":
case PROTOCOL_UDP:
return api.LB_LISTENER_TYPE_UDP
case "HTTP":
case PROTOCOL_HTTP:
return api.LB_LISTENER_TYPE_HTTP
case "HTTPS":
case PROTOCOL_HTTPS:
return api.LB_LISTENER_TYPE_HTTPS
case "TCP_SSL":
case PROTOCOL_TCP_SSL:
return api.LB_LISTENER_TYPE_TCP
default:
return ""
@@ -714,15 +722,15 @@ func getCertificate(listener *cloudprovider.SLoadbalancerListener) *certificate
func getProtocol(listener *cloudprovider.SLoadbalancerListener) string {
switch listener.ListenerType {
case api.LB_LISTENER_TYPE_HTTPS:
return "HTTPS"
return PROTOCOL_HTTPS
case api.LB_LISTENER_TYPE_HTTP:
return "HTTP"
return PROTOCOL_HTTP
case api.LB_LISTENER_TYPE_TCP:
return "TCP"
return PROTOCOL_TCP
case api.LB_LISTENER_TYPE_UDP:
return "UDP"
return PROTOCOL_UDP
case "tcp_ssl":
return "TCP_SSL"
return PROTOCOL_TCP_SSL
default:
return ""
}