@@ -13,6 +13,7 @@ import (
1313 "github.com/docker/machine/libmachine/mcnutils"
1414 "github.com/docker/machine/libmachine/provision/pkgaction"
1515 "github.com/docker/machine/libmachine/provision/serviceaction"
16+ "github.com/docker/machine/libmachine/ssh"
1617 "github.com/docker/machine/libmachine/swarm"
1718)
1819
@@ -43,22 +44,47 @@ type PackageListInfo struct {
4344
4445func init () {
4546 Register ("RedHat" , & RegisteredProvisioner {
46- New : func (d drivers.Driver ) Provisioner {
47- return NewRedHatProvisioner ("rhel" , d )
48- },
47+ New : NewRedHatProvisioner ,
4948 })
5049}
5150
52- func NewRedHatProvisioner (osReleaseID string , d drivers.Driver ) * RedHatProvisioner {
53- systemdProvisioner := NewSystemdProvisioner (osReleaseID , d )
54- systemdProvisioner .SSHCommander = RedHatSSHCommander {Driver : d }
51+ func NewRedHatProvisioner (d drivers.Driver ) Provisioner {
5552 return & RedHatProvisioner {
56- systemdProvisioner ,
53+ GenericProvisioner : GenericProvisioner {
54+ DockerOptionsDir : "/etc/docker" ,
55+ DaemonOptionsFile : "/etc/systemd/system/docker.service" ,
56+ OsReleaseID : "rhel" ,
57+ Packages : []string {
58+ "curl" ,
59+ },
60+ Driver : d ,
61+ },
5762 }
5863}
5964
6065type RedHatProvisioner struct {
61- SystemdProvisioner
66+ GenericProvisioner
67+ }
68+
69+ func (provisioner * RedHatProvisioner ) SSHCommand (args string ) (string , error ) {
70+ client , err := drivers .GetSSHClientFromDriver (provisioner .Driver )
71+ if err != nil {
72+ return "" , err
73+ }
74+
75+ // redhat needs "-t" for tty allocation on ssh therefore we check for the
76+ // external client and add as needed.
77+ // Note: CentOS 7.0 needs multiple "-tt" to force tty allocation when ssh has
78+ // no local tty.
79+ switch c := client .(type ) {
80+ case ssh.ExternalClient :
81+ c .BaseArgs = append (c .BaseArgs , "-tt" )
82+ client = c
83+ case ssh.NativeClient :
84+ return c .OutputWithPty (args )
85+ }
86+
87+ return client .Output (args )
6288}
6389
6490func (provisioner * RedHatProvisioner ) SetHostname (hostname string ) error {
@@ -84,6 +110,31 @@ func (provisioner *RedHatProvisioner) SetHostname(hostname string) error {
84110 return nil
85111}
86112
113+ func (provisioner * RedHatProvisioner ) Service (name string , action serviceaction.ServiceAction ) error {
114+ reloadDaemon := false
115+ switch action {
116+ case serviceaction .Start , serviceaction .Restart :
117+ reloadDaemon = true
118+ }
119+
120+ // systemd needs reloaded when config changes on disk; we cannot
121+ // be sure exactly when it changes from the provisioner so
122+ // we call a reload on every restart to be safe
123+ if reloadDaemon {
124+ if _ , err := provisioner .SSHCommand ("sudo systemctl daemon-reload" ); err != nil {
125+ return err
126+ }
127+ }
128+
129+ command := fmt .Sprintf ("sudo systemctl %s %s" , action .String (), name )
130+
131+ if _ , err := provisioner .SSHCommand (command ); err != nil {
132+ return err
133+ }
134+
135+ return nil
136+ }
137+
87138func (provisioner * RedHatProvisioner ) Package (name string , action pkgaction.PackageAction ) error {
88139 var packageAction string
89140
0 commit comments