github.com/ves/terraform@v0.8.0-beta2/communicator/communicator.go (about) 1 package communicator 2 3 import ( 4 "fmt" 5 "io" 6 "time" 7 8 "github.com/hashicorp/terraform/communicator/remote" 9 "github.com/hashicorp/terraform/communicator/ssh" 10 "github.com/hashicorp/terraform/communicator/winrm" 11 "github.com/hashicorp/terraform/terraform" 12 ) 13 14 // Communicator is an interface that must be implemented by all communicators 15 // used for any of the provisioners 16 type Communicator interface { 17 // Connect is used to setup the connection 18 Connect(terraform.UIOutput) error 19 20 // Disconnect is used to terminate the connection 21 Disconnect() error 22 23 // Timeout returns the configured connection timeout 24 Timeout() time.Duration 25 26 // ScriptPath returns the configured script path 27 ScriptPath() string 28 29 // Start executes a remote command in a new session 30 Start(*remote.Cmd) error 31 32 // Upload is used to upload a single file 33 Upload(string, io.Reader) error 34 35 // UploadScript is used to upload a file as a executable script 36 UploadScript(string, io.Reader) error 37 38 // UploadDir is used to upload a directory 39 UploadDir(string, string) error 40 } 41 42 // New returns a configured Communicator or an error if the connection type is not supported 43 func New(s *terraform.InstanceState) (Communicator, error) { 44 connType := s.Ephemeral.ConnInfo["type"] 45 switch connType { 46 case "ssh", "": // The default connection type is ssh, so if connType is empty use ssh 47 return ssh.New(s) 48 case "winrm": 49 return winrm.New(s) 50 default: 51 return nil, fmt.Errorf("connection type '%s' not supported", connType) 52 } 53 }