From b9fdff758aed2151c7fa3419c205abb8330b2614 Mon Sep 17 00:00:00 2001 From: Patrick Debois Date: Mon, 27 May 2013 19:26:47 +0200 Subject: [PATCH] [openvz|compute] Initial commit --- Rakefile | 5 + lib/fog.rb | 1 + lib/fog/bin.rb | 1 + lib/fog/bin/openvz.rb | 31 +++ lib/fog/openvz.rb | 9 + lib/fog/openvz/README.md | 188 +++++++++++++++++ lib/fog/openvz/compute.rb | 176 ++++++++++++++++ lib/fog/openvz/models/compute/server.rb | 194 ++++++++++++++++++ lib/fog/openvz/models/compute/servers.rb | 27 +++ .../openvz/requests/compute/compact_server.rb | 21 ++ .../openvz/requests/compute/convert_server.rb | 21 ++ .../openvz/requests/compute/create_server.rb | 23 +++ .../openvz/requests/compute/destroy_server.rb | 21 ++ .../openvz/requests/compute/exec2_server.rb | 21 ++ .../openvz/requests/compute/exec_server.rb | 21 ++ .../requests/compute/get_server_details.rb | 21 ++ .../openvz/requests/compute/list_servers.rb | 21 ++ .../openvz/requests/compute/mount_server.rb | 21 ++ .../requests/compute/quotainit_server.rb | 21 ++ .../requests/compute/quotaoff_server.rb | 21 ++ .../openvz/requests/compute/quotaon_server.rb | 21 ++ .../openvz/requests/compute/restart_server.rb | 24 +++ .../openvz/requests/compute/resume_server.rb | 21 ++ .../requests/compute/runscript_server.rb | 21 ++ lib/fog/openvz/requests/compute/set_server.rb | 27 +++ .../compute/snapshot_delete_server.rb | 21 ++ .../requests/compute/snapshot_list_server.rb | 21 ++ .../requests/compute/snapshot_mount_server.rb | 21 ++ .../requests/compute/snapshot_server.rb | 21 ++ .../compute/snapshot_switch_server.rb | 21 ++ .../compute/snapshot_umount_server.rb | 21 ++ .../openvz/requests/compute/start_server.rb | 24 +++ .../openvz/requests/compute/status_server.rb | 21 ++ .../openvz/requests/compute/stop_server.rb | 24 +++ .../openvz/requests/compute/suspend_server.rb | 21 ++ .../openvz/requests/compute/umount_server.rb | 21 ++ tests/helper.rb | 2 +- tests/openvz/helper.rb | 41 ++++ tests/openvz/models/compute/server_tests.rb | 56 +++++ tests/openvz/models/compute/servers_tests.rb | 35 ++++ 40 files changed, 1349 insertions(+), 1 deletion(-) create mode 100644 lib/fog/bin/openvz.rb create mode 100644 lib/fog/openvz.rb create mode 100644 lib/fog/openvz/README.md create mode 100644 lib/fog/openvz/compute.rb create mode 100644 lib/fog/openvz/models/compute/server.rb create mode 100644 lib/fog/openvz/models/compute/servers.rb create mode 100644 lib/fog/openvz/requests/compute/compact_server.rb create mode 100644 lib/fog/openvz/requests/compute/convert_server.rb create mode 100644 lib/fog/openvz/requests/compute/create_server.rb create mode 100644 lib/fog/openvz/requests/compute/destroy_server.rb create mode 100644 lib/fog/openvz/requests/compute/exec2_server.rb create mode 100644 lib/fog/openvz/requests/compute/exec_server.rb create mode 100644 lib/fog/openvz/requests/compute/get_server_details.rb create mode 100644 lib/fog/openvz/requests/compute/list_servers.rb create mode 100644 lib/fog/openvz/requests/compute/mount_server.rb create mode 100644 lib/fog/openvz/requests/compute/quotainit_server.rb create mode 100644 lib/fog/openvz/requests/compute/quotaoff_server.rb create mode 100644 lib/fog/openvz/requests/compute/quotaon_server.rb create mode 100644 lib/fog/openvz/requests/compute/restart_server.rb create mode 100644 lib/fog/openvz/requests/compute/resume_server.rb create mode 100644 lib/fog/openvz/requests/compute/runscript_server.rb create mode 100644 lib/fog/openvz/requests/compute/set_server.rb create mode 100644 lib/fog/openvz/requests/compute/snapshot_delete_server.rb create mode 100644 lib/fog/openvz/requests/compute/snapshot_list_server.rb create mode 100644 lib/fog/openvz/requests/compute/snapshot_mount_server.rb create mode 100644 lib/fog/openvz/requests/compute/snapshot_server.rb create mode 100644 lib/fog/openvz/requests/compute/snapshot_switch_server.rb create mode 100644 lib/fog/openvz/requests/compute/snapshot_umount_server.rb create mode 100644 lib/fog/openvz/requests/compute/start_server.rb create mode 100644 lib/fog/openvz/requests/compute/status_server.rb create mode 100644 lib/fog/openvz/requests/compute/stop_server.rb create mode 100644 lib/fog/openvz/requests/compute/suspend_server.rb create mode 100644 lib/fog/openvz/requests/compute/umount_server.rb create mode 100644 tests/openvz/helper.rb create mode 100644 tests/openvz/models/compute/server_tests.rb create mode 100644 tests/openvz/models/compute/servers_tests.rb diff --git a/Rakefile b/Rakefile index d1cd1b852..84ea478aa 100644 --- a/Rakefile +++ b/Rakefile @@ -57,6 +57,11 @@ namespace :test do sh("export FOG_MOCK=#{mock} && bundle exec shindont tests/vsphere") end end + task :openvz do + [true].each do |mock| + sh("export FOG_MOCK=#{mock} && bundle exec shindont tests/openvz") + end + end end task :nuke do diff --git a/lib/fog.rb b/lib/fog.rb index d53baf9cd..fb7869307 100644 --- a/lib/fog.rb +++ b/lib/fog.rb @@ -43,4 +43,5 @@ require 'fog/voxel' require 'fog/xenserver' require 'fog/zerigo' require 'fog/cloudsigma' +require 'fog/openvz' diff --git a/lib/fog/bin.rb b/lib/fog/bin.rb index 8cf85fcf0..d37251e45 100644 --- a/lib/fog/bin.rb +++ b/lib/fog/bin.rb @@ -95,3 +95,4 @@ require 'fog/bin/voxel' require 'fog/bin/xenserver' require 'fog/bin/zerigo' require 'fog/bin/cloudsigma' +require 'fog/bin/openvz' diff --git a/lib/fog/bin/openvz.rb b/lib/fog/bin/openvz.rb new file mode 100644 index 000000000..6adcb438f --- /dev/null +++ b/lib/fog/bin/openvz.rb @@ -0,0 +1,31 @@ +class Openvz < Fog::Bin + class << self + + def class_for(key) + case key + when :compute + Fog::Compute::Openvz + else + raise ArgumentError, "Unsupported #{self} service: #{key}" + end + end + + def [](service) + @@connections ||= Hash.new do |hash, key| + hash[key] = case key + when :compute + Fog::Logger.warning("Openvz[:compute] is not recommended, use Compute[:openvz] for portability") + Fog::Compute.new(:provider => 'Openvz') + else + raise ArgumentError, "Unrecognized service: #{key.inspect}" + end + end + @@connections[service] + end + + def services + Fog::Openvz.services + end + + end +end diff --git a/lib/fog/openvz.rb b/lib/fog/openvz.rb new file mode 100644 index 000000000..bd20c46ed --- /dev/null +++ b/lib/fog/openvz.rb @@ -0,0 +1,9 @@ +require 'fog/core' + +module Fog + module Openvz + extend Fog::Provider + service(:compute, 'openvz/compute', 'Compute') + end +end + diff --git a/lib/fog/openvz/README.md b/lib/fog/openvz/README.md new file mode 100644 index 000000000..638ed80f9 --- /dev/null +++ b/lib/fog/openvz/README.md @@ -0,0 +1,188 @@ +# Description +The openvz provider implements a simple mapping between openvz commands and fog + +# Usage +## Establish a connection + openvz = ::Fog::Compute.new( {:provider => 'openvz'}) + +Additional option is **:openvz_connect_command**: +It allows you to specify connect command to connect to the openvz server, if it's not localhost. + +- This is specified as a string where the '@command@' placeholder will be replaced when the commands are executed +- The @command@ will contain double quotes, therefore make sure you use single quotes only inside the placeholder + +To connect to a remote ssh server myopenvzserver and sudo excute the command + + openvz = ::Fog::Compute.new( { + :provider => 'openvz', + :openvz_connect_command => "ssh myopenvzserver 'sudo @command'" + }) + +## List servers + + openvz = ::Fog::Compute.new( {:provider => 'openvz'}) + servers = openvz.servers.all + servers.each do |s| + puts c.ctid + end + +## Server Unique id +Servers have the ctid as identity. + +## Get a specific server + + openvz = ::Fog::Compute.new( {:provider => 'openvz'}) + server = openvz.servers.get(104) + +## Server lifecycle + + openvz = ::Fog::Compute.new( {:provider => 'openvz'}) + # Create a server + server = openvz.servers.create( + :ctid => '104', + :ostemplate => 'ubuntu-12.04-x86_64', + :diskspace => 1024*1024 #in kbyte + ) + server.reload + + # Start a server + unless server.status == 'running' + server.start + end + + server.set({ + :nameserver => '8.8.8.8', + :ipadd => '192.168.8.10', + :ram => '380M', + :hostname => 'wonderfullserver', + :name => 'chef', + :description => 'wonderfullserver', + :save => true + }) + + # Reboot a server + server.reboot + sleep 3 + + # Get the ipaddress + puts "ipaddress: #{server.public_ip_address}" + + server.wait_for { status == 'running' } + + # Stop the server + server.stop + + # Destroy the server + server.destroy + +## Models +Both compute::server and computer::servers (collections) have been implemented + +Note: +- server.save can only be called upon creation, use the server.set command to change the settings +- server.public_ip_address will only return the first ip address +- TODO: snapshots could be implemented as a collection +- server.state has the standard openvz states. +- server.ready? assumes server.status == 'running' + +## Requests +### Passing parameters +The server request are in essence a passthrough to __vzctl__. +Just provide the options as a hash in key,value pairs. +If it's just a switch (like --save), use a key and a boolean(true). + +The following command in plain cli-vzctl: + + vzctl set 104 --nameserver 8.8.8.8 --ipadd 192.168.8.10 --ram '380M' + +Would be in fog-speak: + + server = openvz.servers.get(104) + server.set({ + :nameserver => '8.8.8.8', + :ipadd => '192.168.8.10', + :ram => '380M', + :save => true + }) + +To specify multiple values for the same option pass an array + + server.set({ + :nameserver => ['8.8.8.8','7.7.7.7'], + :ipadd => ['192.168.8.10','192.168.4.10'], + :ram => '380M', + :save => true + }) + +### Passing arguments +both exec, exec2 and runscript take no parameters just arguments + + server = openvz.servers.get(104) + uname_output = server.exec("uname -a") + +### Not implemented +From all the options to vzctl (see below) the following commands have **NOT** been implemented: + +- console : as it requires direct input + +## VZCTL commands + +the current version of the fog openvz driver is based on the following vzctl syntax + + vzctl version 4.3 + Copyright (C) 2000-2012, Parallels, Inc. + This program may be distributed under the terms of the GNU GPL License. + + Usage: vzctl [options] [parameters] + + vzctl create [--ostemplate ] [--config ] + [--layout ploop|simfs] [--hostname ] [--name ] [--ipadd ] + [--diskspace ] [--private ] [--root ] + [--local_uid ] [--local_gid ] + vzctl start [--force] [--wait] + vzctl destroy | mount | umount | stop | restart | status + vzctl convert [--layout ploop[:mode]] [--diskspace ] + vzctl compact + vzctl snapshot [--id ] [--name ] [--description ] + [--skip-suspend] + vzctl snapshot-switch | snapshot-delete --id + vzctl snapshot-mount --id --target + vzctl snapshot-umount --id + vzctl snapshot-list [-H] [-o field[,field...]] [--id ] + vzctl quotaon | quotaoff | quotainit + vzctl console [ttyno] + vzctl enter [--exec [arg ...]] + vzctl exec | exec2 [arg ...] + vzctl runscript