From 2c9dada44c56ecc7e39ceb2951b607175bce9936 Mon Sep 17 00:00:00 2001 From: wanyaoqi Date: Mon, 5 Aug 2019 20:01:27 +0800 Subject: [PATCH] misc bugfix --- pkg/cloudcommon/db/opslog.go | 1 + pkg/compute/models/buckets.go | 20 +++++++++++++++++++ pkg/compute/models/guest_actions.go | 1 + pkg/compute/models/guests.go | 2 +- pkg/compute/models/networks.go | 2 +- pkg/compute/models/routetables.go | 2 +- pkg/compute/models/snapshots.go | 7 +++++-- pkg/compute/models/vpcs.go | 2 +- pkg/compute/tasks/guest_backup_tasks.go | 2 +- pkg/compute/tasks/guest_disk_snapshot_task.go | 2 +- pkg/hostman/guestfs/core.go | 3 ++- pkg/hostman/guestfs/fsdriver/linux.go | 4 ++-- pkg/hostman/system_service/systemd.go | 20 +++++++++---------- pkg/image/models/images.go | 2 +- pkg/util/fstabutils/fstabutils.go | 4 ++-- 15 files changed, 49 insertions(+), 25 deletions(-) diff --git a/pkg/cloudcommon/db/opslog.go b/pkg/cloudcommon/db/opslog.go index c4e8231fc1..dd8d02f51a 100644 --- a/pkg/cloudcommon/db/opslog.go +++ b/pkg/cloudcommon/db/opslog.go @@ -96,6 +96,7 @@ const ( ACT_SNAPSHOT_DELETING = "snapshot_deling" ACT_SNAPSHOT_DELETE = "snapshot_del" ACT_SNAPSHOT_DELETE_FAIL = "snapshot_del_fail" + ACT_SNAPSHOT_FAKE_DELETE = "snapshot_fake_del" ACT_SNAPSHOT_UNLINK = "snapshot_unlink" ACT_APPLY_SNAPSHOT_POLICY = "apply_snapshot_policy" ACT_APPLY_SNAPSHOT_POLICY_FAILED = "apply_snapshot_policy_failed" diff --git a/pkg/compute/models/buckets.go b/pkg/compute/models/buckets.go index 4e8534d4ef..c8c3f542db 100644 --- a/pkg/compute/models/buckets.go +++ b/pkg/compute/models/buckets.go @@ -442,6 +442,26 @@ func (manager *SBucketManager) ListItemFilter(ctx context.Context, q *sqlchemy.S return q, nil } +func (manager *SBucketManager) QueryDistinctExtraField(q *sqlchemy.SQuery, field string) (*sqlchemy.SQuery, error) { + switch field { + case "tenant": + tenantCacheQuery := db.TenantCacheManager.Query("name", "id").Distinct().SubQuery() + q.AppendField(tenantCacheQuery.Field("name", "tenant")) + q = q.Join(tenantCacheQuery, sqlchemy.Equals(q.Field("tenant_id"), tenantCacheQuery.Field("id"))) + q.GroupBy(tenantCacheQuery.Field("name")) + case "account": + cloudproviders := CloudproviderManager.Query().SubQuery() + cloudaccounts := CloudaccountManager.Query("name", "id").Distinct().SubQuery() + q = q.Join(cloudproviders, sqlchemy.Equals(q.Field("manager_id"), cloudproviders.Field("id"))) + q = q.Join(cloudaccounts, sqlchemy.Equals(cloudproviders.Field("cloudaccount_id"), cloudaccounts.Field("id"))) + q.GroupBy(cloudaccounts.Field("name")) + q.AppendField(cloudaccounts.Field("name", "account")) + default: + return nil, httperrors.NewBadRequestError("unsupport field %s", field) + } + return q, nil +} + func (bucket *SBucket) AllowGetDetailsObjects( ctx context.Context, userCred mcclient.TokenCredential, diff --git a/pkg/compute/models/guest_actions.go b/pkg/compute/models/guest_actions.go index bb1ab5c089..70b31aa128 100644 --- a/pkg/compute/models/guest_actions.go +++ b/pkg/compute/models/guest_actions.go @@ -1252,6 +1252,7 @@ func (self *SGuest) PerformRebuildRoot(ctx context.Context, userCred mcclient.To return nil, httperrors.NewGeneralError(err) } } + resetPasswd = true } else { err = self.setKeypairId(userCred, "") if err != nil { diff --git a/pkg/compute/models/guests.go b/pkg/compute/models/guests.go index 24461270be..16c4676eb9 100644 --- a/pkg/compute/models/guests.go +++ b/pkg/compute/models/guests.go @@ -480,7 +480,7 @@ func (manager *SGuestManager) QueryDistinctExtraField(q *sqlchemy.SQuery, field case "account": hosts := HostManager.Query().SubQuery() cloudproviders := CloudproviderManager.Query().SubQuery() - cloudaccounts := CloudaccountManager.Query().SubQuery() + cloudaccounts := CloudaccountManager.Query("name", "id").Distinct().SubQuery() q = q.Join(hosts, sqlchemy.Equals(q.Field("host_id"), hosts.Field("id"))) q = q.Join(cloudproviders, sqlchemy.Equals(hosts.Field("manager_id"), cloudproviders.Field("id"))) q = q.Join(cloudaccounts, sqlchemy.Equals(cloudproviders.Field("cloudaccount_id"), cloudaccounts.Field("id"))) diff --git a/pkg/compute/models/networks.go b/pkg/compute/models/networks.go index 279a6abff0..fc6748eb0e 100644 --- a/pkg/compute/models/networks.go +++ b/pkg/compute/models/networks.go @@ -1672,7 +1672,7 @@ func (manager *SNetworkManager) QueryDistinctExtraField(q *sqlchemy.SQuery, fiel vpcs := VpcManager.Query().SubQuery() wires := WireManager.Query().SubQuery() cloudproviders := CloudproviderManager.Query().SubQuery() - cloudaccounts := CloudaccountManager.Query().Distinct().SubQuery() + cloudaccounts := CloudaccountManager.Query("name", "id").Distinct().SubQuery() q = q.Join(wires, sqlchemy.Equals(q.Field("wire_id"), wires.Field("id"))) q = q.Join(vpcs, sqlchemy.Equals(wires.Field("vpc_id"), vpcs.Field("id"))) q = q.Join(cloudproviders, sqlchemy.Equals(vpcs.Field("manager_id"), cloudproviders.Field("id"))) diff --git a/pkg/compute/models/routetables.go b/pkg/compute/models/routetables.go index 0447d3d818..9ff1bbc89b 100644 --- a/pkg/compute/models/routetables.go +++ b/pkg/compute/models/routetables.go @@ -228,7 +228,7 @@ func (manager *SRouteTableManager) QueryDistinctExtraField(q *sqlchemy.SQuery, f switch field { case "account": cloudproviders := CloudproviderManager.Query().SubQuery() - cloudaccounts := CloudaccountManager.Query().Distinct().SubQuery() + cloudaccounts := CloudaccountManager.Query("name", "id").Distinct().SubQuery() q = q.Join(cloudproviders, sqlchemy.Equals(q.Field("manager_id"), cloudproviders.Field("id"))) q = q.Join(cloudaccounts, sqlchemy.Equals(cloudproviders.Field("cloudaccount_id"), cloudaccounts.Field("id"))) q.GroupBy(cloudaccounts.Field("name")) diff --git a/pkg/compute/models/snapshots.go b/pkg/compute/models/snapshots.go index c2516d12ff..36b79ee39f 100644 --- a/pkg/compute/models/snapshots.go +++ b/pkg/compute/models/snapshots.go @@ -500,7 +500,7 @@ func (self *SSnapshot) CustomizeDelete(ctx context.Context, userCred mcclient.To if len(self.ExternalId) == 0 { if self.CreatedBy == api.SNAPSHOT_MANUAL { if !self.OutOfChain && !self.FakeDeleted { - return self.FakeDelete() + return self.FakeDelete(userCred) } else if self.OutOfChain { return self.StartSnapshotDeleteTask(ctx, userCred, false, "") } @@ -593,12 +593,15 @@ func (self *SSnapshot) RealDelete(ctx context.Context, userCred mcclient.TokenCr return db.DeleteModel(ctx, userCred, self) } -func (self *SSnapshot) FakeDelete() error { +func (self *SSnapshot) FakeDelete(userCred mcclient.TokenCredential) error { _, err := db.Update(self, func() error { self.FakeDeleted = true self.Name += timeutils.IsoTime(time.Now()) return nil }) + if err == nil { + db.OpsLog.LogEvent(self, db.ACT_SNAPSHOT_FAKE_DELETE, "snapshot fake delete", userCred) + } return err } diff --git a/pkg/compute/models/vpcs.go b/pkg/compute/models/vpcs.go index c9dffe136f..ef1f3b6e58 100644 --- a/pkg/compute/models/vpcs.go +++ b/pkg/compute/models/vpcs.go @@ -678,7 +678,7 @@ func (manager *SVpcManager) QueryDistinctExtraField(q *sqlchemy.SQuery, field st switch field { case "account": cloudproviders := CloudproviderManager.Query().SubQuery() - cloudaccounts := CloudaccountManager.Query().Distinct().SubQuery() + cloudaccounts := CloudaccountManager.Query("name", "id").Distinct().SubQuery() q = q.Join(cloudproviders, sqlchemy.Equals(q.Field("manager_id"), cloudproviders.Field("id"))) q = q.Join(cloudaccounts, sqlchemy.Equals(cloudproviders.Field("cloudaccount_id"), cloudaccounts.Field("id"))) q.GroupBy(cloudaccounts.Field("name")) diff --git a/pkg/compute/tasks/guest_backup_tasks.go b/pkg/compute/tasks/guest_backup_tasks.go index 2f51ab9c7d..197429facc 100644 --- a/pkg/compute/tasks/guest_backup_tasks.go +++ b/pkg/compute/tasks/guest_backup_tasks.go @@ -107,11 +107,11 @@ func (self *GuestSwitchToBackupTask) OnFail(ctx context.Context, guest *models.S } func (self *GuestSwitchToBackupTask) OnComplete(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { - guest.SetMetadata(ctx, "__mirror_job_status", "", self.UserCred) self.SetStageComplete(ctx, nil) } func (self *GuestSwitchToBackupTask) OnSwitched(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { + guest.SetMetadata(ctx, "__mirror_job_status", "", self.UserCred) oldStatus, _ := self.Params.GetString("old_status") if utils.IsInStringArray(oldStatus, api.VM_RUNNING_STATUS) { self.SetStage("OnNewMasterStarted", nil) diff --git a/pkg/compute/tasks/guest_disk_snapshot_task.go b/pkg/compute/tasks/guest_disk_snapshot_task.go index 3a3fecd287..c09165dc3a 100644 --- a/pkg/compute/tasks/guest_disk_snapshot_task.go +++ b/pkg/compute/tasks/guest_disk_snapshot_task.go @@ -234,7 +234,7 @@ func (self *SnapshotDeleteTask) StartDeleteSnapshot(ctx context.Context, snapsho } func (self *SnapshotDeleteTask) DeleteStaticSnapshot(ctx context.Context, snapshot *models.SSnapshot) { - err := snapshot.FakeDelete() + err := snapshot.FakeDelete(self.UserCred) if err != nil { self.TaskFailed(ctx, snapshot, err.Error()) return diff --git a/pkg/hostman/guestfs/core.go b/pkg/hostman/guestfs/core.go index 0acd73fdee..f5962b988f 100644 --- a/pkg/hostman/guestfs/core.go +++ b/pkg/hostman/guestfs/core.go @@ -122,6 +122,7 @@ func DoDeployGuestFs(rootfs fsdriver.IRootFsDriver, guestDesc *deployapi.GuestDe return nil, fmt.Errorf("DeployFstabScripts: %v", err) } } + if len(deployInfo.Password) > 0 { if account := rootfs.GetLoginAccount(partition, deployInfo.DefaultRootUser, deployInfo.WindowsDefaultAdminUser); len(account) > 0 { @@ -133,10 +134,10 @@ func DoDeployGuestFs(rootfs fsdriver.IRootFsDriver, guestDesc *deployapi.GuestDe deployInfo.PublicKey.PublicKey, deployInfo.Password); err != nil { return nil, fmt.Errorf("ChangeUserPasswd: %v", err) } - ret.Account = account if len(secret) > 0 { ret.Key = secret } + ret.Account = account } } diff --git a/pkg/hostman/guestfs/fsdriver/linux.go b/pkg/hostman/guestfs/fsdriver/linux.go index 120243531f..0dd9cbdd23 100644 --- a/pkg/hostman/guestfs/fsdriver/linux.go +++ b/pkg/hostman/guestfs/fsdriver/linux.go @@ -199,7 +199,7 @@ func (l *sLinuxRootFs) DeployFstabScripts(rootFs IDiskPartition, disks []*deploy var rec string var modeRwxOwner = syscall.S_IRUSR | syscall.S_IWUSR | syscall.S_IXUSR var fstab = fstabutils.FSTabFile(string(fstabcont)) - fstab.RemoveDevices(len(disks)) + fstab = fstab.RemoveDevices(len(disks)) for i := 1; i < len(disks); i++ { diskId := disks[i].DiskId @@ -309,7 +309,7 @@ func (l *sLinuxRootFs) PrepareFsForTemplate(rootFs IDiskPartition) error { if rootFs.Exists("/etc/fstab", false) { fstabcont, _ := rootFs.FileGetContents("/etc/fstab", false) fstab := fstabutils.FSTabFile(string(fstabcont)) - fstab.RemoveDevices(1) + fstab = fstab.RemoveDevices(1) cf := fstab.ToConf() if err := rootFs.FilePutContents("/etc/fstab", cf, false, false); err != nil { return err diff --git a/pkg/hostman/system_service/systemd.go b/pkg/hostman/system_service/systemd.go index 5543b9c30a..b8114768f4 100644 --- a/pkg/hostman/system_service/systemd.go +++ b/pkg/hostman/system_service/systemd.go @@ -62,17 +62,15 @@ func parseSystemdStatus(res string, srvname string) SServiceStatus { lines := strings.Split(string(res), "\n") for _, line := range lines { line = strings.TrimSpace(line) - if len(line) > 0 { - if strings.HasPrefix(line, "Loaded:") { - parts := strings.Split(line, " ") - if len(parts) > 1 && parts[1] == "loaded" { - ret.Loaded = true - } - } else if strings.HasPrefix(line, "Active:") { - parts := strings.Split(line, " ") - if len(parts) > 1 && parts[1] == "active" { - ret.Active = true - } + if strings.HasPrefix(line, "Loaded:") { + parts := strings.Split(line, " ") + if len(parts) > 1 && parts[1] == "loaded" { + ret.Loaded = true + } + } else if strings.HasPrefix(line, "Active:") { + parts := strings.Split(line, " ") + if len(parts) > 1 && parts[1] == "active" { + ret.Active = true } } } diff --git a/pkg/image/models/images.go b/pkg/image/models/images.go index c59aaa14d6..0e95994e9f 100644 --- a/pkg/image/models/images.go +++ b/pkg/image/models/images.go @@ -107,7 +107,7 @@ type SImage struct { // VirtualSize int64 `nullable:"true" list:"user" create:"optional"` Location string `nullable:"true"` - DiskFormat string `width:"20" charset:"ascii" nullable:"true" list:"user" create:"optional"` // Column(VARCHAR(32, charset='ascii'), nullable=False, default='qcow2') + DiskFormat string `width:"20" charset:"ascii" nullable:"true" list:"user" create:"optional" default:"raw"` // Column(VARCHAR(32, charset='ascii'), nullable=False, default='qcow2') Checksum string `width:"32" charset:"ascii" nullable:"true" get:"user" list:"user"` FastHash string `width:"32" charset:"ascii" nullable:"true" get:"user"` Owner string `width:"255" charset:"ascii" nullable:"true" get:"user"` diff --git a/pkg/util/fstabutils/fstabutils.go b/pkg/util/fstabutils/fstabutils.go index d3f35ccd93..6467171a2d 100644 --- a/pkg/util/fstabutils/fstabutils.go +++ b/pkg/util/fstabutils/fstabutils.go @@ -82,7 +82,7 @@ func (ft *FsTab) AddFsrec(line string) { } } -func (ft *FsTab) RemoveDevices(devCnt int) { +func (ft *FsTab) RemoveDevices(devCnt int) *FsTab { var newList = make(FsTab, 0) for _, f := range *ft { if strings.HasPrefix(f.Dev, VDISK_PREFIX) { @@ -95,7 +95,7 @@ func (ft *FsTab) RemoveDevices(devCnt int) { newList = append(newList, f) } } - ft = &newList + return &newList } func (ft *FsTab) ToConf() string {