• Mahmood Ali's avatar
    drivers: restore port_map old json support · afb0c5ac
    Mahmood Ali authored
    This ensures that `port_map` along with other block like attribute
    declarations (e.g. ulimit, labels, etc) can handle various hcl and json
    syntax that was supported in 0.8.
    
    In 0.8.7, the following declarations are effectively equivalent:
    
    ```
    // hcl block
    port_map {
      http = 80
      https = 443
    }
    
    // hcl assignment
    port_map = {
      http  = 80
      https = 443
    }
    
    // json single element array of map (default in API response)
    {"port_map": [{"http": 80, "https": 443}]}
    
    // json array of individual maps (supported accidentally iiuc)
    {"port_map: [{"http": 80}, {"https": 443}]}
    ```
    
    We achieve compatbility by using `NewAttr("...", "list(map(string))",
    false)` to be serialized to a `map[string]string` wrapper, instead of using
    `BlockAttrs` declaration.  The wrapper merges the list of maps
    automatically, to ease driver development.
    
    This approach is closer to how v0.8.7 implemented the fields [1][2], and
    despite its verbosity, seems to perserve 0.8.7 behavior in hcl2.
    
    This is only required for built-in types that have backward
    compatibility constraints.  External drivers should use `BlockAttrs`
    instead, as they see fit.
    
    [1] https://github.com/hashicorp/nomad/blob/v0.8.7/client/driver/docker.go#L216
    [2] https://github.com/hashicorp/nomad/blob/v0.8.7/client/driver/docker.go#L698-L700
    afb0c5ac