diff options
Diffstat (limited to 'vendor/k8s.io/kubernetes/pkg/util/io')
-rw-r--r-- | vendor/k8s.io/kubernetes/pkg/util/io/io.go | 61 | ||||
-rw-r--r-- | vendor/k8s.io/kubernetes/pkg/util/io/writer.go | 80 |
2 files changed, 141 insertions, 0 deletions
diff --git a/vendor/k8s.io/kubernetes/pkg/util/io/io.go b/vendor/k8s.io/kubernetes/pkg/util/io/io.go new file mode 100644 index 000000000..0be8e1272 --- /dev/null +++ b/vendor/k8s.io/kubernetes/pkg/util/io/io.go @@ -0,0 +1,61 @@ +/* +Copyright 2015 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package io + +import ( + "fmt" + "io/ioutil" + "os" + + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/kubernetes/pkg/api" + "k8s.io/kubernetes/pkg/api/v1" +) + +// LoadPodFromFile will read, decode, and return a Pod from a file. +func LoadPodFromFile(filePath string) (*v1.Pod, error) { + if filePath == "" { + return nil, fmt.Errorf("file path not specified") + } + podDef, err := ioutil.ReadFile(filePath) + if err != nil { + return nil, fmt.Errorf("failed to read file path %s: %+v", filePath, err) + } + if len(podDef) == 0 { + return nil, fmt.Errorf("file was empty: %s", filePath) + } + pod := &v1.Pod{} + + codec := api.Codecs.LegacyCodec(api.Registry.GroupOrDie(v1.GroupName).GroupVersion) + if err := runtime.DecodeInto(codec, podDef, pod); err != nil { + return nil, fmt.Errorf("failed decoding file: %v", err) + } + return pod, nil +} + +// SavePodToFile will encode and save a pod to a given path & permissions +func SavePodToFile(pod *v1.Pod, filePath string, perm os.FileMode) error { + if filePath == "" { + return fmt.Errorf("file path not specified") + } + codec := api.Codecs.LegacyCodec(api.Registry.GroupOrDie(v1.GroupName).GroupVersion) + data, err := runtime.Encode(codec, pod) + if err != nil { + return fmt.Errorf("failed encoding pod: %v", err) + } + return ioutil.WriteFile(filePath, data, perm) +} diff --git a/vendor/k8s.io/kubernetes/pkg/util/io/writer.go b/vendor/k8s.io/kubernetes/pkg/util/io/writer.go new file mode 100644 index 000000000..086508c90 --- /dev/null +++ b/vendor/k8s.io/kubernetes/pkg/util/io/writer.go @@ -0,0 +1,80 @@ +/* +Copyright 2015 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package io + +import ( + "bytes" + "fmt" + "io/ioutil" + "os" + "os/exec" + + "github.com/golang/glog" +) + +// Writer is an interface which allows to write data to a file. +type Writer interface { + WriteFile(filename string, data []byte, perm os.FileMode) error +} + +// StdWriter implements Writer interface and uses standard libraries +// for writing data to files. +type StdWriter struct { +} + +func (writer *StdWriter) WriteFile(filename string, data []byte, perm os.FileMode) error { + return ioutil.WriteFile(filename, data, perm) +} + +// Alternative implementation of Writer interface that allows writing data to file +// using nsenter command. +// If a program (e.g. kubelet) runs in a container it may want to write data to +// a mounted device. Since in Docker, mount propagation mode is set to private, +// it will not see the mounted device in its own namespace. To work around this +// limitaion one has to first enter hosts namespace (by using 'nsenter') and only +// then write data. +type NsenterWriter struct { +} + +// TODO: should take a writer, not []byte +func (writer *NsenterWriter) WriteFile(filename string, data []byte, perm os.FileMode) error { + cmd := "nsenter" + base_args := []string{ + "--mount=/rootfs/proc/1/ns/mnt", + "--", + } + + echo_args := append(base_args, "sh", "-c", fmt.Sprintf("cat > %s", filename)) + glog.V(5).Infof("Command to write data to file: %v %v", cmd, echo_args) + command := exec.Command(cmd, echo_args...) + command.Stdin = bytes.NewBuffer(data) + outputBytes, err := command.CombinedOutput() + if err != nil { + glog.Errorf("Output from writing to %q: %v", filename, string(outputBytes)) + return err + } + + chmod_args := append(base_args, "chmod", fmt.Sprintf("%o", perm), filename) + glog.V(5).Infof("Command to change permissions to file: %v %v", cmd, chmod_args) + outputBytes, err = exec.Command(cmd, chmod_args...).CombinedOutput() + if err != nil { + glog.Errorf("Output from chmod command: %v", string(outputBytes)) + return err + } + + return nil +} |