dup record process

This commit is contained in:
lvyangyang
2020-09-16 18:13:33 +08:00
parent e197ff815a
commit ff4bde696c
6 changed files with 94 additions and 23 deletions
-4
View File
@@ -470,10 +470,6 @@ var AwsFailovers = []TDnsPolicyValue{
TDnsPolicyValue("PRIMARY"),
TDnsPolicyValue("SECONDARY"),
}
var AwsMultiValueAnswers = []TDnsPolicyValue{
TDnsPolicyValue("true"),
TDnsPolicyValue("false"),
}
type TTlRange struct {
RangeType TDnsTTLRangeType
+41
View File
@@ -148,6 +148,47 @@ func (manager *SDnsRecordSetManager) ValidateCreateData(ctx context.Context, use
}
}
}
// 处理重复的记录
dupedRecordsets := make([]SDnsRecordSet, 0)
err = DnsRecordSetManager.Query().Equals("dns_zone_id", input.DnsZoneId).Equals("name", input.Name).Equals("dns_type", input.DnsType).All(&dupedRecordsets)
if err != nil && errors.Cause(err) != sql.ErrNoRows {
return input, httperrors.NewGeneralError(err)
}
// 检查dnsrecord 是否通过为policy重复
// simple 不能重复,不能和其他policy重复
// 不同类型policy不能重复
// 同类型policy的dnsrecord重复时,需要通过policyvalue区别
for i := range dupedRecordsets {
sq := DnsRecordSetTrafficPolicyManager.Query("dns_traffic_policy_id").Equals("dns_recordset_id", dupedRecordsets[i].Id)
q := DnsTrafficPolicyManager.Query().In("id", sq.SubQuery())
policies := []SDnsTrafficPolicy{}
err := db.FetchModelObjects(DnsTrafficPolicyManager, q, &policies)
if err != nil {
return input, httperrors.NewGeneralError(errors.Wrap(err, "db.FetchModelObjects"))
}
if len(policies) < 1 || len(input.TrafficPolicies) < 1 {
return input, httperrors.NewNotSupportedError("duplicated dnsrecord not support")
}
for j := range policies {
for k := range input.TrafficPolicies {
if strings.Contains(policies[j].Name, "MultiValueAnswer") &&
input.TrafficPolicies[k].PolicyType == "MultiValueAnswer" {
if dupedRecordsets[i].DnsValue == input.DnsValue {
return input, httperrors.NewNotSupportedError("MultiValueAnswer policy not support duplicated recordset value")
}
continue
}
if strings.Contains(policies[j].Name, "Simple") ||
strings.Contains(input.TrafficPolicies[k].PolicyType, "Simple") ||
policies[j].Name != fmt.Sprintf("%s-%s", input.TrafficPolicies[k].Provider, input.TrafficPolicies[k].PolicyType) {
return input, httperrors.NewNotSupportedError("duplicated dnsrecord not support")
}
if policies[j].PolicyValue == input.TrafficPolicies[k].PolicyValue {
return input, httperrors.NewNotSupportedError("duplicated dnsrecord not support")
}
}
}
}
input.Status = api.DNS_RECORDSET_STATUS_AVAILABLE
input.DnsZoneId = dnsZone.Id
return input, nil
+34 -6
View File
@@ -45,7 +45,6 @@ type SHostedZone struct {
Name string `json:"Name"`
Config HostedZoneConfig `json:"Config"`
ResourceRecordSetCount int64 `json:"ResourceRecordSetCount"`
VPCs []AssociatedVPC `json:"VPCs"`
}
func (self *SHostedZone) GetId() string {
@@ -230,6 +229,31 @@ func (client *SAwsClient) GetHostedZones() ([]SHostedZone, error) {
return result, nil
}
func (client *SAwsClient) GetHostedZoneVpcs(hostedzoneId string) ([]AssociatedVPC, error) {
s, err := client.getAwsRoute53Session()
if err != nil {
return nil, errors.Wrap(err, "region.getAwsRoute53Session()")
}
route53Client := route53.New(s)
params := route53.GetHostedZoneInput{}
params.Id = &hostedzoneId
ret, err := route53Client.GetHostedZone(&params)
if err != nil {
if err, ok := err.(awserr.Error); ok {
if err.Code() == route53.ErrCodeNoSuchHostedZone {
return nil, errors.Wrap(cloudprovider.ErrNotFound, err.Error())
}
}
return nil, errors.Wrap(err, "route53Client.GetHostedZone()")
}
vpcs := []AssociatedVPC{}
err = unmarshalAwsOutput(ret.VPCs, "", &vpcs)
if err != nil {
return nil, errors.Wrap(err, "unmarshalAwsOutput(HostedZones)")
}
return vpcs, nil
}
func (client *SAwsClient) GetICloudDnsZones() ([]cloudprovider.ICloudDnsZone, error) {
hostedZones, err := client.GetHostedZones()
if err != nil {
@@ -325,14 +349,18 @@ func (self *SHostedZone) GetOptions() *jsonutils.JSONDict {
}
func (self *SHostedZone) GetICloudVpcIds() ([]string, error) {
vpcs := []string{}
ret := []string{}
if self.Config.PrivateZone {
for i := 0; i < len(self.VPCs); i++ {
vpcs = append(vpcs, self.VPCs[i].VPCId)
vpcs, err := self.client.GetHostedZoneVpcs(self.ID)
if err != nil {
return nil, errors.Wrapf(err, "self.client.GetHostedZoneVpcs(%s)", self.ID)
}
return vpcs, nil
for i := range vpcs {
ret = append(ret, vpcs[i].VPCId)
}
return ret, nil
}
return vpcs, errors.Wrapf(cloudprovider.ErrNotSupported, "not a private hostedzone")
return ret, errors.Wrapf(cloudprovider.ErrNotSupported, "not a private hostedzone")
}
func (self *SHostedZone) AddVpc(vpc *cloudprovider.SPrivateZoneVpc) error {
+3 -9
View File
@@ -170,7 +170,7 @@ func Getroute53ResourceRecordSet(client *SAwsClient, opts *cloudprovider.DnsReco
resourceRecordSet.SetResourceRecords(records)
// traffic policy info--------------------------------------------
if opts.PolicyType == cloudprovider.DnsPolicyTypeSimple || opts.PolicyValue == cloudprovider.DnsPolicyValueEmpty {
if opts.PolicyType == cloudprovider.DnsPolicyTypeSimple {
return &resourceRecordSet, nil
}
// SetIdentifier 设置policy需要 ,也可以通过externalId设置
@@ -235,9 +235,6 @@ func Getroute53ResourceRecordSet(client *SAwsClient, opts *cloudprovider.DnsReco
// MultiValueAnswer ,bool
if opts.PolicyType == cloudprovider.DnsPolicyTypeMultiValueAnswer {
var multiValueAnswer bool = true
if string(opts.PolicyValue) == "false" {
multiValueAnswer = false
}
resourceRecordSet.SetMultiValueAnswer(multiValueAnswer)
}
// Weighted.,int64 value
@@ -433,13 +430,10 @@ func (self *SdnsRecordSet) GetPolicyValue() cloudprovider.TDnsPolicyValue {
return cloudprovider.TDnsPolicyValue(self.Region)
}
if self.MultiValueAnswer != nil {
if self.MultiValueAnswer != nil && *self.MultiValueAnswer {
return cloudprovider.TDnsPolicyValue("true")
}
return cloudprovider.TDnsPolicyValue("false")
return cloudprovider.DnsPolicyValueEmpty
}
if self.Weight != nil {
return cloudprovider.TDnsPolicyValue(fmt.Sprintf("%d", self.Weight))
return cloudprovider.TDnsPolicyValue(strconv.FormatInt(*self.Weight, 10))
}
return cloudprovider.DnsPolicyValueEmpty
}
+3 -4
View File
@@ -117,10 +117,9 @@ func (self *SAwsProviderFactory) GetSupportedDnsPolicyTypes() map[cloudprovider.
func (self *SAwsProviderFactory) GetSupportedDnsPolicyValues() map[cloudprovider.TDnsPolicyType][]cloudprovider.TDnsPolicyValue {
return map[cloudprovider.TDnsPolicyType][]cloudprovider.TDnsPolicyValue{
cloudprovider.DnsPolicyTypeByGeoLocation: cloudprovider.AwsGeoLocations,
cloudprovider.DnsPolicyTypeLatency: cloudprovider.AwsRegions,
cloudprovider.DnsPolicyTypeFailover: cloudprovider.AwsFailovers,
cloudprovider.DnsPolicyTypeMultiValueAnswer: cloudprovider.AwsMultiValueAnswers,
cloudprovider.DnsPolicyTypeByGeoLocation: cloudprovider.AwsGeoLocations,
cloudprovider.DnsPolicyTypeLatency: cloudprovider.AwsRegions,
cloudprovider.DnsPolicyTypeFailover: cloudprovider.AwsFailovers,
}
}
+13
View File
@@ -76,6 +76,19 @@ func init() {
printObject(hostedzone)
return nil
})
type HostedZoneVpcListOptions struct {
HOSTEDZONEID string
}
shellutils.R(&HostedZoneVpcListOptions{}, "hostedzonevpc-list", "List hostedzonevpc", func(cli *aws.SRegion, args *HostedZoneVpcListOptions) error {
vpcs, err := cli.GetClient().GetHostedZoneVpcs(args.HOSTEDZONEID)
if err != nil {
return err
}
printList(vpcs, len(vpcs), 0, 20, []string{})
return nil
})
type HostedZoneAddVpcOptions struct {
HOSTEDZONEID string
VPC string