Browse Source

Merge pull request #13218 from brahmaroutu/decoder_issue_gccgo

Decoder does not work properly with nested pointers using gcc
David Calavera 10 years ago
parent
commit
b1143f4cb0
2 changed files with 30 additions and 41 deletions
  1. 27 6
      runconfig/config.go
  2. 3 35
      runconfig/hostconfig.go

+ 27 - 6
runconfig/config.go

@@ -132,15 +132,36 @@ type Config struct {
 
 type ContainerConfigWrapper struct {
 	*Config
-	*hostConfigWrapper
+	InnerHostConfig *HostConfig `json:"HostConfig,omitempty"`
+	Cpuset          string      `json:",omitempty"` // Deprecated. Exported for backwards compatibility.
+	*HostConfig                 // Deprecated. Exported to read attrubutes from json that are not in the inner host config structure.
+
 }
 
-func (c ContainerConfigWrapper) HostConfig() *HostConfig {
-	if c.hostConfigWrapper == nil {
-		return new(HostConfig)
+func (w *ContainerConfigWrapper) GetHostConfig() *HostConfig {
+	hc := w.HostConfig
+
+	if hc == nil && w.InnerHostConfig != nil {
+		hc = w.InnerHostConfig
+	} else if w.InnerHostConfig != nil {
+		if hc.Memory != 0 && w.InnerHostConfig.Memory == 0 {
+			w.InnerHostConfig.Memory = hc.Memory
+		}
+		if hc.MemorySwap != 0 && w.InnerHostConfig.MemorySwap == 0 {
+			w.InnerHostConfig.MemorySwap = hc.MemorySwap
+		}
+		if hc.CpuShares != 0 && w.InnerHostConfig.CpuShares == 0 {
+			w.InnerHostConfig.CpuShares = hc.CpuShares
+		}
+
+		hc = w.InnerHostConfig
+	}
+
+	if hc != nil && w.Cpuset != "" && hc.CpusetCpus == "" {
+		hc.CpusetCpus = w.Cpuset
 	}
 
-	return c.hostConfigWrapper.GetHostConfig()
+	return hc
 }
 
 // DecodeContainerConfig decodes a json encoded config into a ContainerConfigWrapper
@@ -155,5 +176,5 @@ func DecodeContainerConfig(src io.Reader) (*Config, *HostConfig, error) {
 		return nil, nil, err
 	}
 
-	return w.Config, w.HostConfig(), nil
+	return w.Config, w.GetHostConfig(), nil
 }

+ 3 - 35
runconfig/hostconfig.go

@@ -234,47 +234,15 @@ type HostConfig struct {
 func MergeConfigs(config *Config, hostConfig *HostConfig) *ContainerConfigWrapper {
 	return &ContainerConfigWrapper{
 		config,
-		&hostConfigWrapper{InnerHostConfig: hostConfig},
+		hostConfig,
+		"", nil,
 	}
 }
 
-type hostConfigWrapper struct {
-	InnerHostConfig *HostConfig `json:"HostConfig,omitempty"`
-	Cpuset          string      `json:",omitempty"` // Deprecated. Exported for backwards compatibility.
-
-	*HostConfig // Deprecated. Exported to read attrubutes from json that are not in the inner host config structure.
-}
-
-func (w hostConfigWrapper) GetHostConfig() *HostConfig {
-	hc := w.HostConfig
-
-	if hc == nil && w.InnerHostConfig != nil {
-		hc = w.InnerHostConfig
-	} else if w.InnerHostConfig != nil {
-		if hc.Memory != 0 && w.InnerHostConfig.Memory == 0 {
-			w.InnerHostConfig.Memory = hc.Memory
-		}
-		if hc.MemorySwap != 0 && w.InnerHostConfig.MemorySwap == 0 {
-			w.InnerHostConfig.MemorySwap = hc.MemorySwap
-		}
-		if hc.CpuShares != 0 && w.InnerHostConfig.CpuShares == 0 {
-			w.InnerHostConfig.CpuShares = hc.CpuShares
-		}
-
-		hc = w.InnerHostConfig
-	}
-
-	if hc != nil && w.Cpuset != "" && hc.CpusetCpus == "" {
-		hc.CpusetCpus = w.Cpuset
-	}
-
-	return hc
-}
-
 func DecodeHostConfig(src io.Reader) (*HostConfig, error) {
 	decoder := json.NewDecoder(src)
 
-	var w hostConfigWrapper
+	var w ContainerConfigWrapper
 	if err := decoder.Decode(&w); err != nil {
 		return nil, err
 	}