diff --git a/pkg/hostman/hostmetrics/hostmetrics.go b/pkg/hostman/hostmetrics/hostmetrics.go index 95612c547f..fb17abfb8d 100644 --- a/pkg/hostman/hostmetrics/hostmetrics.go +++ b/pkg/hostman/hostmetrics/hostmetrics.go @@ -107,6 +107,7 @@ func (m *SHostMetricsCollector) reportUsageToTelegraf(data string) { log.Errorf("Upload guest metric failed: %s", err) return } + defer res.Body.Close() if res.StatusCode != 204 { log.Errorf("upload guest metric failed %d", res.StatusCode) timestamp := time.Now().UnixNano() @@ -119,6 +120,9 @@ func (m *SHostMetricsCollector) reportUsageToTelegraf(data string) { oldDatas := strings.Join(m.waitingReportData, "\n") body = strings.NewReader(oldDatas) res, err = httputils.Request(httputils.GetDefaultClient(), context.Background(), "POST", TelegrafServer, nil, body, false) + if err == nil { + defer res.Body.Close() + } if res.StatusCode == 204 { m.waitingReportData = m.waitingReportData[len(m.waitingReportData):] } else { diff --git a/pkg/image/models/images.go b/pkg/image/models/images.go index 4d994fe7ee..7303320782 100644 --- a/pkg/image/models/images.go +++ b/pkg/image/models/images.go @@ -115,6 +115,9 @@ type SImage struct { MinRamMB int32 `name:"min_ram" nullable:"false" default:"0" list:"user" create:"optional" update:"user"` Protected tristate.TriState `nullable:"true" list:"user" get:"user" create:"optional" update:"user"` + + // image copy from url, save origin checksum before probe + OssChecksum string `width:"32" charset:"ascii" nullable:"true" get:"user" list:"user"` } func (manager *SImageManager) CustomizeHandlerInfo(info *appsrv.SHandlerInfo) { @@ -219,6 +222,15 @@ func (self *SImage) CustomizedGetDetailsBody(ctx context.Context, userCred mccli return nil, nil } +func (self *SImage) getMoreDetails(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, extra *jsonutils.JSONDict) *jsonutils.JSONDict { + var ossChksum = self.OssChecksum + if len(self.OssChecksum) == 0 { + ossChksum = self.Checksum + } + extra.Set("oss_checksum", jsonutils.NewString(ossChksum)) + return extra +} + func (self *SImage) GetCustomizeColumns(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject) *jsonutils.JSONDict { extra := self.SVirtualResourceBase.GetCustomizeColumns(ctx, userCred, query) properties, _ := ImagePropertyManager.GetProperties(self.Id) @@ -229,7 +241,7 @@ func (self *SImage) GetCustomizeColumns(ctx context.Context, userCred mcclient.T } extra.Add(jsonProps, "properties") } - return extra + return self.getMoreDetails(ctx, userCred, query, extra) } func (self *SImage) GetExtraDetails(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*jsonutils.JSONDict, error) { @@ -253,7 +265,7 @@ func (self *SImage) GetExtraDetails(ctx context.Context, userCred mcclient.Token extra.Add(jsonutils.NewString(timeutils.FullIsoTime(pendingDeletedAt)), "auto_delete_at") } - return extra, nil + return self.getMoreDetails(ctx, userCred, query, extra), nil } func (self *SImage) GetExtraDetailsHeaders(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject) map[string]string { @@ -299,6 +311,13 @@ func (self *SImage) GetExtraDetailsHeaders(ctx context.Context, userCred mcclien } } + // none of subimage business + var ossChksum = self.OssChecksum + if len(self.OssChecksum) == 0 { + ossChksum = self.Checksum + } + headers[fmt.Sprintf("%s%s", modules.IMAGE_META, "oss_checksum")] = ossChksum + properties, _ := ImagePropertyManager.GetProperties(self.Id) if len(properties) > 0 { for k, v := range properties { diff --git a/pkg/image/tasks/image_copy_from_url_task.go b/pkg/image/tasks/image_copy_from_url_task.go index 49059ce7a6..8621aeac6f 100644 --- a/pkg/image/tasks/image_copy_from_url_task.go +++ b/pkg/image/tasks/image_copy_from_url_task.go @@ -50,10 +50,21 @@ func (self *ImageCopyFromUrlTask) OnInit(ctx context.Context, obj db.IStandalone if err != nil { return nil, err } + defer resp.Body.Close() err = image.SaveImageFromStream(resp.Body, false) if err != nil { return nil, err } + md5 := resp.Header.Get("Content-Md5") + if len(md5) == 0 { + md5 = resp.Header.Get("x-oss-meta-yunion-os-checksum") + } + if len(md5) > 0 { + db.Update(image, func() error { + image.OssChecksum = md5 + return nil + }) + } return nil, nil }) }