func (b *secretVolumeBuilder) SetUpAt(dir string) error { notMnt, err := b.mounter.IsLikelyNotMountPoint(dir) // Getting an os.IsNotExist err from is a contingency; the directory // may not exist yet, in which case, setup should run. if err != nil && !os.IsNotExist(err) { return err } // If the plugin readiness file is present for this volume and // the setup dir is a mountpoint, this volume is already ready. if volumeutil.IsReady(b.getMetaDir()) && !notMnt { return nil } glog.V(3).Infof("Setting up volume %v for pod %v at %v", b.volName, b.pod.UID, dir) // Wrap EmptyDir, let it do the setup. wrapped, err := b.plugin.host.NewWrapperBuilder(wrappedVolumeSpec, &b.pod, *b.opts) if err != nil { return err } if err := wrapped.SetUpAt(dir); err != nil { return err } kubeClient := b.plugin.host.GetKubeClient() if kubeClient == nil { return fmt.Errorf("Cannot setup secret volume %v because kube client is not configured", b.volName) } secret, err := kubeClient.Secrets(b.pod.Namespace).Get(b.secretName) if err != nil { glog.Errorf("Couldn't get secret %v/%v", b.pod.Namespace, b.secretName) return err } else { totalBytes := totalSecretBytes(secret) glog.V(3).Infof("Received secret %v/%v containing (%v) pieces of data, %v total bytes", b.pod.Namespace, b.secretName, len(secret.Data), totalBytes) } for name, data := range secret.Data { hostFilePath := path.Join(dir, name) glog.V(3).Infof("Writing secret data %v/%v/%v (%v bytes) to host file %v", b.pod.Namespace, b.secretName, name, len(data), hostFilePath) err := b.writer.WriteFile(hostFilePath, data, 0444) if err != nil { glog.Errorf("Error writing secret data to host path: %v, %v", hostFilePath, err) return err } } volumeutil.SetReady(b.getMetaDir()) return nil }
// SetUpAt creates new directory and clones a git repo. func (b *gitRepoVolumeBuilder) SetUpAt(dir string) error { if volumeutil.IsReady(b.getMetaDir()) { return nil } // Wrap EmptyDir, let it do the setup. wrapped, err := b.plugin.host.NewWrapperBuilder(wrappedVolumeSpec, &b.pod, b.opts) if err != nil { return err } if err := wrapped.SetUpAt(dir); err != nil { return err } if output, err := b.execCommand("git", []string{"clone", b.source}, dir); err != nil { return fmt.Errorf("failed to exec 'git clone %s': %s: %v", b.source, output, err) } files, err := ioutil.ReadDir(dir) if err != nil { return err } if len(files) != 1 { return fmt.Errorf("unexpected directory contents: %v", files) } if len(b.revision) == 0 { // Done! volumeutil.SetReady(b.getMetaDir()) return nil } subdir := path.Join(dir, files[0].Name()) if output, err := b.execCommand("git", []string{"checkout", b.revision}, subdir); err != nil { return fmt.Errorf("failed to exec 'git checkout %s': %s: %v", b.revision, output, err) } if output, err := b.execCommand("git", []string{"reset", "--hard"}, subdir); err != nil { return fmt.Errorf("failed to exec 'git reset --hard': %s: %v", output, err) } volumeutil.SetReady(b.getMetaDir()) return nil }
// SetUpAt creates new directory. func (ed *emptyDir) SetUpAt(dir string) error { notMnt, err := ed.mounter.IsLikelyNotMountPoint(dir) // Getting an os.IsNotExist err from is a contingency; the directory // may not exist yet, in which case, setup should run. if err != nil && !os.IsNotExist(err) { return err } // If the plugin readiness file is present for this volume, and the // storage medium is the default, then the volume is ready. If the // medium is memory, and a mountpoint is present, then the volume is // ready. if volumeutil.IsReady(ed.getMetaDir()) { if ed.medium == api.StorageMediumMemory && !notMnt { return nil } else if ed.medium == api.StorageMediumDefault { return nil } } // Determine the effective SELinuxOptions to use for this volume. securityContext := "" if selinuxEnabled() { securityContext = ed.rootContext } switch ed.medium { case api.StorageMediumDefault: err = ed.setupDir(dir, securityContext) case api.StorageMediumMemory: err = ed.setupTmpfs(dir, securityContext) default: err = fmt.Errorf("unknown storage medium %q", ed.medium) } if err == nil { volumeutil.SetReady(ed.getMetaDir()) } return err }