diff --git a/.github/workflows/golangci-lint.yaml b/.github/workflows/golangci-lint.yaml new file mode 100644 index 00000000..bb3a7433 --- /dev/null +++ b/.github/workflows/golangci-lint.yaml @@ -0,0 +1,17 @@ +--- +name: golangci-lint +on: + push: + branches: + - master + pull_request: +jobs: + golangci: + name: lint + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: golangci-lint + uses: golangci/golangci-lint-action@v2 + with: + version: v1.33 diff --git a/.golangci.yml b/.golangci.yml new file mode 100644 index 00000000..c9a6b60b --- /dev/null +++ b/.golangci.yml @@ -0,0 +1,7 @@ +linters-settings: + errcheck: + # https://github.com/hashicorp/terraform-provider-aws/blob/9c9a116a857fb838a0e7d1cfbf420c2524f0abe1/.golangci.yml#L37-L39 + ignore: github.com/hashicorp/terraform-plugin-sdk/helper/schema:ForceNew|Set,fmt:.*,io:Close + +run: + timeout: 10m diff --git a/docker/config.go b/docker/config.go index f9e3c40a..bc3dc8ae 100644 --- a/docker/config.go +++ b/docker/config.go @@ -38,7 +38,7 @@ func buildHTTPClientFromBytes(caPEMCert, certPEMBlock, keyPEMBlock []byte) (*htt tlsConfig.Certificates = []tls.Certificate{tlsCert} } - if caPEMCert == nil || len(caPEMCert) == 0 { + if len(caPEMCert) == 0 { tlsConfig.InsecureSkipVerify = true } else { caPool := x509.NewCertPool() diff --git a/docker/data_source_docker_network.go b/docker/data_source_docker_network.go index a82e093b..0e02f6bd 100644 --- a/docker/data_source_docker_network.go +++ b/docker/data_source_docker_network.go @@ -110,7 +110,7 @@ func dataSourceDockerNetworkRead(d *schema.ResourceData, meta interface{}) error "ip_range": config.IPRange, } } - err = d.Set("ipam_config", ipam) + d.Set("ipam_config", ipam) return nil } diff --git a/docker/resource_docker_container_funcs.go b/docker/resource_docker_container_funcs.go index c2ec4cf0..386839be 100644 --- a/docker/resource_docker_container_funcs.go +++ b/docker/resource_docker_container_funcs.go @@ -559,7 +559,9 @@ func resourceDockerContainerRead(d *schema.ResourceData, meta interface{}) error if finishTime.After(creationTime) { // It exited immediately, so error out so dependent containers // aren't started - resourceDockerContainerDelete(d, meta) + if err := resourceDockerContainerDelete(d, meta); err != nil { + log.Printf("[ERROR] Container %s failed to be deleted: %v", apiContainer.ID, err) + } return fmt.Errorf("Container %s exited after creation, error was: %s", apiContainer.ID, container.State.Error) } @@ -568,7 +570,9 @@ func resourceDockerContainerRead(d *schema.ResourceData, meta interface{}) error // Handle the case of the for loop above running its course if !container.State.Running && d.Get("must_run").(bool) { - resourceDockerContainerDelete(d, meta) + if err := resourceDockerContainerDelete(d, meta); err != nil { + log.Printf("[ERROR] Container %s failed to be deleted: %v", apiContainer.ID, err) + } return fmt.Errorf("Container %s failed to be in running state", apiContainer.ID) } diff --git a/docker/resource_docker_container_migrate.go b/docker/resource_docker_container_migrate.go index eece2c1f..0486390b 100644 --- a/docker/resource_docker_container_migrate.go +++ b/docker/resource_docker_container_migrate.go @@ -97,7 +97,7 @@ func updateV0ToV1PortsOrder(is *terraform.InstanceState, meta interface{}) error // map the sorted ports to an output structure tf can write outputPorts := make([]interface{}, 0) for _, mappedPort := range portsMapped { - outputPort := make(map[string]interface{}, 0) + outputPort := make(map[string]interface{}) outputPort["internal"] = mappedPort.internal outputPort["external"] = mappedPort.external outputPort["ip"] = mappedPort.ip diff --git a/docker/resource_docker_container_test.go b/docker/resource_docker_container_test.go index 8a56b4aa..41431780 100644 --- a/docker/resource_docker_container_test.go +++ b/docker/resource_docker_container_test.go @@ -667,7 +667,9 @@ func TestAccDockerContainer_upload(t *testing.T) { } fbuf := new(bytes.Buffer) - fbuf.ReadFrom(tr) + if _, err := fbuf.ReadFrom(tr); err != nil { + return err + } content := fbuf.String() if content != "foo" { @@ -729,7 +731,9 @@ func TestAccDockerContainer_uploadSource(t *testing.T) { } fbuf := new(bytes.Buffer) - fbuf.ReadFrom(tr) + if _, err := fbuf.ReadFrom(tr); err != nil { + return err + } content := fbuf.String() if content != string(testFileContent) { return fmt.Errorf("file content is invalid") @@ -831,7 +835,9 @@ func TestAccDockerContainer_uploadAsBase64(t *testing.T) { } fbuf := new(bytes.Buffer) - fbuf.ReadFrom(tr) + if _, err := fbuf.ReadFrom(tr); err != nil { + return err + } gotContent := fbuf.String() if wantedContent != gotContent { @@ -982,7 +988,9 @@ func TestAccDockerContainer_device(t *testing.T) { } fbuf := new(bytes.Buffer) - fbuf.ReadFrom(tr) + if _, err := fbuf.ReadFrom(tr); err != nil { + return err + } content := fbuf.Bytes() if len(content) != 10 { diff --git a/docker/resource_docker_image_funcs.go b/docker/resource_docker_image_funcs.go index 33d5b923..b841aea8 100644 --- a/docker/resource_docker_image_funcs.go +++ b/docker/resource_docker_image_funcs.go @@ -39,7 +39,9 @@ func decodeBuildMessages(response types.ImageBuildResponse) (string, error) { return buf.String(), fmt.Errorf("Problem decoding message from docker daemon: %s", err) } - m.Display(buf, false) + if err := m.Display(buf, false); err != nil { + return "", err + } if m.Error != nil { buildErr = fmt.Errorf("Unable to build image") @@ -126,7 +128,6 @@ func searchLocalImages(data Data, imageName string) *types.ImageSummary { } if apiImage, ok := data.DockerImages[imageName+":latest"]; ok { log.Printf("[DEBUG] found local image via imageName + latest: %v", imageName) - imageName = imageName + ":latest" return apiImage } return nil @@ -218,7 +219,9 @@ func pullImage(data *Data, client *client.Client, authConfig *AuthConfigs, image defer out.Close() buf := new(bytes.Buffer) - buf.ReadFrom(out) + if _, err := buf.ReadFrom(out); err != nil { + return err + } s := buf.String() log.Printf("[DEBUG] pulled image %v: %v", image, s) diff --git a/docker/resource_docker_image_test.go b/docker/resource_docker_image_test.go index 759a3e90..831f8b22 100644 --- a/docker/resource_docker_image_test.go +++ b/docker/resource_docker_image_test.go @@ -206,7 +206,9 @@ func testAccDockerImageDestroy(s *terraform.State) error { func TestAccDockerImage_build(t *testing.T) { wd, _ := os.Getwd() dfPath := path.Join(wd, "Dockerfile") - ioutil.WriteFile(dfPath, []byte(testDockerFileExample), 0o644) + if err := ioutil.WriteFile(dfPath, []byte(testDockerFileExample), 0o644); err != nil { + t.Fatalf("failed to create a Dockerfile %s for test: %+v", dfPath, err) + } defer os.Remove(dfPath) resource.Test(t, resource.TestCase{ PreCheck: func() { testAccPreCheck(t) }, diff --git a/docker/resource_docker_network.go b/docker/resource_docker_network.go index 9a5d3c28..c1d7f152 100644 --- a/docker/resource_docker_network.go +++ b/docker/resource_docker_network.go @@ -249,7 +249,7 @@ func resourceDockerNetworkV0() *schema.Resource { } } -func suppressIfIPAMConfigWithIpv6Changes() schema.SchemaDiffSuppressFunc { +func suppressIfIPAMConfigWithIpv6Changes() schema.SchemaDiffSuppressFunc { //nolint:deadcode,unused return func(k, old, new string, d *schema.ResourceData) bool { // the initial case when the resource is created if old == "" && new != "" { diff --git a/docker/resource_docker_network_funcs.go b/docker/resource_docker_network_funcs.go index bbde15ed..78b984ce 100644 --- a/docker/resource_docker_network_funcs.go +++ b/docker/resource_docker_network_funcs.go @@ -206,7 +206,7 @@ func resourceDockerNetworkRemoveRefreshFunc( // TODO mavogel: separate structure file // TODO 2: seems like we can replace the set hash generation with plain lists -> #219 func flattenIpamConfigSpec(in []network.IPAMConfig) *schema.Set { // []interface{} { - out := make([]interface{}, len(in), len(in)) + out := make([]interface{}, len(in)) for i, v := range in { log.Printf("[DEBUG] flatten ipam %d: %#v", i, v) m := make(map[string]interface{}) diff --git a/docker/resource_docker_network_test.go b/docker/resource_docker_network_test.go index 383d96f0..2c49ad9c 100644 --- a/docker/resource_docker_network_test.go +++ b/docker/resource_docker_network_test.go @@ -259,7 +259,7 @@ func TestAccDockerNetwork_ipv6(t *testing.T) { }) } -func testAccNetworkIPv6(network *types.NetworkResource, internal bool) resource.TestCheckFunc { +func testAccNetworkIPv6(network *types.NetworkResource, internal bool) resource.TestCheckFunc { //nolint:unused return func(s *terraform.State) error { if !network.EnableIPv6 { return fmt.Errorf("Bad value for attribute 'ipv6': %t", network.EnableIPv6) @@ -317,7 +317,7 @@ func TestAccDockerNetwork_labels(t *testing.T) { }) } -func testAccNetworkLabel(network *types.NetworkResource, name string, value string) resource.TestCheckFunc { +func testAccNetworkLabel(network *types.NetworkResource, name string, value string) resource.TestCheckFunc { //nolint:deadcode,unused return func(s *terraform.State) error { if network.Labels[name] != value { return fmt.Errorf("Bad value for label '%s': %s", name, network.Labels[name]) diff --git a/docker/resource_docker_registry_image_funcs.go b/docker/resource_docker_registry_image_funcs.go index 53a000d0..617128d5 100644 --- a/docker/resource_docker_registry_image_funcs.go +++ b/docker/resource_docker_registry_image_funcs.go @@ -178,6 +178,9 @@ func buildDockerRegistryImage(client *client.Client, buildOptions map[string]int } defer os.Remove(dockerContextTarPath) dockerBuildContext, err := os.Open(dockerContextTarPath) + if err != nil { + return err + } defer dockerBuildContext.Close() buildResponse, err := client.ImageBuild(context.Background(), dockerBuildContext, imageBuildOptions) @@ -210,7 +213,7 @@ func buildDockerImageContextTar(buildContext string) (string, error) { tw := tar.NewWriter(tmpFile) defer tw.Close() - err = filepath.Walk(buildContext, func(file string, info os.FileInfo, err error) error { + if err := filepath.Walk(buildContext, func(file string, info os.FileInfo, err error) error { // return on any error if err != nil { return err @@ -251,7 +254,9 @@ func buildDockerImageContextTar(buildContext string) (string, error) { f.Close() return nil - }) + }); err != nil { + return "", err + } return tmpFile.Name(), nil } @@ -262,7 +267,9 @@ func getDockerImageContextTarHash(dockerContextTarPath string) (string, error) { if err != nil { return "", err } - hasher.Write(s) + if _, err := hasher.Write(s); err != nil { + return "", err + } contextHash := hex.EncodeToString(hasher.Sum(nil)) return contextHash, nil } @@ -295,7 +302,9 @@ func pushDockerRegistryImage(client *client.Client, pushOpts internalPushImageOp if err == io.EOF { break } - json.Unmarshal(streamBytes, &errorMessage) + if err := json.Unmarshal(streamBytes, &errorMessage); err != nil { + return err + } if errorMessage.Error != "" { return fmt.Errorf("Error pushing image: %s", errorMessage.Error) } @@ -401,6 +410,9 @@ func deleteDockerRegistryImage(pushOpts internalPushImageOptions, sha256Digest, req.Header.Set("Authorization", "Bearer "+token.Token) oauthResp, err := client.Do(req) + if err != nil { + return err + } switch oauthResp.StatusCode { case http.StatusOK, http.StatusAccepted, http.StatusNotFound: return nil diff --git a/docker/resource_docker_service_funcs.go b/docker/resource_docker_service_funcs.go index aff49fa1..872eb406 100644 --- a/docker/resource_docker_service_funcs.go +++ b/docker/resource_docker_service_funcs.go @@ -1135,7 +1135,8 @@ func createLogDriver(v interface{}) (*swarm.Driver, error) { if rawOptions, ok := rawLogging["options"]; ok { logDriver.Options = mapTypeMapValsToString(rawOptions.(map[string]interface{})) } - return &logDriver, nil + // TODO SA4004: the surrounding loop is unconditionally terminated (staticcheck) + return &logDriver, nil //nolint:staticcheck } } return nil, nil @@ -1329,7 +1330,7 @@ func fromRegistryAuth(image string, authConfigs map[string]types.AuthConfig) typ // retrieveAndMarshalAuth retrieves and marshals the service registry auth func retrieveAndMarshalAuth(d *schema.ResourceData, meta interface{}, stageType string) []byte { - auth := types.AuthConfig{} + var auth types.AuthConfig if v, ok := d.GetOk("auth"); ok { auth = authToServiceAuth(v.(map[string]interface{})) } else { @@ -1407,8 +1408,6 @@ var ( swarm.TaskStateFailed: 12, swarm.TaskStateRejected: 13, } - - longestState int ) // serviceCreatePendingStates are the pending states for the creation of a service diff --git a/docker/resource_docker_service_test.go b/docker/resource_docker_service_test.go index 5c264c6a..45a35ada 100644 --- a/docker/resource_docker_service_test.go +++ b/docker/resource_docker_service_test.go @@ -63,12 +63,10 @@ func TestDockerSecretFromRegistryAuth_multiple(t *testing.T) { checkAttribute(t, "ServerAddress", foundAuthConfig.ServerAddress, "") } -func checkAttribute(t *testing.T, name, actual, expected string) error { +func checkAttribute(t *testing.T, name, actual, expected string) { if actual != expected { t.Fatalf("bad authconfig attribute for '%q'\nExpected: %s\n Got: %s", name, expected, actual) } - - return nil } func TestDockerImageNameSuppress(t *testing.T) { diff --git a/docker/resource_docker_volume_test.go b/docker/resource_docker_volume_test.go index 2a15e2c3..45f9b97b 100644 --- a/docker/resource_docker_volume_test.go +++ b/docker/resource_docker_volume_test.go @@ -92,7 +92,7 @@ func TestAccDockerVolume_labels(t *testing.T) { }) } -func testAccVolumeLabel(volume *types.Volume, name string, value string) resource.TestCheckFunc { +func testAccVolumeLabel(volume *types.Volume, name string, value string) resource.TestCheckFunc { //nolint:deadcode,unused return func(s *terraform.State) error { if volume.Labels[name] != value { return fmt.Errorf("Bad value for label '%s': %s", name, volume.Labels[name]) diff --git a/docker/structures_service.go b/docker/structures_service.go index 20302af0..0deda7ca 100644 --- a/docker/structures_service.go +++ b/docker/structures_service.go @@ -25,9 +25,7 @@ func flattenTaskSpec(in swarm.TaskSpec) []interface{} { if in.Placement != nil { m["placement"] = flattenTaskPlacement(in.Placement) } - if in.ForceUpdate >= 0 { - m["force_update"] = in.ForceUpdate - } + m["force_update"] = in.ForceUpdate if len(in.Runtime) > 0 { m["runtime"] = in.Runtime } @@ -56,7 +54,7 @@ func flattenServiceMode(in swarm.ServiceMode) []interface{} { } func flattenReplicated(in *swarm.ReplicatedService) []interface{} { - out := make([]interface{}, 0, 0) + out := make([]interface{}, 0) m := make(map[string]interface{}) if in != nil { if in.Replicas != nil { @@ -69,7 +67,7 @@ func flattenReplicated(in *swarm.ReplicatedService) []interface{} { } func flattenServiceUpdateOrRollbackConfig(in *swarm.UpdateConfig) []interface{} { - out := make([]interface{}, 0, 0) + out := make([]interface{}, 0) if in == nil { return out } @@ -86,7 +84,7 @@ func flattenServiceUpdateOrRollbackConfig(in *swarm.UpdateConfig) []interface{} } func flattenServiceEndpoint(in swarm.Endpoint) []interface{} { - out := make([]interface{}, 0, 0) + out := make([]interface{}, 0) m := make(map[string]interface{}) m["mode"] = string(in.Spec.Mode) m["ports"] = flattenServicePorts(in.Ports) @@ -96,7 +94,7 @@ func flattenServiceEndpoint(in swarm.Endpoint) []interface{} { } func flattenServiceEndpointSpec(in *swarm.EndpointSpec) []interface{} { - out := make([]interface{}, 0, 0) + out := make([]interface{}, 0) m := make(map[string]interface{}) m["mode"] = string(in.Mode) m["ports"] = flattenServicePorts(in.Ports) @@ -107,7 +105,7 @@ func flattenServiceEndpointSpec(in *swarm.EndpointSpec) []interface{} { ///// start TaskSpec func flattenContainerSpec(in *swarm.ContainerSpec) []interface{} { - out := make([]interface{}, 0, 0) + out := make([]interface{}, 0) m := make(map[string]interface{}) if len(in.Image) > 0 { m["image"] = in.Image @@ -175,14 +173,14 @@ func flattenContainerSpec(in *swarm.ContainerSpec) []interface{} { func flattenPrivileges(in *swarm.Privileges) []interface{} { if in == nil { - return make([]interface{}, 0, 0) + return make([]interface{}, 0) } - out := make([]interface{}, 1, 1) + out := make([]interface{}, 1) m := make(map[string]interface{}) if in.CredentialSpec != nil { - credSpec := make([]interface{}, 1, 1) + credSpec := make([]interface{}, 1) internal := make(map[string]interface{}) internal["file"] = in.CredentialSpec.File internal["registry"] = in.CredentialSpec.Registry @@ -190,7 +188,7 @@ func flattenPrivileges(in *swarm.Privileges) []interface{} { m["credential_spec"] = credSpec } if in.SELinuxContext != nil { - seLinuxContext := make([]interface{}, 1, 1) + seLinuxContext := make([]interface{}, 1) internal := make(map[string]interface{}) internal["disable"] = in.SELinuxContext.Disable internal["user"] = in.SELinuxContext.User @@ -205,7 +203,7 @@ func flattenPrivileges(in *swarm.Privileges) []interface{} { } func flattenServiceMounts(in []mount.Mount) *schema.Set { - out := make([]interface{}, len(in), len(in)) + out := make([]interface{}, len(in)) for i, v := range in { m := make(map[string]interface{}) m["target"] = v.Target @@ -213,8 +211,8 @@ func flattenServiceMounts(in []mount.Mount) *schema.Set { m["type"] = string(v.Type) m["read_only"] = v.ReadOnly if v.BindOptions != nil { - bindOptions := make([]interface{}, 0, 0) - bindOptionsItem := make(map[string]interface{}, 0) + bindOptions := make([]interface{}, 0) + bindOptionsItem := make(map[string]interface{}) if len(v.BindOptions.Propagation) > 0 { bindOptionsItem["propagation"] = string(v.BindOptions.Propagation) @@ -225,8 +223,8 @@ func flattenServiceMounts(in []mount.Mount) *schema.Set { } if v.VolumeOptions != nil { - volumeOptions := make([]interface{}, 0, 0) - volumeOptionsItem := make(map[string]interface{}, 0) + volumeOptions := make([]interface{}, 0) + volumeOptionsItem := make(map[string]interface{}) volumeOptionsItem["no_copy"] = v.VolumeOptions.NoCopy volumeOptionsItem["labels"] = mapToLabelSet(v.VolumeOptions.Labels) @@ -242,8 +240,8 @@ func flattenServiceMounts(in []mount.Mount) *schema.Set { } if v.TmpfsOptions != nil { - tmpfsOptions := make([]interface{}, 0, 0) - tmpfsOptionsItem := make(map[string]interface{}, 0) + tmpfsOptions := make([]interface{}, 0) + tmpfsOptionsItem := make(map[string]interface{}) tmpfsOptionsItem["size_bytes"] = int(v.TmpfsOptions.SizeBytes) tmpfsOptionsItem["mode"] = v.TmpfsOptions.Mode.Perm @@ -263,10 +261,10 @@ func flattenServiceMounts(in []mount.Mount) *schema.Set { func flattenServiceHealthcheck(in *container.HealthConfig) []interface{} { if in == nil { - return make([]interface{}, 0, 0) + return make([]interface{}, 0) } - out := make([]interface{}, 1, 1) + out := make([]interface{}, 1) m := make(map[string]interface{}) if len(in.Test) > 0 { m["test"] = in.Test @@ -280,7 +278,7 @@ func flattenServiceHealthcheck(in *container.HealthConfig) []interface{} { } func flattenServiceHosts(in []string) *schema.Set { - out := make([]interface{}, len(in), len(in)) + out := make([]interface{}, len(in)) for i, v := range in { m := make(map[string]interface{}) split := strings.Split(v, ":") @@ -297,10 +295,10 @@ func flattenServiceHosts(in []string) *schema.Set { func flattenServiceDNSConfig(in *swarm.DNSConfig) []interface{} { if in == nil { - return make([]interface{}, 0, 0) + return make([]interface{}, 0) } - out := make([]interface{}, 1, 1) + out := make([]interface{}, 1) m := make(map[string]interface{}) if len(in.Nameservers) > 0 { m["nameservers"] = in.Nameservers @@ -316,7 +314,7 @@ func flattenServiceDNSConfig(in *swarm.DNSConfig) []interface{} { } func flattenServiceSecrets(in []*swarm.SecretReference) *schema.Set { - out := make([]interface{}, len(in), len(in)) + out := make([]interface{}, len(in)) for i, v := range in { m := make(map[string]interface{}) m["secret_id"] = v.SecretID @@ -343,7 +341,7 @@ func flattenServiceSecrets(in []*swarm.SecretReference) *schema.Set { } func flattenServiceConfigs(in []*swarm.ConfigReference) *schema.Set { - out := make([]interface{}, len(in), len(in)) + out := make([]interface{}, len(in)) for i, v := range in { m := make(map[string]interface{}) m["config_id"] = v.ConfigID @@ -370,7 +368,7 @@ func flattenServiceConfigs(in []*swarm.ConfigReference) *schema.Set { } func flattenTaskResources(in *swarm.ResourceRequirements) []interface{} { - out := make([]interface{}, 0, 0) + out := make([]interface{}, 0) if in != nil { m := make(map[string]interface{}) m["limits"] = flattenResourceLimitsOrReservations(in.Limits) @@ -381,7 +379,7 @@ func flattenTaskResources(in *swarm.ResourceRequirements) []interface{} { } func flattenResourceLimitsOrReservations(in *swarm.Resources) []interface{} { - out := make([]interface{}, 0, 0) + out := make([]interface{}, 0) if in != nil { m := make(map[string]interface{}) m["nano_cpus"] = in.NanoCPUs @@ -393,8 +391,8 @@ func flattenResourceLimitsOrReservations(in *swarm.Resources) []interface{} { } func flattenResourceGenericResource(in []swarm.GenericResource) []interface{} { - out := make([]interface{}, 0, 0) - if in != nil && len(in) > 0 { + out := make([]interface{}, 0) + if len(in) > 0 { m := make(map[string]interface{}) named := make([]string, 0) discrete := make([]string, 0) @@ -433,9 +431,9 @@ func flattenTaskRestartPolicy(in *swarm.RestartPolicy) map[string]interface{} { func flattenTaskPlacement(in *swarm.Placement) []interface{} { if in == nil { - return make([]interface{}, 0, 0) + return make([]interface{}, 0) } - out := make([]interface{}, 1, 1) + out := make([]interface{}, 1) m := make(map[string]interface{}) if len(in.Constraints) > 0 { m["constraints"] = newStringSet(schema.HashString, in.Constraints) @@ -451,11 +449,11 @@ func flattenTaskPlacement(in *swarm.Placement) []interface{} { } func flattenPlacementPrefs(in []swarm.PlacementPreference) *schema.Set { - if in == nil || len(in) == 0 { - return schema.NewSet(schema.HashString, make([]interface{}, 0, 0)) + if len(in) == 0 { + return schema.NewSet(schema.HashString, make([]interface{}, 0)) } - out := make([]interface{}, len(in), len(in)) + out := make([]interface{}, len(in)) for i, v := range in { out[i] = v.Spread.SpreadDescriptor } @@ -463,7 +461,7 @@ func flattenPlacementPrefs(in []swarm.PlacementPreference) *schema.Set { } func flattenPlacementPlatforms(in []swarm.Platform) *schema.Set { - out := make([]interface{}, len(in), len(in)) + out := make([]interface{}, len(in)) for i, v := range in { m := make(map[string]interface{}) m["architecture"] = v.Architecture @@ -477,7 +475,7 @@ func flattenPlacementPlatforms(in []swarm.Platform) *schema.Set { } func flattenTaskNetworks(in []swarm.NetworkAttachmentConfig) *schema.Set { - out := make([]interface{}, len(in), len(in)) + out := make([]interface{}, len(in)) for i, v := range in { out[i] = v.Target } @@ -486,10 +484,10 @@ func flattenTaskNetworks(in []swarm.NetworkAttachmentConfig) *schema.Set { func flattenTaskLogDriver(in *swarm.Driver) []interface{} { if in == nil { - return make([]interface{}, 0, 0) + return make([]interface{}, 0) } - out := make([]interface{}, 1, 1) + out := make([]interface{}, 1) m := make(map[string]interface{}) m["name"] = in.Name if len(in.Options) > 0 { @@ -502,7 +500,7 @@ func flattenTaskLogDriver(in *swarm.Driver) []interface{} { ///// end TaskSpec ///// start EndpointSpec func flattenServicePorts(in []swarm.PortConfig) []interface{} { - out := make([]interface{}, len(in), len(in)) + out := make([]interface{}, len(in)) for i, v := range in { m := make(map[string]interface{}) m["name"] = v.Name @@ -530,7 +528,7 @@ func shortDur(d time.Duration) string { } func newStringSet(f schema.SchemaSetFunc, in []string) *schema.Set { - out := make([]interface{}, len(in), len(in)) + out := make([]interface{}, len(in)) for i, v := range in { out[i] = v } @@ -555,8 +553,8 @@ func mapStringSliceToMap(in []string) map[string]string { // mapStringStringToMapStringInterface maps a string string map to a string interface map func mapStringStringToMapStringInterface(in map[string]string) map[string]interface{} { - if in == nil || len(in) == 0 { - return make(map[string]interface{}, 0) + if len(in) == 0 { + return make(map[string]interface{}) } mapped := make(map[string]interface{}, len(in)) diff --git a/docker/validators.go b/docker/validators.go index b315a120..1596fd52 100644 --- a/docker/validators.go +++ b/docker/validators.go @@ -49,9 +49,9 @@ func validateFloatRatio() schema.SchemaValidateFunc { func validateStringIsFloatRatio() schema.SchemaValidateFunc { return func(v interface{}, k string) (ws []string, errors []error) { - switch v.(type) { + switch t := v.(type) { case string: - stringValue := v.(string) + stringValue := t value, err := strconv.ParseFloat(stringValue, 64) if err != nil { errors = append(errors, fmt.Errorf( @@ -62,7 +62,7 @@ func validateStringIsFloatRatio() schema.SchemaValidateFunc { "%q has to be between 0.0 and 1.0", k)) } case int: - value := float64(v.(int)) + value := float64(t) if value < 0.0 || value > 1.0 { errors = append(errors, fmt.Errorf( "%q has to be between 0.0 and 1.0", k))