mirror of
https://github.com/yunionio/cloudpods.git
synced 2026-09-01 15:07:17 +08:00
dup record process
This commit is contained in:
@@ -470,10 +470,6 @@ var AwsFailovers = []TDnsPolicyValue{
|
||||
TDnsPolicyValue("PRIMARY"),
|
||||
TDnsPolicyValue("SECONDARY"),
|
||||
}
|
||||
var AwsMultiValueAnswers = []TDnsPolicyValue{
|
||||
TDnsPolicyValue("true"),
|
||||
TDnsPolicyValue("false"),
|
||||
}
|
||||
|
||||
type TTlRange struct {
|
||||
RangeType TDnsTTLRangeType
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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(¶ms)
|
||||
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 {
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user