本文整理汇总了Golang中github.com/lxc/lxd/shared.LogError函数的典型用法代码示例。如果您正苦于以下问题:Golang LogError函数的具体用法?Golang LogError怎么用?Golang LogError使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了LogError函数的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的Golang代码示例。
示例1: send
func (s *btrfsMigrationSourceDriver) send(conn *websocket.Conn, btrfsPath string, btrfsParent string) error {
args := []string{"send", btrfsPath}
if btrfsParent != "" {
args = append(args, "-p", btrfsParent)
}
cmd := exec.Command("btrfs", args...)
stdout, err := cmd.StdoutPipe()
if err != nil {
return err
}
stderr, err := cmd.StderrPipe()
if err != nil {
return err
}
if err := cmd.Start(); err != nil {
return err
}
<-shared.WebsocketSendStream(conn, stdout, 4*1024*1024)
output, err := ioutil.ReadAll(stderr)
if err != nil {
shared.LogError("problem reading btrfs send stderr", log.Ctx{"err": err})
}
err = cmd.Wait()
if err != nil {
shared.LogError("problem with btrfs send", log.Ctx{"output": string(output)})
}
return err
}
开发者ID:vahe,项目名称:lxd,代码行数:35,代码来源:storage_btrfs.go
示例2: containerDeleteSnapshots
func containerDeleteSnapshots(d *Daemon, cname string) error {
shared.LogDebug("containerDeleteSnapshots",
log.Ctx{"container": cname})
results, err := dbContainerGetSnapshots(d.db, cname)
if err != nil {
return err
}
for _, sname := range results {
sc, err := containerLoadByName(d, sname)
if err != nil {
shared.LogError(
"containerDeleteSnapshots: Failed to load the snapshotcontainer",
log.Ctx{"container": cname, "snapshot": sname})
continue
}
if err := sc.Delete(); err != nil {
shared.LogError(
"containerDeleteSnapshots: Failed to delete a snapshotcontainer",
log.Ctx{"container": cname, "snapshot": sname, "err": err})
}
}
return nil
}
开发者ID:vahe,项目名称:lxd,代码行数:28,代码来源:containers.go
示例3: deviceUSBEvent
func deviceUSBEvent(d *Daemon, usb usbDevice) {
containers, err := dbContainersList(d.db, cTypeRegular)
if err != nil {
shared.LogError("problem loading containers list", log.Ctx{"err": err})
return
}
for _, name := range containers {
containerIf, err := containerLoadByName(d, name)
if err != nil {
continue
}
c, ok := containerIf.(*containerLXC)
if !ok {
shared.LogErrorf("got device event on non-LXC container?")
return
}
if !c.IsRunning() {
continue
}
devices := c.ExpandedDevices()
for _, name := range devices.DeviceNames() {
m := devices[name]
if m["type"] != "usb" {
continue
}
if m["vendorid"] != usb.vendor || (m["productid"] != "" && m["productid"] != usb.product) {
continue
}
if usb.action == "add" {
err := c.insertUnixDeviceNum(m, usb.major, usb.minor, usb.path)
if err != nil {
shared.LogError("failed to create usb device", log.Ctx{"err": err, "usb": usb, "container": c.Name()})
return
}
} else if usb.action == "remove" {
err := c.removeUnixDeviceNum(m, usb.major, usb.minor, usb.path)
if err != nil {
shared.LogError("failed to remove usb device", log.Ctx{"err": err, "usb": usb, "container": c.Name()})
return
}
} else {
shared.LogError("unknown action for usb device", log.Ctx{"usb": usb})
continue
}
}
}
}
开发者ID:vahe,项目名称:lxd,代码行数:53,代码来源:devices.go
示例4: profilesGet
func profilesGet(d *Daemon, r *http.Request) Response {
results, err := dbProfiles(d.db)
if err != nil {
return SmartError(err)
}
recursion := d.isRecursionRequest(r)
resultString := make([]string, len(results))
resultMap := make([]*shared.ProfileConfig, len(results))
i := 0
for _, name := range results {
if !recursion {
url := fmt.Sprintf("/%s/profiles/%s", shared.APIVersion, name)
resultString[i] = url
} else {
profile, err := doProfileGet(d, name)
if err != nil {
shared.LogError("Failed to get profile", log.Ctx{"profile": name})
continue
}
resultMap[i] = profile
}
i++
}
if !recursion {
return SyncResponse(true, resultString)
}
return SyncResponse(true, resultMap)
}
开发者ID:vahe,项目名称:lxd,代码行数:32,代码来源:profiles.go
示例5: doDeleteImage
func doDeleteImage(d *Daemon, fingerprint string) error {
id, imgInfo, err := dbImageGet(d.db, fingerprint, false, false)
if err != nil {
return err
}
// get storage before deleting images/$fp because we need to
// look at the path
s, err := storageForImage(d, imgInfo)
if err != nil {
shared.LogError("error detecting image storage backend", log.Ctx{"fingerprint": imgInfo.Fingerprint, "err": err})
} else {
// Remove the image from storage backend
if err = s.ImageDelete(imgInfo.Fingerprint); err != nil {
shared.LogError("error deleting the image from storage backend", log.Ctx{"fingerprint": imgInfo.Fingerprint, "err": err})
}
}
// Remove main image file
fname := shared.VarPath("images", imgInfo.Fingerprint)
if shared.PathExists(fname) {
err = os.Remove(fname)
if err != nil {
shared.LogDebugf("Error deleting image file %s: %s", fname, err)
}
}
// Remove the rootfs file
fname = shared.VarPath("images", imgInfo.Fingerprint) + ".rootfs"
if shared.PathExists(fname) {
err = os.Remove(fname)
if err != nil {
shared.LogDebugf("Error deleting image file %s: %s", fname, err)
}
}
// Remove the DB entry
if err = dbImageDelete(d.db, id); err != nil {
return err
}
return nil
}
开发者ID:vahe,项目名称:lxd,代码行数:43,代码来源:images.go
示例6: send
func (s *zfsMigrationSourceDriver) send(conn *websocket.Conn, zfsName string, zfsParent string, readWrapper func(io.ReadCloser) io.ReadCloser) error {
fields := strings.SplitN(s.container.Name(), shared.SnapshotDelimiter, 2)
args := []string{"send", fmt.Sprintf("%s/containers/%[email protected]%s", s.zfs.zfsPool, fields[0], zfsName)}
if zfsParent != "" {
args = append(args, "-i", fmt.Sprintf("%s/containers/%[email protected]%s", s.zfs.zfsPool, s.container.Name(), zfsParent))
}
cmd := exec.Command("zfs", args...)
stdout, err := cmd.StdoutPipe()
if err != nil {
return err
}
readPipe := io.ReadCloser(stdout)
if readWrapper != nil {
readPipe = readWrapper(stdout)
}
stderr, err := cmd.StderrPipe()
if err != nil {
return err
}
if err := cmd.Start(); err != nil {
return err
}
<-shared.WebsocketSendStream(conn, readPipe, 4*1024*1024)
output, err := ioutil.ReadAll(stderr)
if err != nil {
shared.LogError("problem reading zfs send stderr", log.Ctx{"err": err})
}
err = cmd.Wait()
if err != nil {
shared.LogError("problem with zfs send", log.Ctx{"output": string(output)})
}
return err
}
开发者ID:akshaykarle,项目名称:lxd,代码行数:42,代码来源:storage_zfs.go
示例7: pruneExpiredImages
func pruneExpiredImages(d *Daemon) {
shared.LogInfof("Pruning expired images")
// Get the list of expires images
expiry := daemonConfig["images.remote_cache_expiry"].GetInt64()
images, err := dbImagesGetExpired(d.db, expiry)
if err != nil {
shared.LogError("Unable to retrieve the list of expired images", log.Ctx{"err": err})
return
}
// Delete them
for _, fp := range images {
if err := doDeleteImage(d, fp); err != nil {
shared.LogError("Error deleting image", log.Ctx{"err": err, "fp": fp})
}
}
shared.LogInfof("Done pruning expired images")
}
开发者ID:vahe,项目名称:lxd,代码行数:20,代码来源:images.go
示例8: daemonConfigInit
func daemonConfigInit(db *sql.DB) error {
// Set all the keys
daemonConfig = map[string]*daemonConfigKey{
"core.https_address": &daemonConfigKey{valueType: "string", setter: daemonConfigSetAddress},
"core.https_allowed_headers": &daemonConfigKey{valueType: "string"},
"core.https_allowed_methods": &daemonConfigKey{valueType: "string"},
"core.https_allowed_origin": &daemonConfigKey{valueType: "string"},
"core.https_allowed_credentials": &daemonConfigKey{valueType: "bool"},
"core.proxy_http": &daemonConfigKey{valueType: "string", setter: daemonConfigSetProxy},
"core.proxy_https": &daemonConfigKey{valueType: "string", setter: daemonConfigSetProxy},
"core.proxy_ignore_hosts": &daemonConfigKey{valueType: "string", setter: daemonConfigSetProxy},
"core.trust_password": &daemonConfigKey{valueType: "string", hiddenValue: true, setter: daemonConfigSetPassword},
"images.auto_update_cached": &daemonConfigKey{valueType: "bool", defaultValue: "true"},
"images.auto_update_interval": &daemonConfigKey{valueType: "int", defaultValue: "6"},
"images.compression_algorithm": &daemonConfigKey{valueType: "string", validator: daemonConfigValidateCompression, defaultValue: "gzip"},
"images.remote_cache_expiry": &daemonConfigKey{valueType: "int", defaultValue: "10", trigger: daemonConfigTriggerExpiry},
"storage.lvm_fstype": &daemonConfigKey{valueType: "string", defaultValue: "ext4", validValues: []string{"ext4", "xfs"}},
"storage.lvm_mount_options": &daemonConfigKey{valueType: "string", defaultValue: "discard"},
"storage.lvm_thinpool_name": &daemonConfigKey{valueType: "string", defaultValue: "LXDPool", validator: storageLVMValidateThinPoolName},
"storage.lvm_vg_name": &daemonConfigKey{valueType: "string", validator: storageLVMValidateVolumeGroupName, setter: daemonConfigSetStorage},
"storage.lvm_volume_size": &daemonConfigKey{valueType: "string", defaultValue: "10GiB"},
"storage.zfs_pool_name": &daemonConfigKey{valueType: "string", validator: storageZFSValidatePoolName, setter: daemonConfigSetStorage},
"storage.zfs_remove_snapshots": &daemonConfigKey{valueType: "bool"},
"storage.zfs_use_refquota": &daemonConfigKey{valueType: "bool"},
}
// Load the values from the DB
dbValues, err := dbConfigValuesGet(db)
if err != nil {
return err
}
daemonConfigLock.Lock()
for k, v := range dbValues {
_, ok := daemonConfig[k]
if !ok {
shared.LogError("Found invalid configuration key in database", log.Ctx{"key": k})
}
daemonConfig[k].currentValue = v
}
daemonConfigLock.Unlock()
return nil
}
开发者ID:vahe,项目名称:lxd,代码行数:47,代码来源:daemon_config.go
示例9: getRunningContainersWithProfile
func getRunningContainersWithProfile(d *Daemon, profile string) []container {
results := []container{}
output, err := dbProfileContainersGet(d.db, profile)
if err != nil {
return results
}
for _, name := range output {
c, err := containerLoadByName(d, name)
if err != nil {
shared.LogError("Failed opening container", log.Ctx{"container": name})
continue
}
results = append(results, c)
}
return results
}
开发者ID:vahe,项目名称:lxd,代码行数:18,代码来源:profiles.go
示例10: containerSnapRestore
func containerSnapRestore(d *Daemon, name string, snap string) error {
// normalize snapshot name
if !shared.IsSnapshot(snap) {
snap = name + shared.SnapshotDelimiter + snap
}
shared.LogInfo(
"RESTORE => Restoring snapshot",
log.Ctx{
"snapshot": snap,
"container": name})
c, err := containerLoadByName(d, name)
if err != nil {
shared.LogError(
"RESTORE => loadcontainerLXD() failed",
log.Ctx{
"container": name,
"err": err})
return err
}
source, err := containerLoadByName(d, snap)
if err != nil {
switch err {
case sql.ErrNoRows:
return fmt.Errorf("snapshot %s does not exist", snap)
default:
return err
}
}
if err := c.Restore(source); err != nil {
return err
}
return nil
}
开发者ID:vahe,项目名称:lxd,代码行数:38,代码来源:container_put.go
示例11: networkStartup
func networkStartup(d *Daemon) error {
// Get a list of managed networks
networks, err := dbNetworks(d.db)
if err != nil {
return err
}
// Bring them all up
for _, name := range networks {
n, err := networkLoadByName(d, name)
if err != nil {
return err
}
err = n.Start()
if err != nil {
// Don't cause LXD to fail to start entirely on network bring up failure
shared.LogError("Failed to bring up network", log.Ctx{"err": err, "name": name})
}
}
return nil
}
开发者ID:vahe,项目名称:lxd,代码行数:23,代码来源:networks.go
示例12: MigrationSink
func (s *storageBtrfs) MigrationSink(live bool, container container, snapshots []*Snapshot, conn *websocket.Conn, srcIdmap *shared.IdmapSet) error {
if runningInUserns {
return rsyncMigrationSink(live, container, snapshots, conn, srcIdmap)
}
cName := container.Name()
snapshotsPath := shared.VarPath(fmt.Sprintf("snapshots/%s", cName))
if !shared.PathExists(snapshotsPath) {
err := os.MkdirAll(shared.VarPath(fmt.Sprintf("snapshots/%s", cName)), 0700)
if err != nil {
return err
}
}
btrfsRecv := func(btrfsPath string, targetPath string, isSnapshot bool) error {
args := []string{"receive", "-e", btrfsPath}
cmd := exec.Command("btrfs", args...)
// Remove the existing pre-created subvolume
err := s.subvolsDelete(targetPath)
if err != nil {
return err
}
stdin, err := cmd.StdinPipe()
if err != nil {
return err
}
stderr, err := cmd.StderrPipe()
if err != nil {
return err
}
if err := cmd.Start(); err != nil {
return err
}
<-shared.WebsocketRecvStream(stdin, conn)
output, err := ioutil.ReadAll(stderr)
if err != nil {
shared.LogDebugf("problem reading btrfs receive stderr %s", err)
}
err = cmd.Wait()
if err != nil {
shared.LogError("problem with btrfs receive", log.Ctx{"output": string(output)})
return err
}
if !isSnapshot {
cPath := containerPath(fmt.Sprintf("%s/.root", cName), true)
err := s.subvolSnapshot(cPath, targetPath, false)
if err != nil {
shared.LogError("problem with btrfs snapshot", log.Ctx{"err": err})
return err
}
err = s.subvolsDelete(cPath)
if err != nil {
shared.LogError("problem with btrfs delete", log.Ctx{"err": err})
return err
}
}
return nil
}
for _, snap := range snapshots {
args := snapshotProtobufToContainerArgs(container.Name(), snap)
s, err := containerCreateEmptySnapshot(container.Daemon(), args)
if err != nil {
return err
}
if err := btrfsRecv(containerPath(cName, true), s.Path(), true); err != nil {
return err
}
}
/* finally, do the real container */
if err := btrfsRecv(containerPath(cName, true), container.Path(), false); err != nil {
return err
}
if live {
if err := btrfsRecv(containerPath(cName, true), container.Path(), false); err != nil {
return err
}
}
// Cleanup
if ok, _ := shared.PathIsEmpty(snapshotsPath); ok {
err := os.Remove(snapshotsPath)
if err != nil {
return err
}
//.........这里部分代码省略.........
开发者ID:vahe,项目名称:lxd,代码行数:101,代码来源:storage_btrfs.go
示例13: Init
//.........这里部分代码省略.........
/* Make sure all our directories are available */
if err := os.MkdirAll(shared.CachePath(), 0700); err != nil {
return err
}
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
}
if err := os.MkdirAll(shared.VarPath("security"), 0700); err != nil {
return err
}
if err := os.MkdirAll(shared.VarPath("shmounts"), 0711); err != nil {
return err
}
if err := os.MkdirAll(shared.VarPath("snapshots"), 0700); err != nil {
return err
}
/* Detect the filesystem */
d.BackingFs, err = filesystemDetect(d.lxcpath)
if err != nil {
shared.LogError("Error detecting backing fs", log.Ctx{"err": err})
}
/* Read the uid/gid allocation */
d.IdmapSet, err = shared.DefaultIdmapSet()
if err != nil {
shared.LogWarn("Error reading idmap", log.Ctx{"err": err.Error()})
shared.LogWarnf("Only privileged containers will be able to run")
} else {
shared.LogInfof("Default uid/gid map:")
for _, lxcmap := range d.IdmapSet.ToLxcString() {
shared.LogInfof(strings.TrimRight(" - "+lxcmap, "\n"))
}
}
/* Initialize the database */
err = initializeDbObject(d, shared.VarPath("lxd.db"))
if err != nil {
return err
}
/* Load all config values from the database */
err = daemonConfigInit(d.db)
if err != nil {
return err
}
if !d.MockMode {
/* Setup the storage driver */
err = d.SetupStorageDriver()
if err != nil {
return fmt.Errorf("Failed to setup storage: %s", err)
}
开发者ID:akshaykarle,项目名称:lxd,代码行数:67,代码来源:daemon.go
示例14: deviceTaskBalance
func deviceTaskBalance(d *Daemon) {
min := func(x, y int) int {
if x < y {
return x
}
return y
}
// Don't bother running when CGroup support isn't there
if !cgCpusetController {
return
}
// Get effective cpus list - those are all guaranteed to be online
effectiveCpus, err := cGroupGet("cpuset", "/", "cpuset.effective_cpus")
if err != nil {
// Older kernel - use cpuset.cpus
effectiveCpus, err = cGroupGet("cpuset", "/", "cpuset.cpus")
if err != nil {
shared.LogErrorf("Error reading host's cpuset.cpus")
return
}
}
err = cGroupSet("cpuset", "/lxc", "cpuset.cpus", effectiveCpus)
if err != nil && shared.PathExists("/sys/fs/cgroup/cpuset/lxc") {
shared.LogWarn("Error setting lxd's cpuset.cpus", log.Ctx{"err": err})
}
cpus, err := parseCpuset(effectiveCpus)
if err != nil {
shared.LogError("Error parsing host's cpu set", log.Ctx{"cpuset": effectiveCpus, "err": err})
return
}
// Iterate through the containers
containers, err := dbContainersList(d.db, cTypeRegular)
if err != nil {
shared.LogError("problem loading containers list", log.Ctx{"err": err})
return
}
fixedContainers := map[int][]container{}
balancedContainers := map[container]int{}
for _, name := range containers {
c, err := containerLoadByName(d, name)
if err != nil {
continue
}
conf := c.ExpandedConfig()
cpulimit, ok := conf["limits.cpu"]
if !ok || cpulimit == "" {
cpulimit = effectiveCpus
}
if !c.IsRunning() {
continue
}
count, err := strconv.Atoi(cpulimit)
if err == nil {
// Load-balance
count = min(count, len(cpus))
balancedContainers[c] = count
} else {
// Pinned
containerCpus, err := parseCpuset(cpulimit)
if err != nil {
return
}
for _, nr := range containerCpus {
if !shared.IntInSlice(nr, cpus) {
continue
}
_, ok := fixedContainers[nr]
if ok {
fixedContainers[nr] = append(fixedContainers[nr], c)
} else {
fixedContainers[nr] = []container{c}
}
}
}
}
// Balance things
pinning := map[container][]string{}
usage := map[int]deviceTaskCPU{}
for _, id := range cpus {
cpu := deviceTaskCPU{}
cpu.id = id
cpu.strId = fmt.Sprintf("%d", id)
count := 0
cpu.count = &count
usage[id] = cpu
}
for cpu, ctns := range fixedContainers {
c, ok := usage[cpu]
if !ok {
//.........这里部分代码省略.........
开发者ID:vahe,项目名称:lxd,代码行数:101,代码来源:devices.go
示例15: ImageDownload
//.........这里部分代码省略.........
}
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})
// already have it
return fp, nil
}
// 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.LogDebug(
"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.LogWarnf("Value transmitted over image lock semaphore?")
}
if _, _, err := dbImageGet(d.db, fp, false, true); err != nil {
shared.LogError(
"Previous download didn't succeed",
log.Ctx{"image": fp})
return "", fmt.Errorf("Previous download didn't succeed")
}
shared.LogDebug(
"Previous download succeeded",
log.Ctx{"image": fp})
return fp, nil
}
d.imagesDownloadingLock.RUnlock()
if op == nil {
ctxMap = log.Ctx{"alias": alias, "server": server}
} else {
ctxMap = log.Ctx{"trigger": op.url, "image": fp, "operation": op.id, "alias": alias, "server": server}
}
shared.LogInfo("Downloading image", ctxMap)
// 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 {
开发者ID:akshaykarle,项目名称:lxd,代码行数:67,代码来源:daemon_images.go
示例16: dbUpdateFromV11
func dbUpdateFromV11(currentVersion int, version int, d *Daemon) error {
if d.MockMode {
// No need to move snapshots no mock runs,
// dbUpdateFromV12 will then set the db version to 13
return nil
}
cNames, err := dbContainersList(d.db, cTypeSnapshot)
if err != nil {
return err
}
errors := 0
for _, cName := range cNames {
snappieces := strings.SplitN(cName, shared.SnapshotDelimiter, 2)
oldPath := shared.VarPath("containers", snappieces[0], "snapshots", snappieces[1])
newPath := shared.VarPath("snapshots", snappieces[0], snappieces[1])
if shared.PathExists(oldPath) && !shared.PathExists(newPath) {
shared.LogInfo(
"Moving snapshot",
log.Ctx{
"snapshot": cName,
"oldPath": oldPath,
"newPath": newPath})
// Rsync
// containers/<container>/snapshots/<snap0>
// to
// snapshots/<container>/<snap0>
output, err := storageRsyncCopy(oldPath, newPath)
if err != nil {
shared.LogError(
"Failed rsync snapshot",
log.Ctx{
"snapshot": cName,
"output": string(output),
"err": err})
errors++
continue
}
// Remove containers/<container>/snapshots/<snap0>
if err := os.RemoveAll(oldPath); err != nil {
shared.LogError(
"Failed to remove the old snapshot path",
log.Ctx{
"snapshot": cName,
"oldPath": oldPath,
"err": err})
// Ignore this error.
// errors++
// continue
}
// Remove /var/lib/lxd/containers/<container>/snapshots
// if its empty.
cPathParent := filepath.Dir(oldPath)
if ok, _ := shared.PathIsEmpty(cPathParent); ok {
os.Remove(cPathParent)
}
} // if shared.PathExists(oldPath) && !shared.PathExists(newPath) {
} // for _, cName := range cNames {
// Refuse to start lxd if a rsync failed.
if errors > 0 {
return fmt.Errorf("Got errors while moving snapshots, see the log output.")
}
return nil
}
开发者ID:vahe,项目名称:lxd,代码行数:73,代码来源:db_update.go
示例17: containerExecPost
//.........这里部分代码省略.........
if !ok {
env["PATH"] = "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
if shared.PathExists(fmt.Sprintf("%s/snap/bin", c.RootfsPath())) {
env["PATH"] = fmt.Sprintf("%s:/snap/bin", env["PATH"])
}
}
if post.WaitForWS {
ws := &execWs{}
ws.fds = map[int]string{}
idmapset := c.IdmapSet()
if idmapset != nil {
ws.rootUid, ws.rootGid = idmapset.ShiftIntoNs(0, 0)
}
ws.conns = map[int]*websocket.Conn{}
ws.conns[-1] = nil
ws.conns[0] = nil
if !post.Interactive {
ws.conns[1] = nil
ws.conns[2] = nil
}
ws.allConnected = make(chan bool, 1)
ws.controlConnected = make(chan bool, 1)
ws.interactive = post.Interactive
for i := -1; i < len(ws.conns)-1; i++ {
ws.fds[i], err = shared.RandomCryptoString()
if err != nil {
return InternalError(err)
}
}
ws.command = post.Command
ws.container = c
ws.env = env
ws.width = post.Width
ws.height = post.Height
resources := map[string][]string{}
resources["containers"] = []string{ws.container.Name()}
op, err := operationCreate(operationClassWebsocket, resources, ws.Metadata(), ws.Do, nil, ws.Connect)
if err != nil {
return InternalError(err)
}
return OperationResponse(op)
}
run := func(op *operation) error {
var cmdErr error
var cmdResult int
metadata := shared.Jmap{}
if post.RecordOutput {
// Prepare stdout and stderr recording
stdout, err := os.OpenFile(filepath.Join(c.LogPath(), fmt.Sprintf("exec_%s.stdout", op.id)), os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666)
if err != nil {
return err
}
defer stdout.Close()
stderr, err := os.OpenFile(filepath.Join(c.LogPath(), fmt.Sprintf("exec_%s.stderr", op.id)), os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666)
if err != nil {
return err
}
defer stderr.Close()
// Run the command
cmdResult, cmdErr = c.Exec(post.Command, env, nil, stdout, stderr)
// Update metadata with the right URLs
metadata["return"] = cmdResult
metadata["output"] = shared.Jmap{
"1": fmt.Sprintf("/%s/containers/%s/logs/%s", shared.APIVersion, c.Name(), filepath.Base(stdout.Name())),
"2": fmt.Sprintf("/%s/containers/%s/logs/%s", shared.APIVersion, c.Name(), filepath.Base(stderr.Name())),
}
} else {
cmdResult, cmdErr = c.Exec(post.Command, env, nil, nil, nil)
metadata["return"] = cmdResult
}
err = op.UpdateMetadata(metadata)
if err != nil {
shared.LogError("error updating metadata for cmd", log.Ctx{"err": err, "cmd": post.Command})
}
return cmdErr
}
resources := map[string][]string{}
resources["containers"] = []string{name}
op, err := operationCreate(operationClassTask, resources, nil, run, nil, nil)
if err != nil {
return InternalError(err)
}
return OperationResponse(op)
}
开发者ID:vahe,项目名称:lxd,代码行数:101,代码来源:container_exec.go
示例18: 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")
//.........这里部分代码省略.........
开发者ID:vahe,项目名称:lxd,代码行数:101,代码来源:containers_post.go
示例19: deviceNetlinkListener
//.........这里部分代码省略.........
continue
}
props[fields[0]] = fields[1]
}
}
if props["SUBSYSTEM"] == "cpu" {
if props["DRIVER"] != "processor" {
continue
}
if props["ACTION"] != "offline" && props["ACTION"] != "online" {
continue
}
// As CPU re-balancing affects all containers, no need to queue them
select {
case chCPU <- []string{path.Base(props["DEVPATH"]), props["ACTION"]}:
default:
// Channel is full, drop the event
}
}
if props["SUBSYSTEM"] == "net" {
if props["ACTION"] != "add" && props["ACTION"] != "removed" {
continue
}
if !shared.PathExists(fmt.Sprintf("/sys/class/net/%s", props["INTERFACE"])) {
continue
}
// Network balancing is interface specific, so queue everything
chNetwork <- []string{props["INTERFACE"], props["ACTION"]}
}
if props["SUBSYSTEM"] == "usb" {
if props["ACTION"] != "add" && props["ACTION"] != "remove" {
continue
}
parts := strings.Split(props["PRODUCT"], "/")
if len(parts) < 2 {
continue
}
major, ok := props["MAJOR"]
if !ok {
continue
}
minor, ok := props["MINOR"]
if !ok {
continue
}
devname, ok := props["DEVNAME"]
busnum, ok := props["BUSNUM"]
if !ok {
continue
}
devnum, ok := props["DEVNUM"]
if !ok {
continue
}
zeroPad := func(s string, l int) string {
return strings.Repeat("0", l-len(s)) + s
}
usb, err := createUSBDevice(
props["ACTION"],
/* udev doesn't zero pad these, while
* everything else does, so let's zero pad them
* for consistency
*/
zeroPad(parts[0], 4),
zeroPad(parts[1], 4),
major,
minor,
busnum,
devnum,
devname,
)
if err != nil {
shared.LogError("error reading usb device", log.Ctx{"err": err, "path": props["PHYSDEVPATH"]})
continue
}
chUSB <- usb
}
}
}(chCPU, chNetwork, chUSB)
return chCPU, chNetwork, chUSB, nil
}
开发者ID:vahe,项目名称:lxd,代码行数:101,代码来源:devices.go
示例20: MigrationSink
func (s *storageZfs) MigrationSink(live bool, container container, snapshots []*Snapshot, conn *websocket.Conn, srcIdmap *shared.IdmapSet, op *operation) error {
zfsRecv := func(zfsName string, writeWrapper func(io.WriteCloser) io.WriteCloser) error {
zfsFsName := fmt.Sprintf("%s/%s", s.zfsPool, zfsName)
args := []string{"receive", "-F", "-u", zfsFsName}
cmd := exec.Command("zfs", args...)
stdin, err := cmd.StdinPipe()
if err != nil {
return err
}
stderr, err := cmd.StderrPipe()
if err != nil {
return err
}
if err := cmd.Start(); err != nil {
return err
}
writePipe := io.WriteCloser(stdin)
if writeWrapper != nil {
writePipe = writeWrapper(stdin)
}
<-shared.WebsocketRecvStream(writePipe, conn)
output, err := ioutil.ReadAll(stderr)
if err != nil {
shared.LogDebug("problem reading zfs recv stderr %s", log.Ctx{"err": err})
}
err = cmd.Wait()
if err != nil {
shared.LogError("problem with zfs recv", log.Ctx{"output": string(output)})
}
return err
}
/* In some versions of zfs we can write `zfs recv -F` to mounted
* filesystems, and in some versions we can't. So, let's always unmount
* this fs (it's empty anyway) before we zfs recv. N.B. that `zfs recv`
* of a snapshot also needs tha actual fs that it has snapshotted
* unmounted, so we do this before receiving anything.
*/
zfsName := fmt.Sprintf("containers/%s", container.Name())
err := s.zfsUnmount(zfsName)
if err != nil {
return err
}
for _, snap := range snapshots {
args := snapshotProtobufToContainerArgs(container.Name(), snap)
_, err := containerCreateEmptySnapshot(container.Daemon(), args)
if err != nil {
return err
}
wrapper := StorageProgressWriter(op, "fs_progress", snap.GetName())
name := fmt.Sprintf("containers/%[email protected]%s", container.Name(), snap.GetName())
if err := zfsRecv(name, wrapper); err != nil {
return err
}
err = os.MkdirAll(shared.VarPath(fmt.Sprintf("snapshots/%s", container.Name())), 0700)
if err != nil {
return err
}
err = os.Symlink("on-zfs", shared.VarPath(fmt.Sprintf("snapshots/%s/%s.zfs", container.Name(), snap.GetName())))
if err != nil {
return err
}
}
defer func() {
/* clean up our migration-send snapshots that we got from recv. */
zfsSnapshots, err := s.zfsListSnapshots(fmt.Sprintf("containers/%s", container.Name()))
if err != nil {
shared.LogError("failed listing snapshots post migration", log.Ctx{"err": err})
return
}
for _, snap := range zfsSnapshots {
// If we received a bunch of snapshots, remove the migration-send-* ones, if not, wipe any snapshot we got
if snapshots != nil && len(snapshots) > 0 && !strings.HasPrefix(snap, "migration-send") {
continue
}
s.zfsSnapshotDestroy(fmt.Sprintf("containers/%s", container.Name()), snap)
}
}()
/* finally, do the real container */
wrapper := StorageProgressWriter(op, "fs_progress", container.Name())
if err := zfsRecv(zfsName, wrapper); err != nil {
return err
}
if live {
//.........这里部分代码省略.........
开发者ID:akshaykarle,项目名称:lxd,代码行数:101,代码来源:storage_zfs.go
注:本文中的github.com/lxc/lxd/shared.LogError函数示例整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论