From 920369021d722d8a6eb01b6338c6784a674acb2f Mon Sep 17 00:00:00 2001 From: Qu Xuan Date: Tue, 25 May 2021 17:38:44 +0800 Subject: [PATCH] fix(region): aws vpc network eip disk tags sync --- pkg/compute/models/elasticips.go | 2 ++ pkg/compute/models/networks.go | 2 ++ pkg/compute/models/snapshots.go | 4 ++++ pkg/compute/models/vpcs.go | 3 +++ pkg/multicloud/aws/disk.go | 4 ++++ pkg/multicloud/aws/eip.go | 4 ++++ pkg/multicloud/aws/instance.go | 21 +++++------------ pkg/multicloud/aws/network.go | 21 ++++++++++------- pkg/multicloud/aws/region.go | 10 ++++----- pkg/multicloud/aws/shell/network.go | 14 ++++++------ pkg/multicloud/aws/shell/vpc.go | 11 +++++---- pkg/multicloud/aws/snapshot.go | 6 +++++ pkg/multicloud/aws/utils.go | 11 +++++++++ pkg/multicloud/aws/vpc.go | 35 +++++++++++++++-------------- 14 files changed, 88 insertions(+), 60 deletions(-) diff --git a/pkg/compute/models/elasticips.go b/pkg/compute/models/elasticips.go index 7af765cf98..eef1a0cbd8 100644 --- a/pkg/compute/models/elasticips.go +++ b/pkg/compute/models/elasticips.go @@ -502,6 +502,7 @@ func (self *SElasticip) SyncWithCloudEip(ctx context.Context, userCred mcclient. if err != nil { return errors.Wrap(err, "fail to sync associated instance of EIP") } + syncVirtualResourceMetadata(ctx, userCred, self, ext) SyncCloudProject(userCred, self, syncOwnerId, ext, self.ManagerId) return nil @@ -555,6 +556,7 @@ func (manager *SElasticipManager) newFromCloudEip(ctx context.Context, userCred return nil, errors.Wrapf(err, "newFromCloudEip") } + syncVirtualResourceMetadata(ctx, userCred, &eip, extEip) SyncCloudProject(userCred, &eip, syncOwnerId, extEip, eip.ManagerId) err = eip.SyncInstanceWithCloudEip(ctx, userCred, extEip) diff --git a/pkg/compute/models/networks.go b/pkg/compute/models/networks.go index 709b9888d8..9bd5b42355 100644 --- a/pkg/compute/models/networks.go +++ b/pkg/compute/models/networks.go @@ -763,6 +763,7 @@ func (self *SNetwork) SyncWithCloudNetwork(ctx context.Context, userCred mcclien } db.OpsLog.LogSyncUpdate(self, diff, userCred) + syncVirtualResourceMetadata(ctx, userCred, self, extNet) SyncCloudProject(userCred, self, syncOwnerId, extNet, vpc.ManagerId) if provider != nil { @@ -817,6 +818,7 @@ func (manager *SNetworkManager) newFromCloudNetwork(ctx context.Context, userCre } vpc := wire.GetVpc() + syncVirtualResourceMetadata(ctx, userCred, &net, extNet) SyncCloudProject(userCred, &net, syncOwnerId, extNet, vpc.ManagerId) if provider != nil { diff --git a/pkg/compute/models/snapshots.go b/pkg/compute/models/snapshots.go index befae684ce..a09d54873b 100644 --- a/pkg/compute/models/snapshots.go +++ b/pkg/compute/models/snapshots.go @@ -890,6 +890,8 @@ func (self *SSnapshot) SyncWithCloudSnapshot(ctx context.Context, userCred mccli } db.OpsLog.LogSyncUpdate(self, diff, userCred) + syncVirtualResourceMetadata(ctx, userCred, self, ext) + // bugfix for now: disk, err := self.GetDisk() if err != nil && err != sql.ErrNoRows { @@ -943,6 +945,8 @@ func (manager *SSnapshotManager) newFromCloudSnapshot(ctx context.Context, userC return nil, errors.Wrapf(err, "Insert") } + syncVirtualResourceMetadata(ctx, userCred, &snapshot, extSnapshot) + // bugfix for now: if localDisk != nil { snapshot.SyncCloudProjectId(userCred, localDisk.GetOwnerId()) diff --git a/pkg/compute/models/vpcs.go b/pkg/compute/models/vpcs.go index 74d40341c5..f5e6eed3a5 100644 --- a/pkg/compute/models/vpcs.go +++ b/pkg/compute/models/vpcs.go @@ -616,6 +616,8 @@ func (self *SVpc) SyncWithCloudVpc(ctx context.Context, userCred mcclient.TokenC return err } + syncMetadata(ctx, userCred, self, extVPC) + if provider != nil { SyncCloudDomain(userCred, self, provider.GetOwnerId()) self.SyncShareState(ctx, userCred, provider.getAccountShareInfo()) @@ -656,6 +658,7 @@ func (manager *SVpcManager) newFromCloudVpc(ctx context.Context, userCred mcclie return nil, errors.Wrapf(err, "Insert") } + syncMetadata(ctx, userCred, &vpc, extVPC) SyncCloudDomain(userCred, &vpc, provider.GetOwnerId()) if provider != nil { diff --git a/pkg/multicloud/aws/disk.go b/pkg/multicloud/aws/disk.go index 347b0c804d..dbd888b0ab 100644 --- a/pkg/multicloud/aws/disk.go +++ b/pkg/multicloud/aws/disk.go @@ -87,6 +87,10 @@ func (self *SDisk) GetId() string { return self.DiskId } +func (self *SDisk) GetTags() (map[string]string, error) { + return self.Tags.GetTags() +} + func (self *SDisk) GetName() string { if len(self.DiskName) > 0 { return self.DiskName diff --git a/pkg/multicloud/aws/eip.go b/pkg/multicloud/aws/eip.go index 2576c7f656..670e5484a2 100644 --- a/pkg/multicloud/aws/eip.go +++ b/pkg/multicloud/aws/eip.go @@ -65,6 +65,10 @@ func (self *SEipAddress) GetName() string { return self.Name } +func (self *SEipAddress) GetTags() (map[string]string, error) { + return self.Tags.GetTags() +} + func (self *SEipAddress) GetGlobalId() string { return self.AllocationId } diff --git a/pkg/multicloud/aws/instance.go b/pkg/multicloud/aws/instance.go index 2b568b6591..ae1fbbf986 100644 --- a/pkg/multicloud/aws/instance.go +++ b/pkg/multicloud/aws/instance.go @@ -98,6 +98,8 @@ type SInstance struct { OSType string Description string + TagSpec TagSpec + // 这些貌似都没啥用 // AutoReleaseTime string // DeviceAvailable bool @@ -236,22 +238,7 @@ func (self *SInstance) GetSysTags() map[string]string { } func (self *SInstance) GetTags() (map[string]string, error) { - ec2Client, err := self.host.zone.region.getEc2Client() - if err != nil { - return nil, errors.Wrap(err, "getEc2Client") - } - tags, err := FetchTags(ec2Client, self.InstanceId) - if err != nil { - return nil, errors.Wrap(err, "FetchTags()") - } - data := map[string]string{} - err = tags.Unmarshal(&data) - if err != nil { - return nil, errors.Wrap(err, "tags.Unmarshal") - } - delete(data, "Name") - delete(data, "Description") - return data, nil + return self.TagSpec.GetTags() } func (self *SInstance) GetBillingType() string { @@ -726,6 +713,8 @@ func (self *SRegion) GetInstances(zoneId string, ids []string, offset int, limit ProductCodes: productCodes, OSName: osType, // todo: 这里在model层回写OSName信息 OSType: osType, + + TagSpec: tagspec, // ExpiredTime: // VlanId: // OSType: diff --git a/pkg/multicloud/aws/network.go b/pkg/multicloud/aws/network.go index 2673920744..d102bf138d 100644 --- a/pkg/multicloud/aws/network.go +++ b/pkg/multicloud/aws/network.go @@ -47,6 +47,7 @@ type SNetwork struct { NetworkName string VpcId string ZoneId string + TagSpec TagSpec } func (self *SNetwork) GetId() string { @@ -61,6 +62,10 @@ func (self *SNetwork) GetName() string { return self.NetworkName } +func (self *SNetwork) GetTags() (map[string]string, error) { + return self.TagSpec.GetTags() +} + func (self *SNetwork) GetGlobalId() string { return self.NetworkId } @@ -193,12 +198,11 @@ func (self *SRegion) getNetwork(networkId string) (*SNetwork, error) { if len(networkId) == 0 { return nil, fmt.Errorf("GetNetwork networkId should not be empty.") } - networks, total, err := self.GetNetwroks([]string{networkId}, "", 0, 0) + networks, err := self.GetNetwroks([]string{networkId}, "") if err != nil { - log.Errorf("GetNetwroks %s: %s", networkId, err) return nil, errors.Wrap(err, "GetNetwroks") } - if total != 1 { + if len(networks) != 1 { return nil, errors.Wrap(cloudprovider.ErrNotFound, "getNetwork") } return &networks[0], nil @@ -215,7 +219,7 @@ func (self *SRegion) deleteNetwork(networkId string) error { return errors.Wrap(err, "DeleteSubnet") } -func (self *SRegion) GetNetwroks(ids []string, vpcId string, limit int, offset int) ([]SNetwork, int, error) { +func (self *SRegion) GetNetwroks(ids []string, vpcId string) ([]SNetwork, error) { params := &ec2.DescribeSubnetsInput{} if len(ids) > 0 { _ids := make([]*string, len(ids)) @@ -236,20 +240,20 @@ func (self *SRegion) GetNetwroks(ids []string, vpcId string, limit int, offset i ec2Client, err := self.getEc2Client() if err != nil { - return nil, 0, errors.Wrap(err, "getEc2Client") + return nil, errors.Wrap(err, "getEc2Client") } ret, err := ec2Client.DescribeSubnets(params) err = parseNotFoundError(err) if err != nil { - return nil, 0, err + return nil, err } subnets := []SNetwork{} for i := range ret.Subnets { item := ret.Subnets[i] if err := FillZero(item); err != nil { - return nil, 0, err + return nil, err } tagspec := TagSpec{ResourceType: "subnet"} @@ -263,9 +267,10 @@ func (self *SRegion) GetNetwroks(ids []string, vpcId string, limit int, offset i subnet.IsDefault = *item.DefaultForAz subnet.NetworkId = *item.SubnetId subnet.NetworkName = tagspec.GetNameTag() + subnet.TagSpec = tagspec subnets = append(subnets, subnet) } - return subnets, len(subnets), nil + return subnets, nil } func (self *SNetwork) GetProjectId() string { diff --git a/pkg/multicloud/aws/region.go b/pkg/multicloud/aws/region.go index 688489265f..58e2531ec8 100644 --- a/pkg/multicloud/aws/region.go +++ b/pkg/multicloud/aws/region.go @@ -419,20 +419,18 @@ func (self *SRegion) fetchIVpcs() error { } } - tags := make(map[string]string, 0) - for _, tag := range vpc.Tags { - tags[*tag.Key] = *tag.Value - } + tagspec := TagSpec{ResourceType: "vpc"} + tagspec.LoadingEc2Tags(vpc.Tags) self.ivpcs = append(self.ivpcs, &SVpc{region: self, CidrBlock: *vpc.CidrBlock, CidrBlockAssociationSet: cidrBlockAssociationSet, - Tags: tags, + TagSpec: tagspec, IsDefault: *vpc.IsDefault, RegionId: self.RegionId, Status: *vpc.State, VpcId: *vpc.VpcId, - VpcName: tags["Name"], + VpcName: tagspec.GetNameTag(), InstanceTenancy: *vpc.InstanceTenancy, }) } diff --git a/pkg/multicloud/aws/shell/network.go b/pkg/multicloud/aws/shell/network.go index 7aacc5530f..62fde3faa3 100644 --- a/pkg/multicloud/aws/shell/network.go +++ b/pkg/multicloud/aws/shell/network.go @@ -21,15 +21,15 @@ import ( func init() { type VSwitchListOptions struct { - Limit int `help:"page size"` - Offset int `help:"page offset"` + Ids []string + VpcId string } - shellutils.R(&VSwitchListOptions{}, "vswitch-list", "List vswitches", func(cli *aws.SRegion, args *VSwitchListOptions) error { - vswitches, total, e := cli.GetNetwroks(nil, "", args.Offset, args.Limit) - if e != nil { - return e + shellutils.R(&VSwitchListOptions{}, "network-list", "List vswitches", func(cli *aws.SRegion, args *VSwitchListOptions) error { + networks, err := cli.GetNetwroks(args.Ids, args.VpcId) + if err != nil { + return err } - printList(vswitches, total, args.Offset, args.Limit, []string{}) + printList(networks, 0, 0, 0, []string{}) return nil }) } diff --git a/pkg/multicloud/aws/shell/vpc.go b/pkg/multicloud/aws/shell/vpc.go index 169c6c94c8..efb41180f9 100644 --- a/pkg/multicloud/aws/shell/vpc.go +++ b/pkg/multicloud/aws/shell/vpc.go @@ -22,15 +22,14 @@ import ( func init() { type VpcListOptions struct { - Limit int `help:"page size"` - Offset int `help:"page offset"` + VpcIds []string } shellutils.R(&VpcListOptions{}, "vpc-list", "List vpcs", func(cli *aws.SRegion, args *VpcListOptions) error { - vpcs, total, e := cli.GetVpcs(nil, args.Offset, args.Limit) - if e != nil { - return e + vpcs, err := cli.GetVpcs(args.VpcIds) + if err != nil { + return err } - printList(vpcs, total, args.Offset, args.Limit, []string{}) + printList(vpcs, 0, 0, 0, []string{}) return nil }) diff --git a/pkg/multicloud/aws/snapshot.go b/pkg/multicloud/aws/snapshot.go index e0ff39afea..191342592e 100644 --- a/pkg/multicloud/aws/snapshot.go +++ b/pkg/multicloud/aws/snapshot.go @@ -49,6 +49,7 @@ type SSnapshot struct { SourceDiskType string Status SnapshotStatusType Usage string + TagSpec TagSpec } func (self *SSnapshot) GetDiskType() string { @@ -60,6 +61,10 @@ func (self *SSnapshot) GetId() string { return self.SnapshotId } +func (self *SSnapshot) GetTags() (map[string]string, error) { + return self.TagSpec.GetTags() +} + func (self *SSnapshot) GetName() string { if len(self.SnapshotName) == 0 { return self.SnapshotId @@ -169,6 +174,7 @@ func (self *SRegion) GetSnapshots(instanceId string, diskId string, snapshotName snapshot.SourceDiskSize = int32(*item.VolumeSize) // snapshot.SourceDiskType snapshot.SnapshotName = tagspec.GetNameTag() + snapshot.TagSpec = tagspec snapshots = append(snapshots, snapshot) } diff --git a/pkg/multicloud/aws/utils.go b/pkg/multicloud/aws/utils.go index 5ecd27e260..857355256e 100644 --- a/pkg/multicloud/aws/utils.go +++ b/pkg/multicloud/aws/utils.go @@ -78,6 +78,17 @@ func (self *TagSpec) SetTag(k, v string) { self.Tags[k] = v } +func (self *TagSpec) GetTags() (map[string]string, error) { + ret := map[string]string{} + for k, v := range self.Tags { + if k == "Name" || k == "Description" { + continue + } + ret[k] = v + } + return ret, nil +} + func (self *TagSpec) SetNameTag(v string) { self.SetTag("Name", v) } diff --git a/pkg/multicloud/aws/vpc.go b/pkg/multicloud/aws/vpc.go index 3cb8ebd7a7..7a5db540b5 100644 --- a/pkg/multicloud/aws/vpc.go +++ b/pkg/multicloud/aws/vpc.go @@ -50,7 +50,7 @@ type SVpc struct { IsDefault bool Status string InstanceTenancy string - Tags map[string]string // 名称、描述等 + TagSpec TagSpec } func (self *SVpc) addWire(wire *SWire) { @@ -64,6 +64,10 @@ func (self *SVpc) GetId() string { return self.VpcId } +func (self *SVpc) GetTags() (map[string]string, error) { + return self.TagSpec.GetTags() +} + func (self *SVpc) GetName() string { if len(self.VpcName) > 0 { return self.VpcName @@ -222,9 +226,9 @@ func (self *SVpc) getWireByZoneId(zoneId string) *SWire { } func (self *SVpc) fetchNetworks() error { - networks, _, err := self.region.GetNetwroks(nil, self.VpcId, 0, 0) + networks, err := self.region.GetNetwroks(nil, self.VpcId) if err != nil { - return err + return errors.Wrapf(err, "GetNetwroks(%s)", self.VpcId) } for i := 0; i < len(networks); i += 1 { @@ -567,12 +571,11 @@ func (self *SRegion) getVpc(vpcId string) (*SVpc, error) { return nil, fmt.Errorf("GetVpc vpc id should not be empty.") } - vpcs, total, err := self.GetVpcs([]string{vpcId}, 0, 1) + vpcs, err := self.GetVpcs([]string{vpcId}) if err != nil { - log.Errorf("GetVpcs %s: %s", vpcId, err) return nil, errors.Wrap(err, "GetVpcs") } - if total != 1 { + if len(vpcs) != 1 { return nil, errors.Wrap(cloudprovider.ErrNotFound, "getVpc") } vpcs[0].region = self @@ -639,10 +642,10 @@ func (self *SRegion) DeleteVpc(vpcId string) error { return errors.Wrap(err, "DeleteVpc") } -func (self *SRegion) GetVpcs(vpcId []string, offset int, limit int) ([]SVpc, int, error) { +func (self *SRegion) GetVpcs(vpcId []string) ([]SVpc, error) { ec2Client, err := self.getEc2Client() if err != nil { - return nil, 0, errors.Wrap(err, "getEc2Client") + return nil, errors.Wrap(err, "getEc2Client") } params := &ec2.DescribeVpcsInput{} @@ -653,13 +656,13 @@ func (self *SRegion) GetVpcs(vpcId []string, offset int, limit int) ([]SVpc, int ret, err := ec2Client.DescribeVpcs(params) err = parseNotFoundError(err) if err != nil { - return nil, 0, err + return nil, err } vpcs := []SVpc{} for _, item := range ret.Vpcs { if err := FillZero(item); err != nil { - return nil, 0, err + return nil, err } cidrBlockAssociationSet := []string{} for i := range item.CidrBlockAssociationSet { @@ -669,26 +672,24 @@ func (self *SRegion) GetVpcs(vpcId []string, offset int, limit int) ([]SVpc, int } } - tags := make(map[string]string, 0) - for _, tag := range item.Tags { - tags[*tag.Key] = *tag.Value - } + tagspec := TagSpec{ResourceType: "vpc"} + tagspec.LoadingEc2Tags(item.Tags) vpcs = append(vpcs, SVpc{ region: self, RegionId: self.RegionId, VpcId: *item.VpcId, - VpcName: tags["Name"], + VpcName: tagspec.GetNameTag(), CidrBlock: *item.CidrBlock, CidrBlockAssociationSet: cidrBlockAssociationSet, IsDefault: *item.IsDefault, Status: *item.State, InstanceTenancy: *item.InstanceTenancy, - Tags: tags, + TagSpec: tagspec, }) } - return vpcs, len(vpcs), nil + return vpcs, nil } func (self *SRegion) GetInternetGateways(vpcId string) ([]SInternetGateway, error) {