diff --git a/devops-service/INSTALL.md b/devops-service/INSTALL.md
new file mode 100644
index 0000000..6a15d63
--- /dev/null
+++ b/devops-service/INSTALL.md
@@ -0,0 +1,235 @@
+Installation guide
+=============
+
+This is the installation guide of the devops server.
+
+## Contents
+
+* [Software requirements](#software)
+ * [RHEL-based systems](#rhel)
+ * [Debian-based systems](#debian)
+* [System users](#users)
+* [Directories](#directories)
+* [RVM](#rvm)
+* [Downloads](#downloads)
+* [Gems](#gems)
+* [SSH configuration](#ssh)
+* [Knife configuration](#knife)
+* [Devops configuration](#clouds)
+ * [Openstack](#cloud_openstack)
+ * [Ec2](#cloud_ec2)
+* [Init script](#init)
+* [Run devops](#run)
+
+
Software requirements
+
+Before installing devops, you should install system requirements: bash, gcc, make, wget, unzip, libxml2, libxslt
+
+RHEL-based systems
+
+ # yum install -y bash gcc make wget unzip gcc-c++ libxml2-devel libxslt-devel
+
+Debian-based systems
+
+ # apt-get install bash gcc make wget unzip g++ libxml2-dev libxslt-dev
+
+System users
+
+Create user devops
+
+ # useradd -m -d /devops --system -s /bin/bash devops
+
+Directories
+
+Create log directory:
+
+ # mkdir -p /var/log/devops
+ # chown devops: /var/log/devops
+
+Create pid directory:
+
+ # mkdir -p /var/run/devops
+ # chown devops: /var/run/devops
+
+Create devops directory:
+
+ # mkdir -p /devops/devops
+ # chown devops: /devops/devops
+
+Create ssh, chef directories:
+
+ # mkdir -p /devops/{.ssh,.chef}
+ # chown devops: /devops/{.ssh,.chef}
+
+Create bootstrap directory
+
+ # mkdir -p /devops/.chef/bootstrap
+ # chown devops: /devops/.chef/bootstrap
+
+Create devops public directory:
+
+ # mkdir -p /devops/devops/public
+ # chown devops: /devops/devops/public
+
+RVM
+
+You should install rvm with ruby 1.9 or use system ruby
+
+Downloads
+
+Download devops-service-master.zip from https://github.com/ggasoftware/devops-service into /tmp
+Unzip devops-service-master.zip
+
+ # unzip /tmp/devops-service-master.zip -d /tmp/
+
+Copy devops-service
+
+ # cp -rf /tmp/devops-service-master/devops-service/* /devops/devops
+ # chown devops: -R /devops/devops
+
+Create client gem
+
+ # cd /tmp/devops-service-master/devops-client/
+ # rake build
+ # cp pkg/devops-client*.gem /devops/devops/public/devops-client.gem
+ # chown devops: /devops/devops/public/devops-client.gem
+
+Gems
+
+Install bundler
+
+ # gem install bundler
+
+Then run bundler
+
+ # cd /devops/devops && bundle install
+
+SSH configuration
+
+ # cat /devops/.ssh/config
+ StrictHostKeyChecking no
+ UserKnownHostsFile /dev/null
+
+Knife configuration
+
+ # cat /devops/.chef/knife.rb
+ log_level :info
+ log_location STDOUT
+ node_name "devops"
+ chef_server_url ""
+ validation_client_name "chef-validator"
+ client_key "/devops/.chef/client.pem"
+ validation_key "/devops/.chef/validation.pem"
+
+Then you should create client 'devops' with admin privileges on your chef server and copy your client.pem and validation.pem into /devops/.chef
+
+ chown devops: /devops/.chef/client.pem
+ chmod 0600 /devops/.chef/client.pem
+ chown devops: /devops/.chef/validation.pem
+ chmod 0600 /devops/.chef/validation.pem
+
+Devops configuration
+
+Devops configuration file is /devops/devops/config.rb
+
+ # cat /devops/devops/config.rb
+ config[:knife_config_file] = "/devops/.chef/knife.rb"
+ config[:role_separator] = "_"
+ config[:mongo_host] = ""
+ config[:mongo_port] = 27017
+ config[:mongo_db] = ""
+ config[:mongo_user] = ""
+ config[:mongo_password] = ""
+ config[:port] = 7070
+ config[:client_file] = "/devops/devops/public/devops-client.gem"
+ config[:public_dir] = "/devops/devops/public"
+
+Openstack
+
+To configure openstack cloud, you should add to /devops/devops/config.rb:
+
+ config[:openstack_username] = ""
+ config[:openstack_api_key] = ""
+ config[:openstack_auth_url] = "http://:5000/v2.0/tokens"
+ config[:openstack_tenant] = ""
+ config[:openstack_ssh_key] = ""
+ config[:openstack_certificate] = "/devops/.ssh/openstack.pem"
+
+And copy your openstack certificate 'openstack.pem' into /devops/.ssh/
+
+Ec2
+
+To configure ec2 cloud, you should add to /devops/devops/config.rb:
+
+ config[:aws_access_key_id] = ""
+ config[:aws_secret_access_key] = ""
+ config[:aws_certificate] = "/devops/.ssh/ec2.pem"
+ config[:aws_availability_zone] = "us-east-1e"
+
+And copy your ec2 certificate 'ec2.pem' into /devops/.ssh/
+
+Init script
+
+ # cat /etc/init.d/devops_service
+ #!/bin/bash
+ #
+ # devops_service: Start/Stop devops service
+ #
+ # chkconfig: - 80 05
+ # description: Enable devops service
+ user=devops
+ devops_home=/devops/devops
+ pid_file=/var/run/devops/devops.pid
+ log_file=/var/log/devops/service.log
+ port=7070
+ env=production
+ start() {
+ echo "Starting devops service"
+ PIDDIR="${pid_file%/?*}"
+ if [ ! -f $PIDDIR ]; then
+ mkdir -p $PIDDIR
+ chown $user $PIDDIR
+ fi
+ su - $user -c "cd $devops_home && bundle exec thin -R $devops_home/config.ru -e $env -d -p $port -t 600 -u $user --pid $pid_file --log $log_file start"
+ return $?
+ }
+ stop() {
+ echo "Stopping devops service"
+ su - $user -c "cd $devops_home && bundle exec thin --pid $pid_file stop"
+ }
+ status() {
+ if [ -f $pid_file ]; then
+ pid=`cat $pid_file`
+ echo "Running with pid: $pid"
+ else
+ echo "Not running"
+ fi
+ return $?
+ }
+ case "$1" in
+ start)
+ start
+ ;;
+ stop)
+ stop
+ ;;
+ restart)
+ stop
+ start
+ ;;
+ status)
+ status
+ ;;
+ *)
+ echo "Usage: $0 (start|stop|restart|status)"
+ exit 1
+ esac
+ exit $?
+
+Run devops
+
+Before run devops, check or disable iptables
+
+ chmod +x /etc/init.d/devops_service
+ /etc/init.d/devops_service start
diff --git a/devops-service/providers/openstack.rb b/devops-service/providers/openstack.rb
index f1043ac..fabdc9b 100644
--- a/devops-service/providers/openstack.rb
+++ b/devops-service/providers/openstack.rb
@@ -125,13 +125,20 @@ puts list[0].inspect
else
out << "\nERROR: Bad request (400): #{response['badRequest']['message']}"
end
+ out << "\n"
return false
else
out << "\nERROR: Unknown server error (#{response['badRequest']['code']}): #{response['badRequest']['message']}"
+ out << "\n"
return false
end
+ rescue Excon::Errors::InternalServerError => ise
+ out << "\nError: openstack internal server error " + ise.message
+ out << "\n"
+ return false
rescue => e2
- out << "Error: Unknown error: " + e.message
+ out << "\nError: Unknown error: " + e2.message
+ out << "\n"
return false
end
sbody = o_server.body