terraform/communicator/winrm/communicator.go

219 lines
4.8 KiB
Go
Raw Normal View History

2015-04-10 20:34:46 +02:00
package winrm
import (
"fmt"
"io"
"log"
"math/rand"
"strconv"
"strings"
communicator/winrm: fix data race in io copy As the command completes, the winrm.Command does not wait for its copy of the remote.Command streams to report itself completed. This adds an additional sync.WaitGroup to ensure that copy is finished up before moving on, solving the data race. Fixes the following data race: ``` ================== WARNING: DATA RACE Read by goroutine 6: github.com/hashicorp/terraform/communicator/winrm.TestStart() /Users/phinze/go/src/github.com/hashicorp/terraform/communicator/winrm/communicator_test.go:79 +0xa44 testing.tRunner() /private/var/folders/vd/7l9ys5k57l91x63sh28wl_kc0000gn/T/workdir/go/src/testing/testing.go:456 +0xdc Previous write by goroutine 14: bytes.(*Buffer).ReadFrom() /private/var/folders/vd/7l9ys5k57l91x63sh28wl_kc0000gn/T/workdir/go/src/bytes/buffer.go:174 +0x465 io.copyBuffer() /private/var/folders/vd/7l9ys5k57l91x63sh28wl_kc0000gn/T/workdir/go/src/io/io.go:375 +0x1a5 io.Copy() /private/var/folders/vd/7l9ys5k57l91x63sh28wl_kc0000gn/T/workdir/go/src/io/io.go:351 +0x78 Goroutine 6 (running) created at: testing.RunTests() /private/var/folders/vd/7l9ys5k57l91x63sh28wl_kc0000gn/T/workdir/go/src/testing/testing.go:561 +0xaa3 testing.(*M).Run() /private/var/folders/vd/7l9ys5k57l91x63sh28wl_kc0000gn/T/workdir/go/src/testing/testing.go:494 +0xe4 main.main() github.com/hashicorp/terraform/communicator/winrm/_test/_testmain.go:62 +0x20f Goroutine 14 (finished) created at: github.com/hashicorp/terraform/communicator/winrm.runCommand() /Users/phinze/go/src/github.com/hashicorp/terraform/communicator/winrm/communicator.go:151 +0xf8 ================== ```
2016-01-16 19:33:24 +01:00
"sync"
2015-04-10 20:34:46 +02:00
"time"
"github.com/hashicorp/terraform/communicator/remote"
"github.com/hashicorp/terraform/terraform"
Remove LGPL dependencies This changeset performs the following: - Updates `masterzen/winrm` vendor to include change from (https://github.com/masterzen/winrm/pull/73) - Updates `dylanmei/winrmtest` vendor to include change from (https://github.com/dylanmei/winrmtest/pull/4) - Updates `packer-community/winrmcp` vendor to include the removal of the `masterzen/winrm/winrm` sub-class as a result of the `winrm` CLI tool being removed from the `masterzen/winrm` repository. - Changes `communicator/winrm/communicator.go` to conform to the new ABI in the `masterzen/winrm` library. This should completely remove any LGPL licensed dependencies inside of the Terraform project. ``` $ make test ==> Checking that code complies with gofmt requirements... go generate $(go list ./... | grep -v /terraform/vendor/) 2017/08/20 13:40:16 Generated command/internal_plugin_list.go go test -i $(go list ./... | grep -v '/terraform/vendor/' | grep -v '/builtin/bins/') || exit 1 echo $(go list ./... | grep -v '/terraform/vendor/' | grep -v '/builtin/bins/') | \ xargs -t -n4 go test -timeout=60s -parallel=4 go test -timeout=60s -parallel=4 github.com/hashicorp/terraform github.com/hashicorp/terraform/backend github.com/hashicorp/terraform/backend/atlas github.com/hashicorp/terraform/backend/init ok github.com/hashicorp/terraform 0.011s ok github.com/hashicorp/terraform/backend 0.020s ok github.com/hashicorp/terraform/backend/atlas 0.634s ok github.com/hashicorp/terraform/backend/init 0.007s go test -timeout=60s -parallel=4 github.com/hashicorp/terraform/backend/legacy github.com/hashicorp/terraform/backend/local github.com/hashicorp/terraform/backend/remote-state github.com/hashicorp/terraf orm/backend/remote-state/azure ok github.com/hashicorp/terraform/backend/legacy 0.009s ok github.com/hashicorp/terraform/backend/local 0.211s ok github.com/hashicorp/terraform/backend/remote-state 0.006s ok github.com/hashicorp/terraform/backend/remote-state/azure 0.010s go test -timeout=60s -parallel=4 github.com/hashicorp/terraform/backend/remote-state/consul github.com/hashicorp/terraform/backend/remote-state/inmem github.com/hashicorp/terraform/backend/remote-state/s 3 github.com/hashicorp/terraform/backend/remote-state/swift ok github.com/hashicorp/terraform/backend/remote-state/consul 0.007s ok github.com/hashicorp/terraform/backend/remote-state/inmem 0.013s ok github.com/hashicorp/terraform/backend/remote-state/s3 0.007s ok github.com/hashicorp/terraform/backend/remote-state/swift 0.013s go test -timeout=60s -parallel=4 github.com/hashicorp/terraform/builtin/providers/test github.com/hashicorp/terraform/builtin/provisioners/chef github.com/hashicorp/terraform/builtin/provisioners/file gi thub.com/hashicorp/terraform/builtin/provisioners/local-exec ok github.com/hashicorp/terraform/builtin/providers/test 1.544s ok github.com/hashicorp/terraform/builtin/provisioners/chef 0.017s ok github.com/hashicorp/terraform/builtin/provisioners/file 0.006s ok github.com/hashicorp/terraform/builtin/provisioners/local-exec 0.078s go test -timeout=60s -parallel=4 github.com/hashicorp/terraform/builtin/provisioners/remote-exec github.com/hashicorp/terraform/builtin/provisioners/salt-masterless github.com/hashicorp/terraform/command github.com/hashicorp/terraform/command/clistate ok github.com/hashicorp/terraform/builtin/provisioners/remote-exec 1.037s ok github.com/hashicorp/terraform/builtin/provisioners/salt-masterless 0.008s ok github.com/hashicorp/terraform/command 14.589s ? github.com/hashicorp/terraform/command/clistate [no test files] go test -timeout=60s -parallel=4 github.com/hashicorp/terraform/command/e2etest github.com/hashicorp/terraform/command/format github.com/hashicorp/terraform/communicator github.com/hashicorp/terraform/co mmunicator/remote ok github.com/hashicorp/terraform/command/e2etest 3.729s ok github.com/hashicorp/terraform/command/format 0.004s ok github.com/hashicorp/terraform/communicator 0.005s ok github.com/hashicorp/terraform/communicator/remote 0.003s [no tests to run] go test -timeout=60s -parallel=4 github.com/hashicorp/terraform/communicator/shared github.com/hashicorp/terraform/communicator/ssh github.com/hashicorp/terraform/communicator/winrm github.com/hashicorp/ terraform/config ok github.com/hashicorp/terraform/communicator/shared 0.007s ok github.com/hashicorp/terraform/communicator/ssh 0.016s ok github.com/hashicorp/terraform/communicator/winrm 0.018s ok github.com/hashicorp/terraform/config 0.213s go test -timeout=60s -parallel=4 github.com/hashicorp/terraform/config/module github.com/hashicorp/terraform/dag github.com/hashicorp/terraform/digraph github.com/hashicorp/terraform/flatmap ok github.com/hashicorp/terraform/config/module 0.044s ok github.com/hashicorp/terraform/dag 0.010s ok github.com/hashicorp/terraform/digraph 0.002s ok github.com/hashicorp/terraform/flatmap 0.002s go test -timeout=60s -parallel=4 github.com/hashicorp/terraform/helper/acctest github.com/hashicorp/terraform/helper/config github.com/hashicorp/terraform/helper/copy github.com/hashicorp/terraform/helpe r/diff ? github.com/hashicorp/terraform/helper/acctest [no test files] ok github.com/hashicorp/terraform/helper/config 0.005s ? github.com/hashicorp/terraform/helper/copy [no test files] ok github.com/hashicorp/terraform/helper/diff 0.005s go test -timeout=60s -parallel=4 github.com/hashicorp/terraform/helper/encryption github.com/hashicorp/terraform/helper/experiment github.com/hashicorp/terraform/helper/hashcode github.com/hashicorp/terr aform/helper/hilmapstructure ? github.com/hashicorp/terraform/helper/encryption [no test files] ok github.com/hashicorp/terraform/helper/experiment 0.001s ok github.com/hashicorp/terraform/helper/hashcode 0.001s ? github.com/hashicorp/terraform/helper/hilmapstructure [no test files] go test -timeout=60s -parallel=4 github.com/hashicorp/terraform/helper/logging github.com/hashicorp/terraform/helper/mutexkv github.com/hashicorp/terraform/helper/pathorcontents github.com/hashicorp/terr aform/helper/resource ? github.com/hashicorp/terraform/helper/logging [no test files] ok github.com/hashicorp/terraform/helper/mutexkv 0.055s ok github.com/hashicorp/terraform/helper/pathorcontents 0.002s ok github.com/hashicorp/terraform/helper/resource 2.659s go test -timeout=60s -parallel=4 github.com/hashicorp/terraform/helper/schema github.com/hashicorp/terraform/helper/shadow github.com/hashicorp/terraform/helper/signalwrapper github.com/hashicorp/terrafo rm/helper/slowmessage ok github.com/hashicorp/terraform/helper/schema 0.063s ok github.com/hashicorp/terraform/helper/shadow 0.156s ok github.com/hashicorp/terraform/helper/signalwrapper 0.022s ok github.com/hashicorp/terraform/helper/slowmessage 0.102s go test -timeout=60s -parallel=4 github.com/hashicorp/terraform/helper/structure github.com/hashicorp/terraform/helper/validation github.com/hashicorp/terraform/helper/variables github.com/hashicorp/terr aform/helper/wrappedreadline ok github.com/hashicorp/terraform/helper/structure 0.004s ok github.com/hashicorp/terraform/helper/validation 0.004s ok github.com/hashicorp/terraform/helper/variables 0.006s ? github.com/hashicorp/terraform/helper/wrappedreadline [no test files] go test -timeout=60s -parallel=4 github.com/hashicorp/terraform/helper/wrappedstreams github.com/hashicorp/terraform/moduledeps github.com/hashicorp/terraform/plugin github.com/hashicorp/terraform/plugin /discovery ? github.com/hashicorp/terraform/helper/wrappedstreams [no test files] ok github.com/hashicorp/terraform/moduledeps 0.004s ok github.com/hashicorp/terraform/plugin 0.046s ok github.com/hashicorp/terraform/plugin/discovery 0.029s go test -timeout=60s -parallel=4 github.com/hashicorp/terraform/repl github.com/hashicorp/terraform/scripts github.com/hashicorp/terraform/state github.com/hashicorp/terraform/state/remote ok github.com/hashicorp/terraform/repl 0.006s ok github.com/hashicorp/terraform/scripts 0.008s ok github.com/hashicorp/terraform/state 2.617s ok github.com/hashicorp/terraform/state/remote 0.025s go test -timeout=60s -parallel=4 github.com/hashicorp/terraform/terraform github.com/hashicorp/terraform/tools/terraform-bundle go test -timeout=60s -parallel=4 github.com/hashicorp/terraform/terraform github.com/hashicorp/terraform/tools/terraform-bundle ok github.com/hashicorp/terraform/terraform 4.222s ? github.com/hashicorp/terraform/tools/terraform-bundle [no test files] ```
2017-08-20 19:53:48 +02:00
"github.com/masterzen/winrm"
2015-04-10 20:34:46 +02:00
"github.com/packer-community/winrmcp/winrmcp"
2015-05-01 22:28:12 +02:00
// This import is a bit strange, but it's needed so `make updatedeps` can see and download it
_ "github.com/dylanmei/winrmtest"
2015-04-10 20:34:46 +02:00
)
// Communicator represents the WinRM communicator
type Communicator struct {
connInfo *connectionInfo
client *winrm.Client
endpoint *winrm.Endpoint
rand *rand.Rand
2015-04-10 20:34:46 +02:00
}
// New creates a new communicator implementation over WinRM.
func New(s *terraform.InstanceState) (*Communicator, error) {
connInfo, err := parseConnectionInfo(s)
if err != nil {
return nil, err
}
endpoint := &winrm.Endpoint{
Host: connInfo.Host,
Port: connInfo.Port,
HTTPS: connInfo.HTTPS,
Insecure: connInfo.Insecure,
Remove LGPL dependencies This changeset performs the following: - Updates `masterzen/winrm` vendor to include change from (https://github.com/masterzen/winrm/pull/73) - Updates `dylanmei/winrmtest` vendor to include change from (https://github.com/dylanmei/winrmtest/pull/4) - Updates `packer-community/winrmcp` vendor to include the removal of the `masterzen/winrm/winrm` sub-class as a result of the `winrm` CLI tool being removed from the `masterzen/winrm` repository. - Changes `communicator/winrm/communicator.go` to conform to the new ABI in the `masterzen/winrm` library. This should completely remove any LGPL licensed dependencies inside of the Terraform project. ``` $ make test ==> Checking that code complies with gofmt requirements... go generate $(go list ./... | grep -v /terraform/vendor/) 2017/08/20 13:40:16 Generated command/internal_plugin_list.go go test -i $(go list ./... | grep -v '/terraform/vendor/' | grep -v '/builtin/bins/') || exit 1 echo $(go list ./... | grep -v '/terraform/vendor/' | grep -v '/builtin/bins/') | \ xargs -t -n4 go test -timeout=60s -parallel=4 go test -timeout=60s -parallel=4 github.com/hashicorp/terraform github.com/hashicorp/terraform/backend github.com/hashicorp/terraform/backend/atlas github.com/hashicorp/terraform/backend/init ok github.com/hashicorp/terraform 0.011s ok github.com/hashicorp/terraform/backend 0.020s ok github.com/hashicorp/terraform/backend/atlas 0.634s ok github.com/hashicorp/terraform/backend/init 0.007s go test -timeout=60s -parallel=4 github.com/hashicorp/terraform/backend/legacy github.com/hashicorp/terraform/backend/local github.com/hashicorp/terraform/backend/remote-state github.com/hashicorp/terraf orm/backend/remote-state/azure ok github.com/hashicorp/terraform/backend/legacy 0.009s ok github.com/hashicorp/terraform/backend/local 0.211s ok github.com/hashicorp/terraform/backend/remote-state 0.006s ok github.com/hashicorp/terraform/backend/remote-state/azure 0.010s go test -timeout=60s -parallel=4 github.com/hashicorp/terraform/backend/remote-state/consul github.com/hashicorp/terraform/backend/remote-state/inmem github.com/hashicorp/terraform/backend/remote-state/s 3 github.com/hashicorp/terraform/backend/remote-state/swift ok github.com/hashicorp/terraform/backend/remote-state/consul 0.007s ok github.com/hashicorp/terraform/backend/remote-state/inmem 0.013s ok github.com/hashicorp/terraform/backend/remote-state/s3 0.007s ok github.com/hashicorp/terraform/backend/remote-state/swift 0.013s go test -timeout=60s -parallel=4 github.com/hashicorp/terraform/builtin/providers/test github.com/hashicorp/terraform/builtin/provisioners/chef github.com/hashicorp/terraform/builtin/provisioners/file gi thub.com/hashicorp/terraform/builtin/provisioners/local-exec ok github.com/hashicorp/terraform/builtin/providers/test 1.544s ok github.com/hashicorp/terraform/builtin/provisioners/chef 0.017s ok github.com/hashicorp/terraform/builtin/provisioners/file 0.006s ok github.com/hashicorp/terraform/builtin/provisioners/local-exec 0.078s go test -timeout=60s -parallel=4 github.com/hashicorp/terraform/builtin/provisioners/remote-exec github.com/hashicorp/terraform/builtin/provisioners/salt-masterless github.com/hashicorp/terraform/command github.com/hashicorp/terraform/command/clistate ok github.com/hashicorp/terraform/builtin/provisioners/remote-exec 1.037s ok github.com/hashicorp/terraform/builtin/provisioners/salt-masterless 0.008s ok github.com/hashicorp/terraform/command 14.589s ? github.com/hashicorp/terraform/command/clistate [no test files] go test -timeout=60s -parallel=4 github.com/hashicorp/terraform/command/e2etest github.com/hashicorp/terraform/command/format github.com/hashicorp/terraform/communicator github.com/hashicorp/terraform/co mmunicator/remote ok github.com/hashicorp/terraform/command/e2etest 3.729s ok github.com/hashicorp/terraform/command/format 0.004s ok github.com/hashicorp/terraform/communicator 0.005s ok github.com/hashicorp/terraform/communicator/remote 0.003s [no tests to run] go test -timeout=60s -parallel=4 github.com/hashicorp/terraform/communicator/shared github.com/hashicorp/terraform/communicator/ssh github.com/hashicorp/terraform/communicator/winrm github.com/hashicorp/ terraform/config ok github.com/hashicorp/terraform/communicator/shared 0.007s ok github.com/hashicorp/terraform/communicator/ssh 0.016s ok github.com/hashicorp/terraform/communicator/winrm 0.018s ok github.com/hashicorp/terraform/config 0.213s go test -timeout=60s -parallel=4 github.com/hashicorp/terraform/config/module github.com/hashicorp/terraform/dag github.com/hashicorp/terraform/digraph github.com/hashicorp/terraform/flatmap ok github.com/hashicorp/terraform/config/module 0.044s ok github.com/hashicorp/terraform/dag 0.010s ok github.com/hashicorp/terraform/digraph 0.002s ok github.com/hashicorp/terraform/flatmap 0.002s go test -timeout=60s -parallel=4 github.com/hashicorp/terraform/helper/acctest github.com/hashicorp/terraform/helper/config github.com/hashicorp/terraform/helper/copy github.com/hashicorp/terraform/helpe r/diff ? github.com/hashicorp/terraform/helper/acctest [no test files] ok github.com/hashicorp/terraform/helper/config 0.005s ? github.com/hashicorp/terraform/helper/copy [no test files] ok github.com/hashicorp/terraform/helper/diff 0.005s go test -timeout=60s -parallel=4 github.com/hashicorp/terraform/helper/encryption github.com/hashicorp/terraform/helper/experiment github.com/hashicorp/terraform/helper/hashcode github.com/hashicorp/terr aform/helper/hilmapstructure ? github.com/hashicorp/terraform/helper/encryption [no test files] ok github.com/hashicorp/terraform/helper/experiment 0.001s ok github.com/hashicorp/terraform/helper/hashcode 0.001s ? github.com/hashicorp/terraform/helper/hilmapstructure [no test files] go test -timeout=60s -parallel=4 github.com/hashicorp/terraform/helper/logging github.com/hashicorp/terraform/helper/mutexkv github.com/hashicorp/terraform/helper/pathorcontents github.com/hashicorp/terr aform/helper/resource ? github.com/hashicorp/terraform/helper/logging [no test files] ok github.com/hashicorp/terraform/helper/mutexkv 0.055s ok github.com/hashicorp/terraform/helper/pathorcontents 0.002s ok github.com/hashicorp/terraform/helper/resource 2.659s go test -timeout=60s -parallel=4 github.com/hashicorp/terraform/helper/schema github.com/hashicorp/terraform/helper/shadow github.com/hashicorp/terraform/helper/signalwrapper github.com/hashicorp/terrafo rm/helper/slowmessage ok github.com/hashicorp/terraform/helper/schema 0.063s ok github.com/hashicorp/terraform/helper/shadow 0.156s ok github.com/hashicorp/terraform/helper/signalwrapper 0.022s ok github.com/hashicorp/terraform/helper/slowmessage 0.102s go test -timeout=60s -parallel=4 github.com/hashicorp/terraform/helper/structure github.com/hashicorp/terraform/helper/validation github.com/hashicorp/terraform/helper/variables github.com/hashicorp/terr aform/helper/wrappedreadline ok github.com/hashicorp/terraform/helper/structure 0.004s ok github.com/hashicorp/terraform/helper/validation 0.004s ok github.com/hashicorp/terraform/helper/variables 0.006s ? github.com/hashicorp/terraform/helper/wrappedreadline [no test files] go test -timeout=60s -parallel=4 github.com/hashicorp/terraform/helper/wrappedstreams github.com/hashicorp/terraform/moduledeps github.com/hashicorp/terraform/plugin github.com/hashicorp/terraform/plugin /discovery ? github.com/hashicorp/terraform/helper/wrappedstreams [no test files] ok github.com/hashicorp/terraform/moduledeps 0.004s ok github.com/hashicorp/terraform/plugin 0.046s ok github.com/hashicorp/terraform/plugin/discovery 0.029s go test -timeout=60s -parallel=4 github.com/hashicorp/terraform/repl github.com/hashicorp/terraform/scripts github.com/hashicorp/terraform/state github.com/hashicorp/terraform/state/remote ok github.com/hashicorp/terraform/repl 0.006s ok github.com/hashicorp/terraform/scripts 0.008s ok github.com/hashicorp/terraform/state 2.617s ok github.com/hashicorp/terraform/state/remote 0.025s go test -timeout=60s -parallel=4 github.com/hashicorp/terraform/terraform github.com/hashicorp/terraform/tools/terraform-bundle go test -timeout=60s -parallel=4 github.com/hashicorp/terraform/terraform github.com/hashicorp/terraform/tools/terraform-bundle ok github.com/hashicorp/terraform/terraform 4.222s ? github.com/hashicorp/terraform/tools/terraform-bundle [no test files] ```
2017-08-20 19:53:48 +02:00
}
if len(connInfo.CACert) > 0 {
endpoint.CACert = []byte(connInfo.CACert)
2015-04-10 20:34:46 +02:00
}
comm := &Communicator{
connInfo: connInfo,
endpoint: endpoint,
// Seed our own rand source so that script paths are not deterministic
rand: rand.New(rand.NewSource(time.Now().UnixNano())),
2015-04-10 20:34:46 +02:00
}
return comm, nil
}
// Connect implementation of communicator.Communicator interface
func (c *Communicator) Connect(o terraform.UIOutput) error {
if c.client != nil {
return nil
}
Remove LGPL dependencies This changeset performs the following: - Updates `masterzen/winrm` vendor to include change from (https://github.com/masterzen/winrm/pull/73) - Updates `dylanmei/winrmtest` vendor to include change from (https://github.com/dylanmei/winrmtest/pull/4) - Updates `packer-community/winrmcp` vendor to include the removal of the `masterzen/winrm/winrm` sub-class as a result of the `winrm` CLI tool being removed from the `masterzen/winrm` repository. - Changes `communicator/winrm/communicator.go` to conform to the new ABI in the `masterzen/winrm` library. This should completely remove any LGPL licensed dependencies inside of the Terraform project. ``` $ make test ==> Checking that code complies with gofmt requirements... go generate $(go list ./... | grep -v /terraform/vendor/) 2017/08/20 13:40:16 Generated command/internal_plugin_list.go go test -i $(go list ./... | grep -v '/terraform/vendor/' | grep -v '/builtin/bins/') || exit 1 echo $(go list ./... | grep -v '/terraform/vendor/' | grep -v '/builtin/bins/') | \ xargs -t -n4 go test -timeout=60s -parallel=4 go test -timeout=60s -parallel=4 github.com/hashicorp/terraform github.com/hashicorp/terraform/backend github.com/hashicorp/terraform/backend/atlas github.com/hashicorp/terraform/backend/init ok github.com/hashicorp/terraform 0.011s ok github.com/hashicorp/terraform/backend 0.020s ok github.com/hashicorp/terraform/backend/atlas 0.634s ok github.com/hashicorp/terraform/backend/init 0.007s go test -timeout=60s -parallel=4 github.com/hashicorp/terraform/backend/legacy github.com/hashicorp/terraform/backend/local github.com/hashicorp/terraform/backend/remote-state github.com/hashicorp/terraf orm/backend/remote-state/azure ok github.com/hashicorp/terraform/backend/legacy 0.009s ok github.com/hashicorp/terraform/backend/local 0.211s ok github.com/hashicorp/terraform/backend/remote-state 0.006s ok github.com/hashicorp/terraform/backend/remote-state/azure 0.010s go test -timeout=60s -parallel=4 github.com/hashicorp/terraform/backend/remote-state/consul github.com/hashicorp/terraform/backend/remote-state/inmem github.com/hashicorp/terraform/backend/remote-state/s 3 github.com/hashicorp/terraform/backend/remote-state/swift ok github.com/hashicorp/terraform/backend/remote-state/consul 0.007s ok github.com/hashicorp/terraform/backend/remote-state/inmem 0.013s ok github.com/hashicorp/terraform/backend/remote-state/s3 0.007s ok github.com/hashicorp/terraform/backend/remote-state/swift 0.013s go test -timeout=60s -parallel=4 github.com/hashicorp/terraform/builtin/providers/test github.com/hashicorp/terraform/builtin/provisioners/chef github.com/hashicorp/terraform/builtin/provisioners/file gi thub.com/hashicorp/terraform/builtin/provisioners/local-exec ok github.com/hashicorp/terraform/builtin/providers/test 1.544s ok github.com/hashicorp/terraform/builtin/provisioners/chef 0.017s ok github.com/hashicorp/terraform/builtin/provisioners/file 0.006s ok github.com/hashicorp/terraform/builtin/provisioners/local-exec 0.078s go test -timeout=60s -parallel=4 github.com/hashicorp/terraform/builtin/provisioners/remote-exec github.com/hashicorp/terraform/builtin/provisioners/salt-masterless github.com/hashicorp/terraform/command github.com/hashicorp/terraform/command/clistate ok github.com/hashicorp/terraform/builtin/provisioners/remote-exec 1.037s ok github.com/hashicorp/terraform/builtin/provisioners/salt-masterless 0.008s ok github.com/hashicorp/terraform/command 14.589s ? github.com/hashicorp/terraform/command/clistate [no test files] go test -timeout=60s -parallel=4 github.com/hashicorp/terraform/command/e2etest github.com/hashicorp/terraform/command/format github.com/hashicorp/terraform/communicator github.com/hashicorp/terraform/co mmunicator/remote ok github.com/hashicorp/terraform/command/e2etest 3.729s ok github.com/hashicorp/terraform/command/format 0.004s ok github.com/hashicorp/terraform/communicator 0.005s ok github.com/hashicorp/terraform/communicator/remote 0.003s [no tests to run] go test -timeout=60s -parallel=4 github.com/hashicorp/terraform/communicator/shared github.com/hashicorp/terraform/communicator/ssh github.com/hashicorp/terraform/communicator/winrm github.com/hashicorp/ terraform/config ok github.com/hashicorp/terraform/communicator/shared 0.007s ok github.com/hashicorp/terraform/communicator/ssh 0.016s ok github.com/hashicorp/terraform/communicator/winrm 0.018s ok github.com/hashicorp/terraform/config 0.213s go test -timeout=60s -parallel=4 github.com/hashicorp/terraform/config/module github.com/hashicorp/terraform/dag github.com/hashicorp/terraform/digraph github.com/hashicorp/terraform/flatmap ok github.com/hashicorp/terraform/config/module 0.044s ok github.com/hashicorp/terraform/dag 0.010s ok github.com/hashicorp/terraform/digraph 0.002s ok github.com/hashicorp/terraform/flatmap 0.002s go test -timeout=60s -parallel=4 github.com/hashicorp/terraform/helper/acctest github.com/hashicorp/terraform/helper/config github.com/hashicorp/terraform/helper/copy github.com/hashicorp/terraform/helpe r/diff ? github.com/hashicorp/terraform/helper/acctest [no test files] ok github.com/hashicorp/terraform/helper/config 0.005s ? github.com/hashicorp/terraform/helper/copy [no test files] ok github.com/hashicorp/terraform/helper/diff 0.005s go test -timeout=60s -parallel=4 github.com/hashicorp/terraform/helper/encryption github.com/hashicorp/terraform/helper/experiment github.com/hashicorp/terraform/helper/hashcode github.com/hashicorp/terr aform/helper/hilmapstructure ? github.com/hashicorp/terraform/helper/encryption [no test files] ok github.com/hashicorp/terraform/helper/experiment 0.001s ok github.com/hashicorp/terraform/helper/hashcode 0.001s ? github.com/hashicorp/terraform/helper/hilmapstructure [no test files] go test -timeout=60s -parallel=4 github.com/hashicorp/terraform/helper/logging github.com/hashicorp/terraform/helper/mutexkv github.com/hashicorp/terraform/helper/pathorcontents github.com/hashicorp/terr aform/helper/resource ? github.com/hashicorp/terraform/helper/logging [no test files] ok github.com/hashicorp/terraform/helper/mutexkv 0.055s ok github.com/hashicorp/terraform/helper/pathorcontents 0.002s ok github.com/hashicorp/terraform/helper/resource 2.659s go test -timeout=60s -parallel=4 github.com/hashicorp/terraform/helper/schema github.com/hashicorp/terraform/helper/shadow github.com/hashicorp/terraform/helper/signalwrapper github.com/hashicorp/terrafo rm/helper/slowmessage ok github.com/hashicorp/terraform/helper/schema 0.063s ok github.com/hashicorp/terraform/helper/shadow 0.156s ok github.com/hashicorp/terraform/helper/signalwrapper 0.022s ok github.com/hashicorp/terraform/helper/slowmessage 0.102s go test -timeout=60s -parallel=4 github.com/hashicorp/terraform/helper/structure github.com/hashicorp/terraform/helper/validation github.com/hashicorp/terraform/helper/variables github.com/hashicorp/terr aform/helper/wrappedreadline ok github.com/hashicorp/terraform/helper/structure 0.004s ok github.com/hashicorp/terraform/helper/validation 0.004s ok github.com/hashicorp/terraform/helper/variables 0.006s ? github.com/hashicorp/terraform/helper/wrappedreadline [no test files] go test -timeout=60s -parallel=4 github.com/hashicorp/terraform/helper/wrappedstreams github.com/hashicorp/terraform/moduledeps github.com/hashicorp/terraform/plugin github.com/hashicorp/terraform/plugin /discovery ? github.com/hashicorp/terraform/helper/wrappedstreams [no test files] ok github.com/hashicorp/terraform/moduledeps 0.004s ok github.com/hashicorp/terraform/plugin 0.046s ok github.com/hashicorp/terraform/plugin/discovery 0.029s go test -timeout=60s -parallel=4 github.com/hashicorp/terraform/repl github.com/hashicorp/terraform/scripts github.com/hashicorp/terraform/state github.com/hashicorp/terraform/state/remote ok github.com/hashicorp/terraform/repl 0.006s ok github.com/hashicorp/terraform/scripts 0.008s ok github.com/hashicorp/terraform/state 2.617s ok github.com/hashicorp/terraform/state/remote 0.025s go test -timeout=60s -parallel=4 github.com/hashicorp/terraform/terraform github.com/hashicorp/terraform/tools/terraform-bundle go test -timeout=60s -parallel=4 github.com/hashicorp/terraform/terraform github.com/hashicorp/terraform/tools/terraform-bundle ok github.com/hashicorp/terraform/terraform 4.222s ? github.com/hashicorp/terraform/tools/terraform-bundle [no test files] ```
2017-08-20 19:53:48 +02:00
params := winrm.DefaultParameters
2015-04-10 20:34:46 +02:00
params.Timeout = formatDuration(c.Timeout())
client, err := winrm.NewClientWithParameters(
c.endpoint, c.connInfo.User, c.connInfo.Password, params)
if err != nil {
return err
}
if o != nil {
o.Output(fmt.Sprintf(
"Connecting to remote host via WinRM...\n"+
" Host: %s\n"+
" Port: %d\n"+
" User: %s\n"+
" Password: %t\n"+
" HTTPS: %t\n"+
" Insecure: %t\n"+
" CACert: %t",
c.connInfo.Host,
c.connInfo.Port,
c.connInfo.User,
c.connInfo.Password != "",
c.connInfo.HTTPS,
c.connInfo.Insecure,
c.connInfo.CACert != "",
2015-04-10 20:34:46 +02:00
))
}
log.Printf("connecting to remote shell using WinRM")
shell, err := client.CreateShell()
if err != nil {
log.Printf("connection error: %s", err)
return err
}
err = shell.Close()
if err != nil {
log.Printf("error closing connection: %s", err)
return err
}
if o != nil {
o.Output("Connected!")
}
c.client = client
return nil
}
// Disconnect implementation of communicator.Communicator interface
func (c *Communicator) Disconnect() error {
c.client = nil
return nil
}
// Timeout implementation of communicator.Communicator interface
func (c *Communicator) Timeout() time.Duration {
return c.connInfo.TimeoutVal
}
// ScriptPath implementation of communicator.Communicator interface
func (c *Communicator) ScriptPath() string {
return strings.Replace(
c.connInfo.ScriptPath, "%RAND%",
strconv.FormatInt(int64(c.rand.Int31()), 10), -1)
2015-04-10 20:34:46 +02:00
}
// Start implementation of communicator.Communicator interface
func (c *Communicator) Start(rc *remote.Cmd) error {
err := c.Connect(nil)
if err != nil {
return err
}
shell, err := c.client.CreateShell()
if err != nil {
return err
}
log.Printf("starting remote command: %s", rc.Command)
2015-04-10 20:34:46 +02:00
cmd, err := shell.Execute(rc.Command)
if err != nil {
return err
}
go runCommand(shell, cmd, rc)
return nil
}
func runCommand(shell *winrm.Shell, cmd *winrm.Command, rc *remote.Cmd) {
defer shell.Close()
communicator/winrm: fix data race in io copy As the command completes, the winrm.Command does not wait for its copy of the remote.Command streams to report itself completed. This adds an additional sync.WaitGroup to ensure that copy is finished up before moving on, solving the data race. Fixes the following data race: ``` ================== WARNING: DATA RACE Read by goroutine 6: github.com/hashicorp/terraform/communicator/winrm.TestStart() /Users/phinze/go/src/github.com/hashicorp/terraform/communicator/winrm/communicator_test.go:79 +0xa44 testing.tRunner() /private/var/folders/vd/7l9ys5k57l91x63sh28wl_kc0000gn/T/workdir/go/src/testing/testing.go:456 +0xdc Previous write by goroutine 14: bytes.(*Buffer).ReadFrom() /private/var/folders/vd/7l9ys5k57l91x63sh28wl_kc0000gn/T/workdir/go/src/bytes/buffer.go:174 +0x465 io.copyBuffer() /private/var/folders/vd/7l9ys5k57l91x63sh28wl_kc0000gn/T/workdir/go/src/io/io.go:375 +0x1a5 io.Copy() /private/var/folders/vd/7l9ys5k57l91x63sh28wl_kc0000gn/T/workdir/go/src/io/io.go:351 +0x78 Goroutine 6 (running) created at: testing.RunTests() /private/var/folders/vd/7l9ys5k57l91x63sh28wl_kc0000gn/T/workdir/go/src/testing/testing.go:561 +0xaa3 testing.(*M).Run() /private/var/folders/vd/7l9ys5k57l91x63sh28wl_kc0000gn/T/workdir/go/src/testing/testing.go:494 +0xe4 main.main() github.com/hashicorp/terraform/communicator/winrm/_test/_testmain.go:62 +0x20f Goroutine 14 (finished) created at: github.com/hashicorp/terraform/communicator/winrm.runCommand() /Users/phinze/go/src/github.com/hashicorp/terraform/communicator/winrm/communicator.go:151 +0xf8 ================== ```
2016-01-16 19:33:24 +01:00
var wg sync.WaitGroup
go func() {
wg.Add(1)
io.Copy(rc.Stdout, cmd.Stdout)
wg.Done()
}()
go func() {
wg.Add(1)
io.Copy(rc.Stderr, cmd.Stderr)
wg.Done()
}()
2015-04-10 20:34:46 +02:00
cmd.Wait()
communicator/winrm: fix data race in io copy As the command completes, the winrm.Command does not wait for its copy of the remote.Command streams to report itself completed. This adds an additional sync.WaitGroup to ensure that copy is finished up before moving on, solving the data race. Fixes the following data race: ``` ================== WARNING: DATA RACE Read by goroutine 6: github.com/hashicorp/terraform/communicator/winrm.TestStart() /Users/phinze/go/src/github.com/hashicorp/terraform/communicator/winrm/communicator_test.go:79 +0xa44 testing.tRunner() /private/var/folders/vd/7l9ys5k57l91x63sh28wl_kc0000gn/T/workdir/go/src/testing/testing.go:456 +0xdc Previous write by goroutine 14: bytes.(*Buffer).ReadFrom() /private/var/folders/vd/7l9ys5k57l91x63sh28wl_kc0000gn/T/workdir/go/src/bytes/buffer.go:174 +0x465 io.copyBuffer() /private/var/folders/vd/7l9ys5k57l91x63sh28wl_kc0000gn/T/workdir/go/src/io/io.go:375 +0x1a5 io.Copy() /private/var/folders/vd/7l9ys5k57l91x63sh28wl_kc0000gn/T/workdir/go/src/io/io.go:351 +0x78 Goroutine 6 (running) created at: testing.RunTests() /private/var/folders/vd/7l9ys5k57l91x63sh28wl_kc0000gn/T/workdir/go/src/testing/testing.go:561 +0xaa3 testing.(*M).Run() /private/var/folders/vd/7l9ys5k57l91x63sh28wl_kc0000gn/T/workdir/go/src/testing/testing.go:494 +0xe4 main.main() github.com/hashicorp/terraform/communicator/winrm/_test/_testmain.go:62 +0x20f Goroutine 14 (finished) created at: github.com/hashicorp/terraform/communicator/winrm.runCommand() /Users/phinze/go/src/github.com/hashicorp/terraform/communicator/winrm/communicator.go:151 +0xf8 ================== ```
2016-01-16 19:33:24 +01:00
wg.Wait()
2015-04-10 20:34:46 +02:00
rc.SetExited(cmd.ExitCode())
}
// Upload implementation of communicator.Communicator interface
func (c *Communicator) Upload(path string, input io.Reader) error {
wcp, err := c.newCopyClient()
if err != nil {
return err
}
log.Printf("Uploading file to '%s'", path)
2015-04-10 20:34:46 +02:00
return wcp.Write(path, input)
}
// UploadScript implementation of communicator.Communicator interface
func (c *Communicator) UploadScript(path string, input io.Reader) error {
return c.Upload(path, input)
}
// UploadDir implementation of communicator.Communicator interface
func (c *Communicator) UploadDir(dst string, src string) error {
log.Printf("Uploading dir '%s' to '%s'", src, dst)
2015-04-10 20:34:46 +02:00
wcp, err := c.newCopyClient()
if err != nil {
return err
}
return wcp.Copy(src, dst)
}
func (c *Communicator) newCopyClient() (*winrmcp.Winrmcp, error) {
addr := fmt.Sprintf("%s:%d", c.endpoint.Host, c.endpoint.Port)
config := winrmcp.Config{
2015-04-10 20:34:46 +02:00
Auth: winrmcp.Auth{
User: c.connInfo.User,
Password: c.connInfo.Password,
},
Https: c.connInfo.HTTPS,
Insecure: c.connInfo.Insecure,
2015-04-10 20:34:46 +02:00
OperationTimeout: c.Timeout(),
MaxOperationsPerShell: 15, // lowest common denominator
}
if c.connInfo.CACert != "" {
config.CACertBytes = []byte(c.connInfo.CACert)
}
return winrmcp.New(addr, &config)
2015-04-10 20:34:46 +02:00
}