mirror of
				https://github.com/moby/moby.git
				synced 2022-11-09 12:21:53 -05:00 
			
		
		
		
	… or could be in `opts` package. Having `runconfig/opts` and `opts` doesn't really make sense and make it difficult to know where to put some code. Signed-off-by: Vincent Demeester <vincent@sbr.pm>
		
			
				
	
	
		
			87 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			87 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package opts
 | 
						|
 | 
						|
import (
 | 
						|
	"fmt"
 | 
						|
	"strconv"
 | 
						|
	"strings"
 | 
						|
 | 
						|
	"github.com/docker/docker/api/types/container"
 | 
						|
)
 | 
						|
 | 
						|
// ReadKVStrings reads a file of line terminated key=value pairs, and overrides any keys
 | 
						|
// present in the file with additional pairs specified in the override parameter
 | 
						|
func ReadKVStrings(files []string, override []string) ([]string, error) {
 | 
						|
	envVariables := []string{}
 | 
						|
	for _, ef := range files {
 | 
						|
		parsedVars, err := ParseEnvFile(ef)
 | 
						|
		if err != nil {
 | 
						|
			return nil, err
 | 
						|
		}
 | 
						|
		envVariables = append(envVariables, parsedVars...)
 | 
						|
	}
 | 
						|
	// parse the '-e' and '--env' after, to allow override
 | 
						|
	envVariables = append(envVariables, override...)
 | 
						|
 | 
						|
	return envVariables, nil
 | 
						|
}
 | 
						|
 | 
						|
// ConvertKVStringsToMap converts ["key=value"] to {"key":"value"}
 | 
						|
func ConvertKVStringsToMap(values []string) map[string]string {
 | 
						|
	result := make(map[string]string, len(values))
 | 
						|
	for _, value := range values {
 | 
						|
		kv := strings.SplitN(value, "=", 2)
 | 
						|
		if len(kv) == 1 {
 | 
						|
			result[kv[0]] = ""
 | 
						|
		} else {
 | 
						|
			result[kv[0]] = kv[1]
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	return result
 | 
						|
}
 | 
						|
 | 
						|
// ConvertKVStringsToMapWithNil converts ["key=value"] to {"key":"value"}
 | 
						|
// but set unset keys to nil - meaning the ones with no "=" in them.
 | 
						|
// We use this in cases where we need to distinguish between
 | 
						|
//   FOO=  and FOO
 | 
						|
// where the latter case just means FOO was mentioned but not given a value
 | 
						|
func ConvertKVStringsToMapWithNil(values []string) map[string]*string {
 | 
						|
	result := make(map[string]*string, len(values))
 | 
						|
	for _, value := range values {
 | 
						|
		kv := strings.SplitN(value, "=", 2)
 | 
						|
		if len(kv) == 1 {
 | 
						|
			result[kv[0]] = nil
 | 
						|
		} else {
 | 
						|
			result[kv[0]] = &kv[1]
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	return result
 | 
						|
}
 | 
						|
 | 
						|
// ParseRestartPolicy returns the parsed policy or an error indicating what is incorrect
 | 
						|
func ParseRestartPolicy(policy string) (container.RestartPolicy, error) {
 | 
						|
	p := container.RestartPolicy{}
 | 
						|
 | 
						|
	if policy == "" {
 | 
						|
		return p, nil
 | 
						|
	}
 | 
						|
 | 
						|
	parts := strings.Split(policy, ":")
 | 
						|
 | 
						|
	if len(parts) > 2 {
 | 
						|
		return p, fmt.Errorf("invalid restart policy format")
 | 
						|
	}
 | 
						|
	if len(parts) == 2 {
 | 
						|
		count, err := strconv.Atoi(parts[1])
 | 
						|
		if err != nil {
 | 
						|
			return p, fmt.Errorf("maximum retry count must be an integer")
 | 
						|
		}
 | 
						|
 | 
						|
		p.MaximumRetryCount = count
 | 
						|
	}
 | 
						|
 | 
						|
	p.Name = parts[0]
 | 
						|
 | 
						|
	return p, nil
 | 
						|
}
 |