本文整理汇总了Golang中github.com/lxc/lxd/shared.ImageInfo.Fingerprint方法的典型用法代码示例。如果您正苦于以下问题:Golang ImageInfo.Fingerprint方法的具体用法?Golang ImageInfo.Fingerprint怎么用?Golang ImageInfo.Fingerprint使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类github.com/lxc/lxd/shared.ImageInfo
的用法示例。
在下文中一共展示了ImageInfo.Fingerprint方法的3个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Golang代码示例。
示例1: ImageDownload
// ImageDownload checks if we have that Image Fingerprint else
// downloads the image from a remote server.
func (d *Daemon) ImageDownload(op *operation, server string, protocol string, certificate string, secret string, alias string, forContainer bool, autoUpdate bool) (string, error) {
var err error
var ss *shared.SimpleStreams
var ctxMap log.Ctx
if protocol == "" {
protocol = "lxd"
}
fp := alias
// Expand aliases
if protocol == "simplestreams" {
imageStreamCacheLock.Lock()
entry, _ := imageStreamCache[server]
if entry == nil || entry.expiry.Before(time.Now()) {
refresh := func() (*imageStreamCacheEntry, error) {
// Setup simplestreams client
ss, err = shared.SimpleStreamsClient(server, d.proxy)
if err != nil {
return nil, err
}
// Get all aliases
aliases, err := ss.ListAliases()
if err != nil {
return nil, err
}
// Get all fingerprints
images, err := ss.ListImages()
if err != nil {
return nil, err
}
fingerprints := []string{}
for _, image := range images {
fingerprints = append(fingerprints, image.Fingerprint)
}
// Generate cache entry
entry = &imageStreamCacheEntry{ss: ss, Aliases: aliases, Fingerprints: fingerprints, expiry: time.Now().Add(time.Hour)}
imageStreamCache[server] = entry
imageSaveStreamCache()
return entry, nil
}
newEntry, err := refresh()
if err == nil {
// Cache refreshed
entry = newEntry
} else if entry != nil {
// Failed to fetch entry but existing cache
shared.LogWarn("Unable to refresh cache, using stale entry", log.Ctx{"server": server})
entry.expiry = time.Now().Add(time.Hour)
} else {
// Failed to fetch entry and nothing in cache
imageStreamCacheLock.Unlock()
return "", err
}
} else {
shared.LogDebug("Using SimpleStreams cache entry", log.Ctx{"server": server, "expiry": entry.expiry})
ss = entry.ss
}
imageStreamCacheLock.Unlock()
// Expand aliases
for _, alias := range entry.Aliases {
if alias.Name != fp {
continue
}
fp = alias.Target
break
}
// Expand fingerprint
for _, fingerprint := range entry.Fingerprints {
if !strings.HasPrefix(fingerprint, fp) {
continue
}
if fp == alias {
alias = fingerprint
}
fp = fingerprint
break
}
} else if protocol == "lxd" {
target, err := remoteGetImageFingerprint(d, server, certificate, fp)
if err == nil && target != "" {
fp = target
}
}
if _, _, err := dbImageGet(d.db, fp, false, false); err == nil {
shared.LogDebug("Image already exists in the db", log.Ctx{"image": fp})
//.........这里部分代码省略.........
示例2: ImageDownload
// ImageDownload checks if we have that Image Fingerprint else
// downloads the image from a remote server.
func (d *Daemon) ImageDownload(op *operation, server string, protocol string, certificate string, secret string, alias string, forContainer bool, autoUpdate bool) (string, error) {
var err error
var ss *shared.SimpleStreams
if protocol == "" {
protocol = "lxd"
}
fp := alias
// Expand aliases
if protocol == "simplestreams" {
ss, err = shared.SimpleStreamsClient(server, d.proxy)
if err != nil {
return "", err
}
target := ss.GetAlias(fp)
if target != "" {
fp = target
}
image, err := ss.GetImageInfo(fp)
if err != nil {
return "", err
}
if fp == alias {
alias = image.Fingerprint
}
fp = image.Fingerprint
} else if protocol == "lxd" {
target, err := remoteGetImageFingerprint(d, server, certificate, fp)
if err == nil && target != "" {
fp = target
}
}
if _, _, err := dbImageGet(d.db, fp, false, false); err == nil {
shared.Log.Debug("Image already exists in the db", log.Ctx{"image": fp})
// already have it
return fp, nil
}
shared.Log.Info(
"Image not in the db, downloading it",
log.Ctx{"image": fp, "server": server})
// Now check if we already downloading the image
d.imagesDownloadingLock.RLock()
if waitChannel, ok := d.imagesDownloading[fp]; ok {
// We already download the image
d.imagesDownloadingLock.RUnlock()
shared.Log.Info(
"Already downloading the image, waiting for it to succeed",
log.Ctx{"image": fp})
// Wait until the download finishes (channel closes)
if _, ok := <-waitChannel; ok {
shared.Log.Warn("Value transmitted over image lock semaphore?")
}
if _, _, err := dbImageGet(d.db, fp, false, true); err != nil {
shared.Log.Error(
"Previous download didn't succeed",
log.Ctx{"image": fp})
return "", fmt.Errorf("Previous download didn't succeed")
}
shared.Log.Info(
"Previous download succeeded",
log.Ctx{"image": fp})
return fp, nil
}
d.imagesDownloadingLock.RUnlock()
shared.Log.Info(
"Downloading the image",
log.Ctx{"image": fp})
// Add the download to the queue
d.imagesDownloadingLock.Lock()
d.imagesDownloading[fp] = make(chan bool)
d.imagesDownloadingLock.Unlock()
// Unlock once this func ends.
defer func() {
d.imagesDownloadingLock.Lock()
if waitChannel, ok := d.imagesDownloading[fp]; ok {
close(waitChannel)
delete(d.imagesDownloading, fp)
}
d.imagesDownloadingLock.Unlock()
}()
//.........这里部分代码省略.........
示例3: ImageDownload
// ImageDownload checks if we have that Image Fingerprint else
// downloads the image from a remote server.
func (d *Daemon) ImageDownload(op *operation,
server, fp string, secret string, forContainer bool, directDownload bool) error {
if _, err := dbImageGet(d.db, fp, false, false); err == nil {
shared.Log.Debug("Image already exists in the db", log.Ctx{"image": fp})
// already have it
return nil
}
shared.Log.Info(
"Image not in the db, downloading it",
log.Ctx{"image": fp, "server": server})
// Now check if we already downloading the image
d.imagesDownloadingLock.RLock()
if waitChannel, ok := d.imagesDownloading[fp]; ok {
// We already download the image
d.imagesDownloadingLock.RUnlock()
shared.Log.Info(
"Already downloading the image, waiting for it to succeed",
log.Ctx{"image": fp})
// Wait until the download finishes (channel closes)
if _, ok := <-waitChannel; ok {
shared.Log.Warn("Value transmitted over image lock semaphore?")
}
if _, err := dbImageGet(d.db, fp, false, true); err != nil {
shared.Log.Error(
"Previous download didn't succeed",
log.Ctx{"image": fp})
return fmt.Errorf("Previous download didn't succeed")
}
shared.Log.Info(
"Previous download succeeded",
log.Ctx{"image": fp})
return nil
}
d.imagesDownloadingLock.RUnlock()
shared.Log.Info(
"Downloading the image",
log.Ctx{"image": fp})
// Add the download to the queue
d.imagesDownloadingLock.Lock()
d.imagesDownloading[fp] = make(chan bool)
d.imagesDownloadingLock.Unlock()
// Unlock once this func ends.
defer func() {
d.imagesDownloadingLock.Lock()
if waitChannel, ok := d.imagesDownloading[fp]; ok {
close(waitChannel)
delete(d.imagesDownloading, fp)
}
d.imagesDownloadingLock.Unlock()
}()
exporturl := server
var info shared.ImageInfo
info.Fingerprint = fp
if !directDownload {
/* grab the metadata from /1.0/images/%s */
var url string
if secret != "" {
url = fmt.Sprintf(
"%s/%s/images/%s?secret=%s",
server, shared.APIVersion, fp, secret)
} else {
url = fmt.Sprintf("%s/%s/images/%s", server, shared.APIVersion, fp)
}
resp, err := d.httpGetSync(url)
if err != nil {
shared.Log.Error(
"Failed to download image metadata",
log.Ctx{"image": fp, "err": err})
return err
}
if err := json.Unmarshal(resp.Metadata, &info); err != nil {
return err
}
/* now grab the actual file from /1.0/images/%s/export */
if secret != "" {
exporturl = fmt.Sprintf(
"%s/%s/images/%s/export?secret=%s",
server, shared.APIVersion, fp, secret)
//.........这里部分代码省略.........