From 3df09689e62beaf18d804d6422a9ca8bff67e87f Mon Sep 17 00:00:00 2001 From: Ruslan Gabitov Date: Tue, 9 Dec 2014 14:08:09 -0800 Subject: [PATCH 1/3] Added support for identity auth in Azure driver Added support for identity auth in Azure driver Signed-off-by: Ruslan Gabitov --- drivers/azure/azure.go | 81 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) diff --git a/drivers/azure/azure.go b/drivers/azure/azure.go index 5895cc4f56..b2bbf37d24 100644 --- a/drivers/azure/azure.go +++ b/drivers/azure/azure.go @@ -224,6 +224,87 @@ func (driver *Driver) Create() error { return err } + if err:= driver.hackForIdentityAuth(); err != nil { + return err + } + + return nil +} + +func (driver *Driver) hackForIdentityAuth() error { + + log.Debugf("HACK: Downloading version of Docker with identity auth...") + + numberOfRetries := 3 + if err:= driver.runSSHCommand("sudo stop docker", numberOfRetries); err != nil { + return err + } + + if err:= driver.runSSHCommand("sudo bash -c \"curl -sS https://bfirsh.s3.amazonaws.com/docker/docker-1.3.1-dev-identity-auth > /usr/bin/docker\"", numberOfRetries); err != nil { + return err + } + + log.Debugf("Updating /etc/default/docker to use identity auth...") + + cmdString := fmt.Sprintf(`sudo bash -c 'cat < /etc/default/docker +export DOCKER_OPTS="--auth=identity --host=tcp://0.0.0.0:%v" +EOF'`, driver.DockerPort) + if err:= driver.runSSHCommand(cmdString, numberOfRetries); err != nil { + return err + } + + log.Debugf("Adding key to authorized-keys.d...") + + if err := driver.addPublicKeyToAuthorizedHosts("/tmp/.docker/authorized-keys.d", numberOfRetries); err != nil { + return err + } + + if err:= driver.runSSHCommand("sudo cp -a /tmp/.docker/ /", numberOfRetries); err != nil { + return err + } + + if err:= driver.runSSHCommand("rm -r /tmp/.docker/", numberOfRetries); err != nil { + return err + } + + if err:= driver.runSSHCommand("sudo start docker", numberOfRetries); err != nil { + return err + } + + return nil +} + +func (driver *Driver) addPublicKeyToAuthorizedHosts(authorizedKeysPath string, retries int) error { + if err := drivers.AddPublicKeyToAuthorizedHosts(driver, authorizedKeysPath ); err != nil { + if err.Error() == "exit status 255" { + if retries == 0 { + return err + } + return driver.addPublicKeyToAuthorizedHosts(authorizedKeysPath, retries -1) + } + + return err + } + + return nil +} + +func (driver *Driver) runSSHCommand(command string, retries int) error { + cmd, err := driver.GetSSHCommand(command) + if err != nil { + return err + } + if err := cmd.Run(); err != nil { + if err.Error() == "exit status 255" { + if retries == 0 { + return err + } + return driver.runSSHCommand(command, retries -1) + } + + return err + } + return nil } From 04382b473054c685d4ff450dc6c086ade78c1069 Mon Sep 17 00:00:00 2001 From: Ruslan Gabitov Date: Tue, 9 Dec 2014 15:20:17 -0800 Subject: [PATCH 2/3] Fix Azure driver with gofmt Fix Azure driver with gofmt Signed-off-by: Ruslan Gabitov --- drivers/azure/azure.go | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/drivers/azure/azure.go b/drivers/azure/azure.go index b2bbf37d24..a2844c7e93 100644 --- a/drivers/azure/azure.go +++ b/drivers/azure/azure.go @@ -224,7 +224,7 @@ func (driver *Driver) Create() error { return err } - if err:= driver.hackForIdentityAuth(); err != nil { + if err := driver.hackForIdentityAuth(); err != nil { return err } @@ -236,11 +236,11 @@ func (driver *Driver) hackForIdentityAuth() error { log.Debugf("HACK: Downloading version of Docker with identity auth...") numberOfRetries := 3 - if err:= driver.runSSHCommand("sudo stop docker", numberOfRetries); err != nil { + if err := driver.runSSHCommand("sudo stop docker", numberOfRetries); err != nil { return err } - if err:= driver.runSSHCommand("sudo bash -c \"curl -sS https://bfirsh.s3.amazonaws.com/docker/docker-1.3.1-dev-identity-auth > /usr/bin/docker\"", numberOfRetries); err != nil { + if err := driver.runSSHCommand("sudo bash -c \"curl -sS https://bfirsh.s3.amazonaws.com/docker/docker-1.3.1-dev-identity-auth > /usr/bin/docker\"", numberOfRetries); err != nil { return err } @@ -249,7 +249,7 @@ func (driver *Driver) hackForIdentityAuth() error { cmdString := fmt.Sprintf(`sudo bash -c 'cat < /etc/default/docker export DOCKER_OPTS="--auth=identity --host=tcp://0.0.0.0:%v" EOF'`, driver.DockerPort) - if err:= driver.runSSHCommand(cmdString, numberOfRetries); err != nil { + if err := driver.runSSHCommand(cmdString, numberOfRetries); err != nil { return err } @@ -259,28 +259,28 @@ EOF'`, driver.DockerPort) return err } - if err:= driver.runSSHCommand("sudo cp -a /tmp/.docker/ /", numberOfRetries); err != nil { + if err := driver.runSSHCommand("sudo cp -a /tmp/.docker/ /", numberOfRetries); err != nil { return err } - if err:= driver.runSSHCommand("rm -r /tmp/.docker/", numberOfRetries); err != nil { + if err := driver.runSSHCommand("rm -r /tmp/.docker/", numberOfRetries); err != nil { return err } - if err:= driver.runSSHCommand("sudo start docker", numberOfRetries); err != nil { + if err := driver.runSSHCommand("sudo start docker", numberOfRetries); err != nil { return err } return nil } -func (driver *Driver) addPublicKeyToAuthorizedHosts(authorizedKeysPath string, retries int) error { - if err := drivers.AddPublicKeyToAuthorizedHosts(driver, authorizedKeysPath ); err != nil { +func (driver *Driver) addPublicKeyToAuthorizedHosts(authorizedKeysPath string, retries int) error { + if err := drivers.AddPublicKeyToAuthorizedHosts(driver, authorizedKeysPath); err != nil { if err.Error() == "exit status 255" { if retries == 0 { return err } - return driver.addPublicKeyToAuthorizedHosts(authorizedKeysPath, retries -1) + return driver.addPublicKeyToAuthorizedHosts(authorizedKeysPath, retries-1) } return err @@ -299,7 +299,7 @@ func (driver *Driver) runSSHCommand(command string, retries int) error { if retries == 0 { return err } - return driver.runSSHCommand(command, retries -1) + return driver.runSSHCommand(command, retries-1) } return err From a644aba70f3023ef1c83ee5d6d12464cff138c5c Mon Sep 17 00:00:00 2001 From: Ruslan Gabitov Date: Tue, 9 Dec 2014 18:48:03 -0800 Subject: [PATCH 3/3] Added comment to Azure driver Added comment explaining retries in hackForIdentityAuth() method Signed-off-by: Ruslan Gabitov --- drivers/azure/azure.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/drivers/azure/azure.go b/drivers/azure/azure.go index a2844c7e93..1e1175098d 100644 --- a/drivers/azure/azure.go +++ b/drivers/azure/azure.go @@ -235,6 +235,11 @@ func (driver *Driver) hackForIdentityAuth() error { log.Debugf("HACK: Downloading version of Docker with identity auth...") + /* We need to add retries to every SSH call we make, because Azure has some weird networking bug: + sometimes when it comes to communication between VMs or with Azure itself, Azure API throws an error. + So when we are running remote commands via SSH, sometimes they fail for no reason. + This issue is fixed by repeating SSH calls few times before throwing an error. + */ numberOfRetries := 3 if err := driver.runSSHCommand("sudo stop docker", numberOfRetries); err != nil { return err