func makePayload(mappings []v1.KeyToPath, configMap *v1.ConfigMap, defaultMode *int32) (map[string]volumeutil.FileProjection, error) { if defaultMode == nil { return nil, fmt.Errorf("No defaultMode used, not even the default value for it") } payload := make(map[string]volumeutil.FileProjection, len(configMap.Data)) var fileProjection volumeutil.FileProjection if len(mappings) == 0 { for name, data := range configMap.Data { fileProjection.Data = []byte(data) fileProjection.Mode = *defaultMode payload[name] = fileProjection } } else { for _, ktp := range mappings { content, ok := configMap.Data[ktp.Key] if !ok { err_msg := "references non-existent config key" glog.Errorf(err_msg) return nil, fmt.Errorf(err_msg) } fileProjection.Data = []byte(content) if ktp.Mode != nil { fileProjection.Mode = *ktp.Mode } else { fileProjection.Mode = *defaultMode } payload[ktp.Path] = fileProjection } } return payload, nil }
// collectData collects requested downwardAPI in data map. // Map's key is the requested name of file to dump // Map's value is the (sorted) content of the field to be dumped in the file. func (d *downwardAPIVolume) collectData(defaultMode *int32) (map[string]volumeutil.FileProjection, error) { if defaultMode == nil { return nil, fmt.Errorf("No defaultMode used, not even the default value for it") } errlist := []error{} data := make(map[string]volumeutil.FileProjection) for _, fileInfo := range d.items { var fileProjection volumeutil.FileProjection fPath := path.Clean(fileInfo.Path) if fileInfo.Mode != nil { fileProjection.Mode = *fileInfo.Mode } else { fileProjection.Mode = *defaultMode } if fileInfo.FieldRef != nil { // TODO: unify with Kubelet.podFieldSelectorRuntimeValue if values, err := fieldpath.ExtractFieldPathAsString(d.pod, fileInfo.FieldRef.FieldPath); err != nil { glog.Errorf("Unable to extract field %s: %s", fileInfo.FieldRef.FieldPath, err.Error()) errlist = append(errlist, err) } else { fileProjection.Data = []byte(sortLines(values)) } } else if fileInfo.ResourceFieldRef != nil { containerName := fileInfo.ResourceFieldRef.ContainerName nodeAllocatable, err := d.plugin.host.GetNodeAllocatable() if err != nil { errlist = append(errlist, err) } else if values, err := fieldpath.ExtractResourceValueByContainerNameAndNodeAllocatable(fileInfo.ResourceFieldRef, d.pod, containerName, nodeAllocatable); err != nil { glog.Errorf("Unable to extract field %s: %s", fileInfo.ResourceFieldRef.Resource, err.Error()) errlist = append(errlist, err) } else { fileProjection.Data = []byte(sortLines(values)) } } data[fPath] = fileProjection } return data, utilerrors.NewAggregate(errlist) }