harbor从v1.1.1升级到v1.5.1的记录(三)

之前写了两篇harbor的博客,主要是v1.1.1同步到v1.5.1的数据同步以及安装方面的,现在分析harbor的同步功能,因为公司的业务需要对接,就修改了harbor的同步规则,

主要是修改了harbor的同步机制

写了个interface{}

package registry

import (
    "io"
)

type RepositoryInterface interface {
    ListTag() ([]string, error)
    ManifestExist(reference string) (digest string, exist bool, err error)
    PullManifest(reference string, acceptMediaTypes []string) (digest, mediaType string, payload []byte, err error)
    PushManifest(reference, mediaType string, payload []byte) (digest string, err error)
    DeleteManifest(digest string) error
    DeleteTag(tag string) error
    BlobExist(digest string) (bool, error)
    PullBlob(digest string) (size int64, data io.ReadCloser, err error)
    initiateBlobUpload(name string) (location, uploadUUID string, err error)
    monolithicBlobUpload(location, digest string, size int64, data io.Reader) error
    PushBlob(digest string, size int64, data io.Reader) error
    DeleteBlob(digest string) error
}

harbor以及自己要实现的同步到huawei的镜像仓库都实现了这个接口RepositoryInterface

// PushBlob ...
func (r *RepositoryHuawei) PushBlob(digest string, size int64, data io.Reader) error {
    log.Infof("RepositoryHuawei r.Name=%s,r.client=%v,r.Endpoint=%s\n", r.Name, r.client, r.Endpoint)
    _, uuid, err := r.initiateBlobUpload(r.Name)
    if err != nil {
        return err
    }

    _, _, err = r.patchUploads(uuid, data)
    if err != nil {
        return err
    }

    return r.putUploads(digest, uuid)
}
func (r *RepositoryHuawei) putUploads(digest, uuid string) (err error) {
    req, err := http.NewRequest("PUT", buildBlobUploadURL(r.Endpoint.String(), r.Name, uuid, digest), nil)

    resp, err := r.client.Do(req)
    if nil != err {
        err = parseError(err)
        return
    }

    defer resp.Body.Close()

    if http.StatusAccepted == resp.StatusCode || http.StatusCreated == resp.StatusCode {
        return
    }
    b, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        return
    }

    err = &registry_error.HTTPError{
        StatusCode: resp.StatusCode,
        Detail:     string(b),
    }

    return
}

func (r *RepositoryHuawei) patchUploads(uuid string, data io.Reader) (location, uploadUUID string, err error) {
    req, err := http.NewRequest("PATCH", buildInitiateBlobUploadWithUuidURL(r.Endpoint.String(), r.Name, uuid), data)

    resp, err := r.client.Do(req)
    if nil != err {
        err = parseError(err)
        return
    }
    defer resp.Body.Close()

    if http.StatusCreated == resp.StatusCode || http.StatusAccepted == resp.StatusCode {
        location = resp.Header.Get(http.CanonicalHeaderKey("Location"))
        uploadUUID = resp.Header.Get(http.CanonicalHeaderKey("Docker-Upload-Uuid"))
        return
    }

    b, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        return
    }

    err = &registry_error.HTTPError{
        StatusCode: resp.StatusCode,
        Detail:     string(b),
    }

    return
}

这个是根据docker client的方式,先post 然后patch上传,put结束,
是docker client的方式,所以现在处理的是patch的时候保存镜像层,不然会报404的错误
111

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值