本文整理汇总了Golang中github.com/lxc/lxd/shared.ArchitectureId函数的典型用法代码示例。如果您正苦于以下问题:Golang ArchitectureId函数的具体用法?Golang ArchitectureId怎么用?Golang ArchitectureId使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了ArchitectureId函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Golang代码示例。
示例1: createFromNone
func createFromNone(d *Daemon, req *containerPostReq) Response {
architecture, err := shared.ArchitectureId(req.Architecture)
if err != nil {
architecture = 0
}
args := containerArgs{
Architecture: architecture,
Config: req.Config,
Ctype: cTypeRegular,
Devices: req.Devices,
Ephemeral: req.Ephemeral,
Name: req.Name,
Profiles: req.Profiles,
}
run := func(op *operation) error {
_, err := containerCreateAsEmpty(d, args)
return err
}
resources := map[string][]string{}
resources["containers"] = []string{req.Name}
op, err := operationCreate(operationClassTask, resources, nil, run, nil, nil)
if err != nil {
return InternalError(err)
}
return OperationResponse(op)
}
示例2: dbImageUpdate
func dbImageUpdate(db *sql.DB, id int, fname string, sz int64, public bool, autoUpdate bool, architecture string, creationDate time.Time, expiryDate time.Time, properties map[string]string) error {
arch, err := shared.ArchitectureId(architecture)
if err != nil {
arch = 0
}
tx, err := dbBegin(db)
if err != nil {
return err
}
publicInt := 0
if public {
publicInt = 1
}
autoUpdateInt := 0
if autoUpdate {
autoUpdateInt = 1
}
stmt, err := tx.Prepare(`UPDATE images SET filename=?, size=?, public=?, auto_update=?, architecture=?, creation_date=?, expiry_date=? WHERE id=?`)
if err != nil {
tx.Rollback()
return err
}
defer stmt.Close()
_, err = stmt.Exec(fname, sz, publicInt, autoUpdateInt, arch, creationDate, expiryDate, id)
if err != nil {
tx.Rollback()
return err
}
_, err = tx.Exec(`DELETE FROM images_properties WHERE image_id=?`, id)
stmt, err = tx.Prepare(`INSERT INTO images_properties (image_id, type, key, value) VALUES (?, ?, ?, ?)`)
if err != nil {
tx.Rollback()
return err
}
for key, value := range properties {
_, err = stmt.Exec(id, 0, key, value)
if err != nil {
tx.Rollback()
return err
}
}
if err := txCommit(tx); err != nil {
return err
}
return nil
}
示例3: containerPut
/*
* Update configuration, or, if 'restore:snapshot-name' is present, restore
* the named snapshot
*/
func containerPut(d *Daemon, r *http.Request) Response {
name := mux.Vars(r)["name"]
c, err := containerLoadByName(d, name)
if err != nil {
return NotFound
}
configRaw := containerPutReq{}
if err := json.NewDecoder(r.Body).Decode(&configRaw); err != nil {
return BadRequest(err)
}
architecture, err := shared.ArchitectureId(configRaw.Architecture)
if err != nil {
architecture = 0
}
var do = func(*operation) error { return nil }
if configRaw.Restore == "" {
// Update container configuration
do = func(op *operation) error {
args := containerArgs{
Architecture: architecture,
Config: configRaw.Config,
Devices: configRaw.Devices,
Ephemeral: configRaw.Ephemeral,
Profiles: configRaw.Profiles}
// FIXME: should set to true when not migrating
err = c.Update(args, false)
if err != nil {
return err
}
return nil
}
} else {
// Snapshot Restore
do = func(op *operation) error {
return containerSnapRestore(d, name, configRaw.Restore)
}
}
resources := map[string][]string{}
resources["containers"] = []string{name}
op, err := operationCreate(operationClassTask, resources, nil, do, nil, nil)
if err != nil {
return InternalError(err)
}
return OperationResponse(op)
}
示例4: getImageMetadata
func getImageMetadata(fname string) (*imageMetadata, error) {
metadataName := "metadata.yaml"
compressionArgs, _, err := detectCompression(fname)
if err != nil {
return nil, fmt.Errorf(
"detectCompression failed, err='%v', tarfile='%s'",
err,
fname)
}
args := []string{"-O"}
args = append(args, compressionArgs...)
args = append(args, fname, metadataName)
// read the metadata.yaml
output, err := exec.Command("tar", args...).CombinedOutput()
if err != nil {
outputLines := strings.Split(string(output), "\n")
return nil, fmt.Errorf("Could not extract image %s from tar: %v (%s)", metadataName, err, outputLines[0])
}
metadata := imageMetadata{}
err = yaml.Unmarshal(output, &metadata)
if err != nil {
return nil, fmt.Errorf("Could not parse %s: %v", metadataName, err)
}
_, err = shared.ArchitectureId(metadata.Architecture)
if err != nil {
return nil, err
}
if metadata.CreationDate == 0 {
return nil, fmt.Errorf("Missing creation date.")
}
return &metadata, nil
}
示例5: getImgPostInfo
//.........这里部分代码省略.........
}
imgfname := shared.VarPath("images", info.Fingerprint)
err = shared.FileMove(imageTarf.Name(), imgfname)
if err != nil {
logger.Error(
"Failed to move the image tarfile",
log.Ctx{
"err": err,
"source": imageTarf.Name(),
"dest": imgfname})
return info, err
}
rootfsfname := shared.VarPath("images", info.Fingerprint+".rootfs")
err = shared.FileMove(rootfsTarf.Name(), rootfsfname)
if err != nil {
logger.Error(
"Failed to move the rootfs tarfile",
log.Ctx{
"err": err,
"source": rootfsTarf.Name(),
"dest": imgfname})
return info, err
}
imageMeta, err = getImageMetadata(imgfname)
if err != nil {
logger.Error(
"Failed to get image metadata",
log.Ctx{"err": err})
return info, err
}
} else {
post.Seek(0, 0)
size, err = io.Copy(io.MultiWriter(imageTarf, sha256), post)
info.Size = size
imageTarf.Close()
logger.Debug("Tar size", log.Ctx{"size": size})
if err != nil {
logger.Error(
"Failed to copy the tarfile",
log.Ctx{"err": err})
return info, err
}
info.Filename = r.Header.Get("X-LXD-filename")
info.Fingerprint = fmt.Sprintf("%x", sha256.Sum(nil))
expectedFingerprint := r.Header.Get("X-LXD-fingerprint")
if expectedFingerprint != "" && info.Fingerprint != expectedFingerprint {
logger.Error(
"Fingerprints don't match",
log.Ctx{
"got": info.Fingerprint,
"expected": expectedFingerprint})
err = fmt.Errorf(
"fingerprints don't match, got %s expected %s",
info.Fingerprint,
expectedFingerprint)
return info, err
}
imgfname := shared.VarPath("images", info.Fingerprint)
err = shared.FileMove(imageTarf.Name(), imgfname)
if err != nil {
logger.Error(
"Failed to move the tarfile",
log.Ctx{
"err": err,
"source": imageTarf.Name(),
"dest": imgfname})
return info, err
}
imageMeta, err = getImageMetadata(imgfname)
if err != nil {
logger.Error(
"Failed to get image metadata",
log.Ctx{"err": err})
return info, err
}
}
info.Architecture, _ = shared.ArchitectureId(imageMeta.Architecture)
info.CreationDate = imageMeta.CreationDate
info.ExpiryDate = imageMeta.ExpiryDate
info.Properties = imageMeta.Properties
if len(propHeaders) > 0 {
for _, ph := range propHeaders {
p, _ := url.ParseQuery(ph)
for pkey, pval := range p {
info.Properties[pkey] = pval[0]
}
}
}
return info, nil
}
示例6: getImgPostInfo
func getImgPostInfo(d *Daemon, r *http.Request, builddir string) (public int,
fingerprint string, arch int,
filename string, size int64,
properties map[string]string, err error) {
// Is this a container request?
decoder := json.NewDecoder(r.Body)
req := imageFromContainerPostReq{}
if err = decoder.Decode(&req); err == nil {
return imgPostContInfo(d, r, req, builddir)
}
// ok we've got an image in the body
public, _ = strconv.Atoi(r.Header.Get("X-LXD-public"))
filename = r.Header.Get("X-LXD-filename")
propHeaders := r.Header[http.CanonicalHeaderKey("X-LXD-properties")]
properties = map[string]string{}
if len(propHeaders) > 0 {
for _, ph := range propHeaders {
p, _ := url.ParseQuery(ph)
for pkey, pval := range p {
properties[pkey] = pval[0]
}
}
}
// Create a file for the tarball
tarf, err := ioutil.TempFile(builddir, "lxd_tar_")
if err != nil {
return 0, "", 0, "", 0, properties, err
}
tarfname := tarf.Name()
sha256 := sha256.New()
var size1, size2 int64
size1, err = io.Copy(io.MultiWriter(tarf, sha256), decoder.Buffered())
if err == nil {
size2, err = io.Copy(io.MultiWriter(tarf, sha256), r.Body)
}
size = size1 + size2
tarf.Close()
if err != nil {
return 0, "", 0, "", 0, properties, err
}
fingerprint = fmt.Sprintf("%x", sha256.Sum(nil))
expectedFingerprint := r.Header.Get("X-LXD-fingerprint")
if expectedFingerprint != "" && fingerprint != expectedFingerprint {
err = fmt.Errorf("fingerprints don't match, got %s expected %s", fingerprint, expectedFingerprint)
return 0, "", 0, "", 0, properties, err
}
imagefname := filepath.Join(builddir, fingerprint)
err = os.Rename(tarfname, imagefname)
if err != nil {
return 0, "", 0, "", 0, properties, err
}
var imageMeta *imageMetadata
imageMeta, err = getImageMetadata(imagefname)
if err != nil {
return 0, "", 0, "", 0, properties, err
}
arch, _ = shared.ArchitectureId(imageMeta.Architecture)
err = nil
return
}
示例7: containerPatch
func containerPatch(d *Daemon, r *http.Request) Response {
// Get the container
name := mux.Vars(r)["name"]
c, err := containerLoadByName(d, name)
if err != nil {
return NotFound
}
// Validate the ETag
etag := []interface{}{c.Architecture(), c.LocalConfig(), c.LocalDevices(), c.IsEphemeral(), c.Profiles()}
err = etagCheck(r, etag)
if err != nil {
return PreconditionFailed(err)
}
body, err := ioutil.ReadAll(r.Body)
if err != nil {
return InternalError(err)
}
rdr1 := ioutil.NopCloser(bytes.NewBuffer(body))
rdr2 := ioutil.NopCloser(bytes.NewBuffer(body))
reqRaw := shared.Jmap{}
if err := json.NewDecoder(rdr1).Decode(&reqRaw); err != nil {
return BadRequest(err)
}
req := containerPutReq{}
if err := json.NewDecoder(rdr2).Decode(&req); err != nil {
return BadRequest(err)
}
if req.Restore != "" {
return BadRequest(fmt.Errorf("Can't call PATCH in restore mode."))
}
// Check if architecture was passed
var architecture int
_, err = reqRaw.GetString("architecture")
if err != nil {
architecture = c.Architecture()
} else {
architecture, err = shared.ArchitectureId(req.Architecture)
if err != nil {
architecture = 0
}
}
// Check if ephemeral was passed
_, err = reqRaw.GetBool("ephemeral")
if err != nil {
req.Ephemeral = c.IsEphemeral()
}
// Check if profiles was passed
if req.Profiles == nil {
req.Profiles = c.Profiles()
}
// Check if config was passed
if req.Config == nil {
req.Config = c.LocalConfig()
} else {
for k, v := range c.LocalConfig() {
_, ok := req.Config[k]
if !ok {
req.Config[k] = v
}
}
}
// Check if devices was passed
if req.Devices == nil {
req.Devices = c.LocalDevices()
} else {
for k, v := range c.LocalDevices() {
_, ok := req.Devices[k]
if !ok {
req.Devices[k] = v
}
}
}
// Update container configuration
args := containerArgs{
Architecture: architecture,
Config: req.Config,
Devices: req.Devices,
Ephemeral: req.Ephemeral,
Profiles: req.Profiles}
err = c.Update(args, false)
if err != nil {
return SmartError(err)
}
return EmptySyncResponse
}
示例8: StartDaemon
// StartDaemon starts the shared daemon with the provided configuration.
func StartDaemon() (*Daemon, error) {
d := &Daemon{}
/* Setup logging */
if shared.Log == nil {
shared.SetLogger("", "", true, true)
}
shared.Log.Info("LXD is starting.")
/* Get the list of supported architectures */
var architectures = []int{}
uname := syscall.Utsname{}
if err := syscall.Uname(&uname); err != nil {
return nil, err
}
architectureName := ""
for _, c := range uname.Machine {
if c == 0 {
break
}
architectureName += string(byte(c))
}
architecture, err := shared.ArchitectureId(architectureName)
if err != nil {
return nil, err
}
architectures = append(architectures, architecture)
personalities, err := shared.ArchitecturePersonalities(architecture)
if err != nil {
return nil, err
}
for _, personality := range personalities {
architectures = append(architectures, personality)
}
d.architectures = architectures
/* Create required paths */
d.lxcpath = shared.VarPath("containers")
err = os.MkdirAll(d.lxcpath, 0755)
if err != nil {
return nil, err
}
// Create default directories
if err := os.MkdirAll(shared.VarPath("images"), 0700); err != nil {
return nil, err
}
if err := os.MkdirAll(shared.VarPath("snapshots"), 0700); err != nil {
return nil, err
}
if err := os.MkdirAll(shared.VarPath("devlxd"), 0755); err != nil {
return nil, err
}
/* Detect the filesystem */
d.BackingFs, err = filesystemDetect(d.lxcpath)
if err != nil {
shared.Log.Error("Error detecting backing fs", log.Ctx{"err": err})
}
/* Read the uid/gid allocation */
d.IdmapSet, err = shared.DefaultIdmapSet()
if err != nil {
shared.Log.Warn("error reading idmap", log.Ctx{"err": err.Error()})
shared.Log.Warn("operations requiring idmap will not be available")
} else {
shared.Log.Info("Default uid/gid map:")
for _, lxcmap := range d.IdmapSet.ToLxcString() {
shared.Log.Info(strings.TrimRight(" - "+lxcmap, "\n"))
}
}
/* Initialize the database */
err = initDb(d)
if err != nil {
return nil, err
}
/* Setup the TLS authentication */
certf, keyf, err := readMyCert()
if err != nil {
return nil, err
}
d.certf = certf
d.keyf = keyf
readSavedClientCAList(d)
tlsConfig, err := shared.GetTLSConfig(d.certf, d.keyf)
if err != nil {
return nil, err
}
/* Setup /dev/lxd */
d.devlxd, err = createAndBindDevLxd()
//.........这里部分代码省略.........
示例9: Init
//.........这里部分代码省略.........
cgDevicesController = shared.PathExists("/sys/fs/cgroup/devices/")
if !cgDevicesController {
shared.Log.Warn("Couldn't find the CGroup devices controller, device access control won't work.")
}
cgMemoryController = shared.PathExists("/sys/fs/cgroup/memory/")
if !cgMemoryController {
shared.Log.Warn("Couldn't find the CGroup memory controller, memory limits will be ignored.")
}
cgNetPrioController = shared.PathExists("/sys/fs/cgroup/net_prio/")
if !cgNetPrioController {
shared.Log.Warn("Couldn't find the CGroup network class controller, network limits will be ignored.")
}
cgPidsController = shared.PathExists("/sys/fs/cgroup/pids/")
if !cgPidsController {
shared.Log.Warn("Couldn't find the CGroup pids controller, process limits will be ignored.")
}
cgSwapAccounting = shared.PathExists("/sys/fs/cgroup/memory/memory.memsw.limit_in_bytes")
if !cgSwapAccounting {
shared.Log.Warn("CGroup memory swap accounting is disabled, swap limits will be ignored.")
}
/* Get the list of supported architectures */
var architectures = []int{}
architectureName, err := shared.ArchitectureGetLocal()
if err != nil {
return err
}
architecture, err := shared.ArchitectureId(architectureName)
if err != nil {
return err
}
architectures = append(architectures, architecture)
personalities, err := shared.ArchitecturePersonalities(architecture)
if err != nil {
return err
}
for _, personality := range personalities {
architectures = append(architectures, personality)
}
d.architectures = architectures
/* Set container path */
d.lxcpath = shared.VarPath("containers")
/* Make sure all our directories are available */
if err := os.MkdirAll(shared.VarPath("containers"), 0711); err != nil {
return err
}
if err := os.MkdirAll(shared.VarPath("devices"), 0711); err != nil {
return err
}
if err := os.MkdirAll(shared.VarPath("devlxd"), 0755); err != nil {
return err
}
if err := os.MkdirAll(shared.VarPath("images"), 0700); err != nil {
return err
}
if err := os.MkdirAll(shared.LogPath(), 0700); err != nil {
return err
示例10: getImgPostInfo
//.........这里部分代码省略.........
return info, fmt.Errorf("Invalid multipart image")
}
size, err = io.Copy(io.MultiWriter(imageTarf, sha256), part)
info.Size += size
imageTarf.Close()
if err != nil {
return info, err
}
// Get the rootfs tarball
part, err = mr.NextPart()
if err != nil {
return info, err
}
if part.FormName() != "rootfs" {
return info, fmt.Errorf("Invalid multipart image")
}
size, err = io.Copy(io.MultiWriter(rootfsTarf, sha256), part)
info.Size += size
rootfsTarf.Close()
if err != nil {
return info, err
}
info.Filename = part.FileName()
info.Fingerprint = fmt.Sprintf("%x", sha256.Sum(nil))
expectedFingerprint := r.Header.Get("X-LXD-fingerprint")
if expectedFingerprint != "" && info.Fingerprint != expectedFingerprint {
err = fmt.Errorf("fingerprints don't match, got %s expected %s", info.Fingerprint, expectedFingerprint)
return info, err
}
imgfname := filepath.Join(builddir, info.Fingerprint)
err = os.Rename(imageTarf.Name(), imgfname)
if err != nil {
return info, err
}
rootfsfname := filepath.Join(builddir, info.Fingerprint+".rootfs")
err = os.Rename(rootfsTarf.Name(), rootfsfname)
if err != nil {
return info, err
}
imageMeta, err = getImageMetadata(imgfname)
if err != nil {
return info, err
}
} else {
post.Seek(0, 0)
size, err = io.Copy(io.MultiWriter(imageTarf, sha256), post)
info.Size = size
imageTarf.Close()
if err != nil {
return info, err
}
info.Filename = r.Header.Get("X-LXD-filename")
info.Fingerprint = fmt.Sprintf("%x", sha256.Sum(nil))
expectedFingerprint := r.Header.Get("X-LXD-fingerprint")
if expectedFingerprint != "" && info.Fingerprint != expectedFingerprint {
err = fmt.Errorf("fingerprints don't match, got %s expected %s", info.Fingerprint, expectedFingerprint)
return info, err
}
imgfname := filepath.Join(builddir, info.Fingerprint)
err = os.Rename(imageTarf.Name(), imgfname)
if err != nil {
return info, err
}
imageMeta, err = getImageMetadata(imgfname)
if err != nil {
return info, err
}
}
info.Architecture, _ = shared.ArchitectureId(imageMeta.Architecture)
info.CreationDate = imageMeta.CreationDate
info.ExpiryDate = imageMeta.ExpiryDate
info.Properties = imageMeta.Properties
if len(propHeaders) > 0 {
for _, ph := range propHeaders {
p, _ := url.ParseQuery(ph)
for pkey, pval := range p {
info.Properties[pkey] = pval[0]
}
}
}
return info, nil
}
示例11: ImageDownload
//.........这里部分代码省略.........
if err != nil {
shared.Log.Error(
"Failed to save image",
log.Ctx{"image": fp, "err": err})
return err
}
// Get the rootfs tarball
part, err = mr.NextPart()
if err != nil {
shared.Log.Error(
"Invalid multipart image",
log.Ctx{"image": fp, "err": err})
return err
}
if part.FormName() != "rootfs" {
shared.Log.Error(
"Invalid multipart image",
log.Ctx{"image": fp})
return fmt.Errorf("Invalid multipart image")
}
destName = filepath.Join(destDir, info.Fingerprint+".rootfs")
f, err = os.Create(destName)
if err != nil {
shared.Log.Error(
"Failed to save image",
log.Ctx{"image": fp, "err": err})
return err
}
_, err = io.Copy(f, part)
f.Close()
if err != nil {
shared.Log.Error(
"Failed to save image",
log.Ctx{"image": fp, "err": err})
return err
}
} else {
destName = filepath.Join(destDir, info.Fingerprint)
f, err := os.Create(destName)
if err != nil {
shared.Log.Error(
"Failed to save image",
log.Ctx{"image": fp, "err": err})
return err
}
_, err = io.Copy(f, body)
f.Close()
if err != nil {
shared.Log.Error(
"Failed to save image",
log.Ctx{"image": fp, "err": err})
return err
}
}
if directDownload {
imageMeta, err := getImageMetadata(destName)
if err != nil {
return err
}
info.Architecture, _ = shared.ArchitectureId(imageMeta.Architecture)
info.CreationDate = imageMeta.CreationDate
info.ExpiryDate = imageMeta.ExpiryDate
info.Properties = imageMeta.Properties
}
// By default, make all downloaded images private
info.Public = false
_, err = imageBuildFromInfo(d, info)
if err != nil {
shared.Log.Error(
"Failed to create image",
log.Ctx{"image": fp, "err": err})
return err
}
shared.Log.Info(
"Download succeeded",
log.Ctx{"image": fp})
if forContainer {
return dbImageLastAccessInit(d.db, fp)
}
return nil
}
示例12: createFromImage
func createFromImage(d *Daemon, req *containerPostReq) Response {
var hash string
var err error
if req.Source.Fingerprint != "" {
hash = req.Source.Fingerprint
} else if req.Source.Alias != "" {
if req.Source.Server != "" {
hash = req.Source.Alias
} else {
_, alias, err := dbImageAliasGet(d.db, req.Source.Alias, true)
if err != nil {
return InternalError(err)
}
hash = alias.Target
}
} else if req.Source.Fingerprint != "" {
hash = req.Source.Fingerprint
} else if req.Source.Properties != nil {
if req.Source.Server != "" {
return BadRequest(fmt.Errorf("Property match is only supported for local images"))
}
hashes, err := dbImagesGet(d.db, false)
if err != nil {
return InternalError(err)
}
var image *shared.ImageInfo
for _, hash := range hashes {
_, img, err := dbImageGet(d.db, hash, false, true)
if err != nil {
continue
}
if image != nil && img.CreationDate.Before(image.CreationDate) {
continue
}
match := true
for key, value := range req.Source.Properties {
if img.Properties[key] != value {
match = false
break
}
}
if !match {
continue
}
image = img
}
if image == nil {
return BadRequest(fmt.Errorf("No matching image could be found"))
}
hash = image.Fingerprint
} else {
return BadRequest(fmt.Errorf("Must specify one of alias, fingerprint or properties for init from image"))
}
run := func(op *operation) error {
if req.Source.Server != "" {
hash, err = d.ImageDownload(
op, req.Source.Server, req.Source.Protocol, req.Source.Certificate, req.Source.Secret,
hash, true, daemonConfig["images.auto_update_cached"].GetBool())
if err != nil {
return err
}
}
_, imgInfo, err := dbImageGet(d.db, hash, false, false)
if err != nil {
return err
}
hash = imgInfo.Fingerprint
architecture, err := shared.ArchitectureId(imgInfo.Architecture)
if err != nil {
architecture = 0
}
args := containerArgs{
Architecture: architecture,
BaseImage: hash,
Config: req.Config,
Ctype: cTypeRegular,
Devices: req.Devices,
Ephemeral: req.Ephemeral,
Name: req.Name,
Profiles: req.Profiles,
}
_, err = containerCreateFromImage(d, args, hash)
return err
//.........这里部分代码省略.........
示例13: createFromMigration
func createFromMigration(d *Daemon, req *containerPostReq) Response {
if req.Source.Mode != "pull" && req.Source.Mode != "push" {
return NotImplemented
}
architecture, err := shared.ArchitectureId(req.Architecture)
if err != nil {
architecture = 0
}
args := containerArgs{
Architecture: architecture,
BaseImage: req.Source.BaseImage,
Config: req.Config,
Ctype: cTypeRegular,
Devices: req.Devices,
Ephemeral: req.Ephemeral,
Name: req.Name,
Profiles: req.Profiles,
}
var c container
_, _, err = dbImageGet(d.db, req.Source.BaseImage, false, true)
/* Only create a container from an image if we're going to
* rsync over the top of it. In the case of a better file
* transfer mechanism, let's just use that.
*
* TODO: we could invent some negotiation here, where if the
* source and sink both have the same image, we can clone from
* it, but we have to know before sending the snapshot that
* we're sending the whole thing or just a delta from the
* image, so one extra negotiation round trip is needed. An
* alternative is to move actual container object to a later
* point and just negotiate it over the migration control
* socket. Anyway, it'll happen later :)
*/
if err == nil && d.Storage.MigrationType() == MigrationFSType_RSYNC {
c, err = containerCreateFromImage(d, args, req.Source.BaseImage)
if err != nil {
return InternalError(err)
}
} else {
c, err = containerCreateAsEmpty(d, args)
if err != nil {
return InternalError(err)
}
}
var cert *x509.Certificate
if req.Source.Certificate != "" {
certBlock, _ := pem.Decode([]byte(req.Source.Certificate))
if certBlock == nil {
return InternalError(fmt.Errorf("Invalid certificate"))
}
cert, err = x509.ParseCertificate(certBlock.Bytes)
if err != nil {
return InternalError(err)
}
}
config, err := shared.GetTLSConfig("", "", "", cert)
if err != nil {
c.Delete()
return InternalError(err)
}
push := false
if req.Source.Mode == "push" {
push = true
}
migrationArgs := MigrationSinkArgs{
Url: req.Source.Operation,
Dialer: websocket.Dialer{
TLSClientConfig: config,
NetDial: shared.RFC3493Dialer},
Container: c,
Secrets: req.Source.Websockets,
Push: push,
Live: req.Source.Live,
}
sink, err := NewMigrationSink(&migrationArgs)
if err != nil {
c.Delete()
return InternalError(err)
}
run := func(op *operation) error {
// And finaly run the migration.
err = sink.Do(op)
if err != nil {
shared.LogError("Error during migration sink", log.Ctx{"err": err})
c.Delete()
return fmt.Errorf("Error transferring container data: %s", err)
}
err = c.TemplateApply("copy")
//.........这里部分代码省略.........
示例14: dbImageInsert
func dbImageInsert(db *sql.DB, fp string, fname string, sz int64, public bool, autoUpdate bool, architecture string, creationDate time.Time, expiryDate time.Time, properties map[string]string) error {
arch, err := shared.ArchitectureId(architecture)
if err != nil {
arch = 0
}
tx, err := dbBegin(db)
if err != nil {
return err
}
publicInt := 0
if public {
publicInt = 1
}
autoUpdateInt := 0
if autoUpdate {
autoUpdateInt = 1
}
stmt, err := tx.Prepare(`INSERT INTO images (fingerprint, filename, size, public, auto_update, architecture, creation_date, expiry_date, upload_date) VALUES (?, ?, ?, ?, ?, ?, ?, ?, strftime("%s"))`)
if err != nil {
tx.Rollback()
return err
}
defer stmt.Close()
result, err := stmt.Exec(fp, fname, sz, publicInt, autoUpdateInt, arch, creationDate, expiryDate)
if err != nil {
tx.Rollback()
return err
}
if len(properties) > 0 {
id64, err := result.LastInsertId()
if err != nil {
tx.Rollback()
return err
}
id := int(id64)
pstmt, err := tx.Prepare(`INSERT INTO images_properties (image_id, type, key, value) VALUES (?, 0, ?, ?)`)
if err != nil {
tx.Rollback()
return err
}
defer pstmt.Close()
for k, v := range properties {
// we can assume, that there is just one
// value per key
_, err = pstmt.Exec(id, k, v)
if err != nil {
tx.Rollback()
return err
}
}
}
if err := txCommit(tx); err != nil {
return err
}
return nil
}
示例15: Init
func (d *Daemon) Init() error {
/* Setup logging */
if shared.Log == nil {
shared.SetLogger("", "", true, true)
}
if !d.IsMock {
shared.Log.Info("LXD is starting",
log.Ctx{"path": shared.VarPath("")})
} else {
shared.Log.Info("Mock LXD is starting",
log.Ctx{"path": shared.VarPath("")})
}
/* Detect user namespaces */
runningInUserns = shared.RunningInUserNS()
/* Detect apparmor support */
if aaEnabled && os.Getenv("LXD_SECURITY_APPARMOR") == "false" {
aaEnabled = false
shared.Log.Warn("Per-container AppArmor profiles have been manually disabled")
}
if aaEnabled && !shared.IsDir("/sys/kernel/security/apparmor") {
aaEnabled = false
shared.Log.Warn("Per-container AppArmor profiles disabled because of lack of kernel support")
}
if aaEnabled && !haveMacAdmin() {
shared.Log.Warn("Per-container AppArmor profiles are disabled because mac_admin capability is missing.")
aaEnabled = false
}
_, err := exec.LookPath("apparmor_parser")
if aaEnabled && err != nil {
aaEnabled = false
shared.Log.Warn("Per-container AppArmor profiles disabled because 'apparmor_parser' couldn't be found")
}
if aaEnabled && runningInUserns {
aaEnabled = false
shared.Log.Warn("Per-container AppArmor profiles disabled because LXD is running inside a user namespace")
}
/* Get the list of supported architectures */
var architectures = []int{}
uname := syscall.Utsname{}
if err := syscall.Uname(&uname); err != nil {
return err
}
architectureName := ""
for _, c := range uname.Machine {
if c == 0 {
break
}
architectureName += string(byte(c))
}
architecture, err := shared.ArchitectureId(architectureName)
if err != nil {
return err
}
architectures = append(architectures, architecture)
personalities, err := shared.ArchitecturePersonalities(architecture)
if err != nil {
return err
}
for _, personality := range personalities {
architectures = append(architectures, personality)
}
d.architectures = architectures
/* Create required paths */
d.lxcpath = shared.VarPath("containers")
err = os.MkdirAll(d.lxcpath, 0755)
if err != nil {
return err
}
// Create default directories
if err := os.MkdirAll(shared.VarPath("images"), 0700); err != nil {
return err
}
if err := os.MkdirAll(shared.VarPath("snapshots"), 0700); err != nil {
return err
}
if err := os.MkdirAll(shared.VarPath("devlxd"), 0755); err != nil {
return err
}
/* Detect the filesystem */
d.BackingFs, err = filesystemDetect(d.lxcpath)
if err != nil {
shared.Log.Error("Error detecting backing fs", log.Ctx{"err": err})
}
/* Read the uid/gid allocation */
//.........这里部分代码省略.........