// SetPod writes a pod manifest into the consul key-value store. func (c consulStore) SetPod(podPrefix PodPrefix, nodename types.NodeName, manifest manifest.Manifest) (time.Duration, error) { buf := bytes.Buffer{} err := manifest.Write(&buf) if err != nil { return 0, err } key, err := podPath(podPrefix, nodename, manifest.ID()) if err != nil { return 0, err } keyPair := &api.KVPair{ Key: key, Value: buf.Bytes(), } writeMeta, err := c.client.KV().Put(keyPair, nil) var retDur time.Duration if writeMeta != nil { retDur = writeMeta.RequestTime } if err != nil { return retDur, consulutil.NewKVError("put", key, err) } return retDur, nil }
func (pod *Pod) WriteCurrentManifest(manifest manifest.Manifest) (string, error) { // write the old manifest to a temporary location in case a launch fails. tmpDir, err := ioutil.TempDir("", "manifests") if err != nil { return "", util.Errorf("could not create a tempdir to write old manifest: %s", err) } lastManifest := filepath.Join(tmpDir, "last_manifest.yaml") if _, err := os.Stat(pod.currentPodManifestPath()); err == nil { podManifestURL, err := url.Parse(pod.currentPodManifestPath()) if err != nil { return "", util.Errorf("Couldn't parse manifest path '%s' as URL: %s", pod.currentPodManifestPath(), err) } err = uri.URICopy(podManifestURL, lastManifest) if err != nil && !os.IsNotExist(err) { return "", err } } f, err := os.OpenFile(pod.currentPodManifestPath(), os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0644) if err != nil { pod.logError(err, "Unable to open current manifest file") err = pod.revertCurrentManifest(lastManifest) if err != nil { pod.logError(err, "Couldn't replace old manifest as current") } return "", err } defer f.Close() err = manifest.Write(f) if err != nil { pod.logError(err, "Unable to write current manifest file") err = pod.revertCurrentManifest(lastManifest) if err != nil { pod.logError(err, "Couldn't replace old manifest as current") } return "", err } uid, gid, err := user.IDs(manifest.RunAsUser()) if err != nil { pod.logError(err, "Unable to find pod UID/GID") // the write was still successful so we are not going to revert return "", err } err = f.Chown(uid, gid) if err != nil { pod.logError(err, "Unable to chown current manifest") return "", err } return lastManifest, nil }
func (h *HookDir) runHooks(dirpath string, hType HookType, pod Pod, podManifest manifest.Manifest, logger logging.Logger) error { configFileName, err := podManifest.ConfigFileName() if err != nil { return err } // Write manifest to a file so hooks can read it. tmpManifestFile, err := ioutil.TempFile("", fmt.Sprintf("%s-manifest.yaml", podManifest.ID())) if err != nil { logger.WithErrorAndFields(err, logrus.Fields{ "dir": dirpath, }).Warnln("Unable to open manifest file for hooks") return err } defer os.Remove(tmpManifestFile.Name()) err = podManifest.Write(tmpManifestFile) if err != nil { logger.WithErrorAndFields(err, logrus.Fields{ "dir": dirpath, }).Warnln("Unable to write manifest file for hooks") return err } hookEnvironment := []string{ fmt.Sprintf("%s=%s", HOOK_ENV_VAR, path.Base(dirpath)), fmt.Sprintf("%s=%s", HOOK_EVENT_ENV_VAR, hType.String()), fmt.Sprintf("%s=%s", HOOKED_NODE_ENV_VAR, pod.Node()), fmt.Sprintf("%s=%s", HOOKED_POD_ID_ENV_VAR, podManifest.ID()), fmt.Sprintf("%s=%s", HOOKED_POD_HOME_ENV_VAR, pod.Home()), fmt.Sprintf("%s=%s", HOOKED_POD_MANIFEST_ENV_VAR, tmpManifestFile.Name()), fmt.Sprintf("%s=%s", HOOKED_CONFIG_PATH_ENV_VAR, path.Join(pod.ConfigDir(), configFileName)), fmt.Sprintf("%s=%s", HOOKED_ENV_PATH_ENV_VAR, pod.EnvDir()), fmt.Sprintf("%s=%s", HOOKED_CONFIG_DIR_PATH_ENV_VAR, pod.ConfigDir()), fmt.Sprintf("%s=%s", HOOKED_SYSTEM_POD_ROOT_ENV_VAR, h.podRoot), } return runDirectory(dirpath, hookEnvironment, logger) }
func writeManifest(workingDir string, manifest manifest.Manifest) (string, error) { file, err := os.OpenFile( path.Join(workingDir, fmt.Sprintf("%s.yaml", podID())), os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0644, ) if err != nil { return "", err } defer file.Close() err = manifest.Write(file) if err != nil { return "", err } return file.Name(), nil }