migratio 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 72782d04daa9369d64692d88cbaf87a99c34f142
4
+ data.tar.gz: 87bb9fc2f18780825e8305eecb87775bd5fc3f92
5
+ SHA512:
6
+ metadata.gz: 79d7a6254b2c287e47bd0483affa51dba629a8e86ada70a20aa89db9b59766acd89ab633baeacc458e4e910a2318b41a802fe16324993f1dce47c6f45c00dcec
7
+ data.tar.gz: 991a54d76b02999d04f30a0f6372fe08043189cca98362a40a3bf653627141c3297b865f84f77258e34da2c0836f397a7ae20278b5f5f835596c107df85ab4a4
data/.gitignore ADDED
@@ -0,0 +1,24 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ log/
18
+ tmp
19
+ config.yml
20
+ *.ipr
21
+ *.iws
22
+ *.iml
23
+ .idea/
24
+ nbproject/
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in migration-worker.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Paweł Suder
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,134 @@
1
+ # Migratio
2
+
3
+ This gem is used to perform virtual machine template migration between sites.
4
+
5
+ ## Requirements
6
+
7
+ **This project is designed for Linux operating systems.**
8
+
9
+ - Linux (tested on Ubuntu)
10
+ - Ruby 2.0+
11
+ - Redis (can be installed on separate server)
12
+
13
+ ## Packages / Dependencies
14
+
15
+ Update your system (as root):
16
+
17
+ aptitude update
18
+ aptitude upgrade
19
+
20
+ Install additional packages (as root):
21
+
22
+ aptitude install g++ make autoconf bison build-essential libssl-dev libyaml-dev libreadline6 libreadline6-dev zlib1g zlib1g-dev
23
+
24
+ Install ``ruby`` and ``bundler`` (as root):
25
+
26
+ mkdir /tmp/ruby
27
+ pushd /tmp/ruby
28
+ curl --progress http://ftp.ruby-lang.org/pub/ruby/2.1/ruby-2.1.2.tar.gz | tar xz
29
+ pushd /tmp/ruby/ruby-2.1.2
30
+ ./configure --disable-install-rdoc
31
+ make
32
+ make install
33
+ gem install bundler --no-ri --no-rdoc
34
+ popd
35
+ popd
36
+
37
+ Install this software (as non-root):
38
+
39
+ git clone https://github.com/paoolo/migratio.git /home/atmosphere/migratio
40
+ cd /home/atmosphere/migratio
41
+ cp /home/atmosphere/migratio/config.yml.example /home/atmosphere/migratio/config.yml
42
+
43
+ Edit config file, set proper ``redis_url`` and name first row in queues with proper, unique name:
44
+
45
+ nano /home/atmosphere/migratio/config.yml
46
+
47
+ Install gems:
48
+
49
+ pushd /home/atmosphere/migratio
50
+ bundle install --path vendor/bundle
51
+ popd
52
+
53
+ Enable upstart for non-root user (as root):
54
+
55
+ nano /etc/dbus-1/system.d/Upstart.conf
56
+
57
+ It should looks like this:
58
+
59
+ <?xml version="1.0" encoding="UTF-8" ?>
60
+ <!DOCTYPE busconfig PUBLIC
61
+ "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
62
+ "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
63
+
64
+ <busconfig>
65
+ <!-- Only the root user can own the Upstart name -->
66
+ <policy user="root">
67
+ <allow own="com.ubuntu.Upstart" />
68
+ </policy>
69
+
70
+ <!-- Allow any user to invoke all of the methods on Upstart, its jobs
71
+ or their instances, and to get and set properties - since Upstart
72
+ isolates commands by user. -->
73
+ <policy context="default">
74
+ <allow send_destination="com.ubuntu.Upstart"
75
+ send_interface="org.freedesktop.DBus.Introspectable" />
76
+ <allow send_destination="com.ubuntu.Upstart"
77
+ send_interface="org.freedesktop.DBus.Properties" />
78
+ <allow send_destination="com.ubuntu.Upstart"
79
+ send_interface="com.ubuntu.Upstart0_6" />
80
+ <allow send_destination="com.ubuntu.Upstart"
81
+ send_interface="com.ubuntu.Upstart0_6.Job" />
82
+ <allow send_destination="com.ubuntu.Upstart"
83
+ send_interface="com.ubuntu.Upstart0_6.Instance" />
84
+ </policy>
85
+ </busconfig>
86
+
87
+ Install upstart scripts (as non-root, inside migratio directory):
88
+
89
+ mkdir -p /home/atmosphere/.init
90
+ cp -i /home/atmosphere/migratio/support/upstart/*.conf /home/atmosphere/.init/
91
+
92
+ Set proper directory for ``migratio/`` and ``migratio/log/``:
93
+
94
+ nano /home/atmosphere/.init/migration.conf
95
+ nano /home/atmosphere/.init/migratio-1.conf
96
+
97
+ Update profile files (eg. ``.bash_profile``):
98
+
99
+ cat >> /home/atmosphere/.bash_profile <<EOL
100
+ if [ ! -f /var/run/user/\$(id -u)/upstart/sessions/*.session ]
101
+ then
102
+ /sbin/init --user --confdir \${HOME}/.init &
103
+ fi
104
+
105
+ if [ -f /var/run/user/\$(id -u)/upstart/sessions/*.session ]
106
+ then
107
+ export \$(cat /var/run/user/\$(id -u)/upstart/sessions/*.session)
108
+ fi
109
+ EOL
110
+ # you need to re-login to apply changes in /home/atmosphere/.bash_profile
111
+
112
+ ## Usage
113
+
114
+ First time run (as non-root, inside ``migratio/`` directory):
115
+
116
+ pushd /home/atmosphere/migratio
117
+ bundle exec ./bin/run
118
+ popd
119
+
120
+ Normal run (as non-root):
121
+
122
+ start migration
123
+
124
+ Stop (as non-root):
125
+
126
+ stop migration
127
+
128
+ ## Contributing
129
+
130
+ 1. Fork it!
131
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
132
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
133
+ 4. Push to the branch (`git push origin my-new-feature`)
134
+ 5. Create a new *Pull Request*
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ require "bundler/gem_tasks"
2
+
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env ruby
2
+ require 'rubygems'
3
+ require 'sidekiq'
4
+
5
+ require_relative '../lib/migration/worker/openstack_amazon_migrator'
6
+ require_relative '../lib/migration/worker/openstack_openstack_migrator'
7
+ require_relative '../lib/migration/config'
8
+ require_relative '../lib/migration/worker'
9
+
10
+ Sidekiq.configure_client do |c|
11
+ c.redis = { :namespace => Migration::Worker.config.namespace, :url => Migration::Worker.config.redis_url, queue: Migration::Worker.config.queue }
12
+ end
13
+
14
+ Sidekiq::Client.push('queue' => 'cyfronet', 'class' => Migration::Worker::AmazonExporter, 'args' => [])
15
+ Sidekiq::Client.push('queue' => 'cyfronet', 'class' => Migration::Worker::OpenstackExporter, 'args' => [])
data/bin/migratio-run ADDED
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env ruby
2
+ require 'rubygems'
3
+ require 'sidekiq'
4
+ require_relative '../lib/migration/worker'
5
+
6
+ RUNNER_PATH = File.join(ROOT_PATH, 'lib', 'migration', 'runner.rb')
7
+
8
+ def queue
9
+ "migration_#{Migration::Worker.config.name}"
10
+ end
11
+
12
+ system "sidekiq -q #{queue} -c 1 -r #{RUNNER_PATH}"
@@ -0,0 +1,3 @@
1
+ name: own_name
2
+ redis_url: redis://localhost:6379
3
+ namespace: air
@@ -0,0 +1 @@
1
+ export AWS_REGION=eu-west-1
@@ -0,0 +1,2 @@
1
+ export EXTERNAL_USER=atmosphere
2
+ export EXTERNAL_HOST=10.100.0.24
@@ -0,0 +1,2 @@
1
+ export EXTERNAL_USER=atmosphere
2
+ export EXTERNAL_HOST=10.100.0.4
@@ -0,0 +1,2 @@
1
+ export EXTERNAL_USER=atmosphere
2
+ export EXTERNAL_HOST=10.0.0.1
@@ -0,0 +1,33 @@
1
+ require 'yaml'
2
+
3
+ ROOT_PATH = File.expand_path(File.join(File.dirname(__FILE__), '..', '..'))
4
+
5
+ module Migratio
6
+ class Config
7
+ def initialize(path=nil)
8
+ config_path = path || default_config_path
9
+
10
+ if File.exists?(config_path)
11
+ @config = YAML.load_file(config_path)
12
+ else
13
+ @config = {}
14
+ end
15
+ end
16
+
17
+ def redis_url
18
+ @config['redis_url'] || 'redis://localhost:6379'
19
+ end
20
+
21
+ def namespace
22
+ @config['namespace'] || 'air'
23
+ end
24
+
25
+ def name
26
+ @config['name'] || 'name'
27
+ end
28
+
29
+ def default_config_path
30
+ File.join(ROOT_PATH, 'config.yml')
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,10 @@
1
+ require 'rubygems'
2
+ require 'sidekiq'
3
+
4
+ require_relative 'worker/openstack_amazon_migrator'
5
+ require_relative 'worker/openstack_openstack_migrator'
6
+ require_relative 'worker'
7
+
8
+ Sidekiq.configure_server do |config|
9
+ config.redis = { namespace: Migratio::Worker.config.namespace, url:Migratio::Worker.config.redis_url }
10
+ end
@@ -0,0 +1,16 @@
1
+ require 'sidekiq'
2
+
3
+ require_relative 'config'
4
+
5
+ module Migratio
6
+ module Worker
7
+ def self.config
8
+ @@config ||= Migratio::Config.new @config_path
9
+ end
10
+
11
+ def self.config_path
12
+ @@config_path = config_path
13
+ @@config = nil
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,35 @@
1
+ require 'sidekiq'
2
+
3
+ module Migratio
4
+ module Worker
5
+ class Migrator
6
+ include Sidekiq::Worker
7
+
8
+ def perform(*params)
9
+ begin
10
+ perform_action(*params)
11
+ rescue => e
12
+ $stderr << "Something bad!\n"
13
+ $stderr << "#{e}\n"
14
+ end
15
+ end
16
+
17
+ protected
18
+
19
+ def perform_action(*params)
20
+ #by default do nothing
21
+ end
22
+
23
+ def config_file_path(name, type)
24
+ File.join(config.configs_path, full_name(name, type))
25
+ end
26
+
27
+ def config
28
+ @config ||= Migratio::Worker.config
29
+ end
30
+ end
31
+ end
32
+ end
33
+
34
+ require_relative 'openstack_amazon_migrator'
35
+ require_relative 'openstack_openstack_migrator'
@@ -0,0 +1,44 @@
1
+ require_relative 'migrator'
2
+
3
+ module Migratio
4
+ module Worker
5
+ class OpenstackAmazonMigrator < Migrator
6
+
7
+ def perform_action(image_uuid, compute_site)
8
+ dir = File.dirname(__FILE__)
9
+ output = `#{dir}/../../../scripts/openstack2amazon-convert.sh "#{image_uuid}" "#{dir}/../../../config/#{compute_site}.conf"`
10
+ Sidekiq::Client.push(
11
+ 'queue' => 'migration_jobs',
12
+ 'class' => 'UpdateMigrationJobStatusWorker',
13
+ 'args' => [image_uuid, config.name, compute_site, output])
14
+ if $?.exitstatus == 1
15
+ return
16
+ end
17
+
18
+ output = `#{dir}/../../../scripts/openstack2amazon-transfer.sh "#{image_uuid}" "#{dir}/../../../config/#{compute_site}.conf"`
19
+ Sidekiq::Client.push(
20
+ 'queue' => 'migration_jobs',
21
+ 'class' => 'UpdateMigrationJobStatusWorker',
22
+ 'args' => [image_uuid, config.name, compute_site, output])
23
+ if $?.exitstatus == 1
24
+ return
25
+ end
26
+
27
+ output = `#{dir}/../../../scripts/openstack2amazon-import.sh "#{image_uuid}" "#{dir}/../../../config/#{compute_site}.conf"`
28
+ Sidekiq::Client.push(
29
+ 'queue' => 'migration_jobs',
30
+ 'class' => 'UpdateMigrationJobStatusWorker',
31
+ 'args' => [image_uuid, config.name, compute_site, output])
32
+ if $?.exitstatus == 1
33
+ return
34
+ end
35
+
36
+ output = `#{dir}/../../../scripts/openstack2amazon-register.sh "#{image_uuid}" "#{dir}/../../../config/#{compute_site}.conf"`
37
+ Sidekiq::Client.push(
38
+ 'queue' => 'migration_jobs',
39
+ 'class' => 'UpdateMigrationJobStatusWorker',
40
+ 'args' => [image_uuid, config.name, compute_site, output])
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,26 @@
1
+ require_relative 'migrator'
2
+
3
+ module Migratio
4
+ module Worker
5
+ class OpenstackOpenstackMigrator < Migrator
6
+
7
+ def perform_action(image_uuid, compute_site)
8
+ dir = File.dirname(__FILE__)
9
+ output = `#{dir}/../../../scripts/openstack2openstack-transfer.sh "#{image_uuid}" "#{dir}/../../../config/#{compute_site}.conf"`
10
+ Sidekiq::Client.push(
11
+ 'queue' => 'migration_jobs',
12
+ 'class' => 'UpdateMigrationJobStatusWorker',
13
+ 'args' => [image_uuid, config.name, compute_site, output])
14
+ if $?.exitstatus == 1
15
+ return
16
+ end
17
+
18
+ output = `#{dir}/../../../scripts/openstack2openstack-register.sh "#{image_uuid}" "#{dir}/../../../config/#{compute_site}.conf"`
19
+ Sidekiq::Client.push(
20
+ 'queue' => 'migration_jobs',
21
+ 'class' => 'UpdateMigrationJobStatusWorker',
22
+ 'args' => [image_uuid, config.name, compute_site, output])
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,5 @@
1
+ module Migratio
2
+ module Worker
3
+ VERSION = "0.0.2"
4
+ end
5
+ end
data/migratio.gemspec ADDED
@@ -0,0 +1,25 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'migratio/worker/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'migratio'
8
+ spec.version = Migratio::Worker::VERSION
9
+ spec.authors = ['Paweł Suder']
10
+ spec.email = ['pawel@suder.info']
11
+ spec.description = %q{Migration worker}
12
+ spec.summary = %q{Worker is responsible for migrating virtual machine templates between sites}
13
+ spec.homepage = 'https://github.com/dice-cyfronet/migratio'
14
+ spec.license = 'MIT'
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ['lib']
20
+
21
+ spec.add_dependency 'sidekiq'
22
+
23
+ spec.add_development_dependency 'bundler'
24
+ spec.add_development_dependency 'rake'
25
+ end
@@ -0,0 +1,46 @@
1
+ #!/bin/bash
2
+
3
+ export __dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
4
+
5
+ if [ $# -eq 0 ] || [ $# -eq 1 ]
6
+ then
7
+ echo "Bad script params."
8
+ exit 1
9
+ fi
10
+
11
+ mkdir -p ${__dir}/logs
12
+ . ~/.creds
13
+ . $2
14
+
15
+ : ${OS_TENANT_NAME:?"Need to set OS_TENANT_NAME non-empty"}
16
+ : ${OS_USERNAME:?"Need to set OS_USERNAME non-empty"}
17
+ : ${OS_PASSWORD:?"Need to set OS_PASSWORD non-empty"}
18
+ : ${OS_AUTH_URL:?"Need to set OS_AUTH_URL non-empty"}
19
+
20
+ command -v glance > /dev/null 2>&1 || { echo "No 'glance'" >&2; exit 1; }
21
+
22
+ command -v sudo > /dev/null 2>&1 || { echo "No 'sudo'" >&2; exit 1; }
23
+ command -v qemu-img > /dev/null 2>&1 || { echo "No 'qemu-img'" >&2; exit 1; }
24
+
25
+ image_uuid=$1
26
+
27
+ image_list=$(glance image-list) &>> ${__dir}/logs/o2a-c.log
28
+ echo "$(date) [Result for glance image-list]: ${image_list}" &>> ${__dir}/logs/o2a-c.log
29
+
30
+ check_local=$(echo "${image_list}" | grep ${image_uuid} | wc -l) &>> ${__dir}/logs/o2a-c.log
31
+ echo "$(date) [Result for looking for ${image_uuid} in image_list]: ${check_local}" &>> ${__dir}/logs/o2a-c.log
32
+
33
+ if [ ${check_local} -eq 1 ]
34
+ then
35
+ if [ ! -f /tmp/${image_uuid}.raw ]
36
+ then
37
+ __output=$(sudo qemu-img convert -f qcow2 -O raw /var/lib/glance/images/${image_uuid} /tmp/${image_uuid}.raw) &>> ${__dir}/logs/o2a-c.log
38
+ echo "$(date) [Result for qemu-img convert]: ${__output}" &>> ${__dir}/logs/o2a-c.log
39
+ fi
40
+
41
+ echo "Image converted"
42
+ exit 0
43
+ else
44
+ echo "Requested image not exist."
45
+ exit 1
46
+ fi
@@ -0,0 +1,72 @@
1
+ #!/bin/bash
2
+
3
+ export __dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
4
+
5
+ if [ $# -eq 0 ] || [ $# -eq 1 ]
6
+ then
7
+ echo "Usage: $0 <image-uuid> <config-file>"
8
+ exit 1
9
+ fi
10
+
11
+ mkdir -p ${__dir}/logs
12
+ . ~/.creds
13
+ . $2
14
+
15
+ : ${AWS_ACCESS_KEY:?"Need to set AWS_ACCESS_KEY non-empty"}
16
+ : ${AWS_SECRET_KEY:?"Need to set AWS_SECRET_KEY non-empty"}
17
+ : ${EC2_URL:?"Need to set EC2_URL non-empty"}
18
+ : ${AWS_REGION:?"Need to set AWS_REGION non-empty"}
19
+ : ${SOURCE_CS:?"Need to set SOURCE_CS non-empty"}
20
+
21
+ command -v ec2-describe-images > /dev/null 2>&1 || { echo "No 'ec2-describe-images' installed" >&2; exit 1; }
22
+ command -v ec2-describe-conversion-tasks > /dev/null 2>&1 || { echo "No 'ec2-describe-conversion-tasks' installed" >&2; exit 1; }
23
+
24
+ image_uuid=$1
25
+
26
+ if [ -f /tmp/${image_uuid}.raw ]
27
+ then
28
+ check_remote=$(ec2-describe-images | grep IMAGE | grep ${image_uuid} | wc -l) &>> ${__dir}/logs/o2a-i.log
29
+ echo "$(date) [Result for check_remote]: ${check_remote}" &>> ${__dir}/logs/o2a-i.log
30
+
31
+ if [ ${check_remote} -eq 0 ]
32
+ then
33
+ __output=$(ec2-describe-conversion-tasks | grep ${image_uuid} | sort -k6 | tail -n 1) &>> ${__dir}/logs/o2a-i.log
34
+ echo "$(date) [Result for ec2-describe-conversion-tasks]: ${__output}" &>> ${__dir}/logs/o2a-i.log
35
+
36
+ if [ ! -z "${__output}" ]
37
+ then
38
+ if [[ ${__output} == *Pending* ]]
39
+ then
40
+ instance=$(echo ${__output} | cut -f 12 -d " ") &>> ${__dir}/logs/o2a-i.log
41
+ elif [[ ${__output} == *Progress* ]]
42
+ then
43
+ instance=$(echo ${__output} | cut -f 13 -d " ") &>> ${__dir}/logs/o2a-i.log
44
+ elif [[ ${__output} == *complete* ]]
45
+ then
46
+ instance=$(echo ${__output} | cut -f 10 -d " ") &>> ${__dir}/logs/o2a-i.log
47
+ fi
48
+
49
+ echo "$(date) [Result for instance]: ${instance}" &>> ${__dir}/logs/o2a-i.log
50
+
51
+ until echo ${__output} | grep -E complete
52
+ do
53
+ sleep 30
54
+ __output=$(ec2-describe-conversion-tasks | grep ${instance}) &>> ${__dir}/logs/o2a-i.log
55
+ echo "$(date) [Result for ec2-describe-conversion-tasks]: ${__output}" &>> ${__dir}/logs/o2a-i.log
56
+ done
57
+
58
+ sleep 30
59
+ echo "Image imported"
60
+ exit 0
61
+ else
62
+ echo "Image was not uploaded."
63
+ exit 1
64
+ fi
65
+ else
66
+ echo "Requested image was uploaded."
67
+ exit 1
68
+ fi
69
+ else
70
+ echo "Image was not converted."
71
+ exit 1
72
+ fi
@@ -0,0 +1,103 @@
1
+ #!/bin/bash
2
+
3
+ export __dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
4
+
5
+ if [ $# -eq 0 ] || [ $# -eq 1 ]
6
+ then
7
+ echo "Usage: $0 <image-uuid> <config-file>"
8
+ exit 1
9
+ fi
10
+
11
+ mkdir -p ${__dir}/logs
12
+ . ~/.creds
13
+ . $2
14
+
15
+ : ${AWS_ACCESS_KEY:?"Need to set AWS_ACCESS_KEY non-empty"}
16
+ : ${AWS_SECRET_KEY:?"Need to set AWS_SECRET_KEY non-empty"}
17
+ : ${EC2_URL:?"Need to set EC2_URL non-empty"}
18
+ : ${AWS_REGION:?"Need to set AWS_REGION non-empty"}
19
+ : ${SOURCE_CS:?"Need to set SOURCE_CS non-empty"}
20
+
21
+ command -v glance > /dev/null 2>&1 || { echo "No 'glance'" >&2; exit 1; }
22
+
23
+ command -v ec2-describe-images > /dev/null 2>&1 || { echo "No 'ec2-describe-images' installed" >&2; exit 1; }
24
+ command -v ec2-describe-conversion-tasks > /dev/null 2>&1 || { echo "No 'ec2-describe-conversion-tasks' installed" >&2; exit 1; }
25
+
26
+ command -v ec2-import-instance > /dev/null 2>&1 || { echo "No 'ec2-import-instance' installed" >&2; exit 1; }
27
+ command -v ec2-create-image > /dev/null 2>&1 || { echo "No 'ec2-create-image' installed" >&2; exit 1; }
28
+ command -v ec2-create-tags > /dev/null 2>&1 || { echo "No 'ec2-create-tags' installed" >&2; exit 1; }
29
+
30
+ image_uuid=$1
31
+
32
+ image_list=$(glance image-list) &>> ${__dir}/logs/o2a-r.log
33
+ echo "$(date) [Result for glance image-list]: ${image_list}" &>> ${__dir}/logs/o2a-r.log
34
+
35
+ image_name=$(echo "${image_list}" | grep ${image_uuid} | awk -F'|' '{print $3}' | sed -e 's/^ *//' -e 's/ *$//') &>> ${__dir}/logs/o2a-r.log
36
+ echo "$(date) [Result for image_name]: ${image_name}" &>> ${__dir}/logs/o2a-r.log
37
+
38
+ if [ -f /tmp/${image_uuid}.raw ]
39
+ then
40
+ check_remote=$(ec2-describe-images | grep IMAGE | grep ${image_uuid} | wc -l) &>> ${__dir}/logs/o2a-r.log
41
+ echo "$(date) [Result for check_remote]: ${check_remote}" &>> ${__dir}/logs/o2a-r.log
42
+
43
+ if [ ${check_remote} -eq 0 ]
44
+ then
45
+ __output=$(ec2-describe-conversion-tasks | grep ${image_uuid} | sort -k6 | tail -n 1) &>> ${__dir}/logs/o2a-r.log
46
+ echo "$(date) [Result for ec2-describe-conversion-tasks]: ${__output}" &>> ${__dir}/logs/o2a-r.log
47
+
48
+ if [ ! -z "${__output}" ]
49
+ then
50
+ instance=$(echo ${__output} | cut -f 10 -d " ") &>> ${__dir}/logs/o2a-r.log
51
+ task_import=$(echo ${__output} | cut -f 4 -d " ") &>> ${__dir}/logs/o2a-r.log
52
+ __output=$(ec2-create-image -n "${image_name}-${image_uuid}" -d "${image_name}-${image_uuid}" ${instance}) &>> ${__dir}/logs/o2a-r.log
53
+ echo "$(date) [Result for ec2-create-image]: ${__output}" &>> ${__dir}/logs/o2a-r.log
54
+
55
+ sleep 30
56
+
57
+ __ami_id=$(ec2-describe-images | grep ${image_uuid} | awk '{print $2}') &>> ${__dir}/logs/o2a-r.log
58
+ echo "$(date) [Result for ec2-describe-images]: ${__ami_id}" &>> ${__dir}/logs/o2a-r.log
59
+
60
+ until [ -n "${__ami_id}" ]
61
+ do
62
+ sleep 30
63
+ __ami_id=$(ec2-describe-images | grep ${image_uuid} | awk '{print $2}') &>> ${__dir}/logs/o2a-r.log
64
+ echo "$(date) [Result for ec2-describe-images]: ${__ami_id}" &>> ${__dir}/logs/o2a-r.log
65
+ done
66
+
67
+ __output=$(ec2-create-tags ${__ami_id} --tag source_cs=${SOURCE_CS} --tag source_uuid=${image_uuid} --tag Name="${image_name}-${image_uuid}") &>> ${__dir}/logs/o2a-r.log
68
+ echo "$(date) [Result for ec2-create-tags]: ${__output}" &>> ${__dir}/logs/o2a-r.log
69
+
70
+ __output=$(rm -f /tmp/${image_uuid}.raw*) &>> ${__dir}/logs/o2a-r.log
71
+ echo "$(date) [Result for rm]: ${__output}" &>> ${__dir}/logs/o2a-r.log
72
+
73
+ __output=$(ec2-delete-disk-image -t ${task_import} -o ${AWS_ACCESS_KEY} -w ${AWS_SECRET_KEY})
74
+ echo "$(date) [Result for ec2-delete-disk-image]: ${__output}" &>> ${__dir}/logs/o2a-r.log
75
+
76
+ volume=$(ec2-describe-instances ${instance} | grep vol | awk '{print $3}') &>> ${__dir}/logs/o2a-r.log
77
+ echo "$(date) [Result for ec2-describe-instances]: ${volume}"
78
+
79
+ __output=$(ec2-terminate-instances ${instance}) &>> ${__dir}/logs/o2a-r.log
80
+ echo "$(date) [Result for ec2-terminate-instances]: ${__output}" &>> ${__dir}/logs/o2a-r.log
81
+
82
+ sleep 30
83
+
84
+ __output=$(ec2-delete-volume ${volume}) &>> ${__dir}/logs/o2a-r.log
85
+ echo "$(date) [Result for ec2-delete-volume]: ${__output}" &>> ${__dir}/logs/o2a-r.log
86
+
87
+ __output=$(aws s3 rm --recursive s3://import-image-${image_uuid}/) &>> ${__dir}/logs/o2a-r.log
88
+ echo "$(date) [Result for aws s3 rm]: ${__output}" &>> ${__dir}/logs/o2a-r.log
89
+
90
+ echo "Registered image"
91
+ exit 0
92
+ else
93
+ echo "Image was not uploaded."
94
+ exit 1
95
+ fi
96
+ else
97
+ echo "Requested image was uploaded."
98
+ exit 1
99
+ fi
100
+ else
101
+ echo "Image not converted."
102
+ exit 1
103
+ fi
@@ -0,0 +1,51 @@
1
+ #!/bin/bash
2
+
3
+ export __dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
4
+
5
+ if [ $# -eq 0 ] || [ $# -eq 1 ]
6
+ then
7
+ echo "Usage: $0 <image-uuid> <config-file>"
8
+ exit 1
9
+ fi
10
+
11
+ . ~/.creds
12
+ . $2
13
+
14
+ : ${AWS_ACCESS_KEY:?"Need to set AWS_ACCESS_KEY non-empty"}
15
+ : ${AWS_SECRET_KEY:?"Need to set AWS_SECRET_KEY non-empty"}
16
+ : ${EC2_URL:?"Need to set EC2_URL non-empty"}
17
+ : ${AWS_REGION:?"Need to set AWS_REGION non-empty"}
18
+ : ${SOURCE_CS:?"Need to set SOURCE_CS non-empty"}
19
+
20
+ command -v ec2-describe-images > /dev/null 2>&1 || { echo "No 'ec2-describe-images' installed" >&2; exit 1; }
21
+ command -v ec2-import-instance > /dev/null 2>&1 || { echo "No 'ec2-import-instance' installed" >&2; exit 1; }
22
+
23
+ image_uuid=$1
24
+
25
+ image_list=$(glance image-list) &>> ${__dir}/logs/o2a-t.log
26
+ echo "$(date) [Result for glance image-list]: ${image_list}" &>> ${__dir}/logs/o2a-t.log
27
+
28
+ if [ -f /tmp/${image_uuid}.raw ]
29
+ then
30
+ check_remote=$(ec2-describe-images | grep IMAGE | grep ${image_uuid} | wc -l) &>> ${__dir}/logs/o2a-t.log
31
+ echo "$(date) [Result for check_remote]: ${check_remote}" &>> ${__dir}/logs/o2a-t.log
32
+
33
+ if [ ${check_remote} -eq 0 ]
34
+ then
35
+ image_name=$(echo "${image_list}" | grep ${image_uuid} | awk -F'|' '{print $3}' | sed -e 's/^ *//' -e 's/ *$//') &>> ${__dir}/logs/o2a-t.log
36
+ echo "$(date) [Result for image_name]: ${image_name}" &>> ${__dir}/logs/o2a-t.log
37
+
38
+ __output=$(ec2-import-instance /tmp/${image_uuid}.raw -f RAW -b import-image-${image_uuid} -p Linux --region ${AWS_REGION} -t m3.medium -a x86_64 -d "${image_name}-${image_uuid}" -o ${AWS_ACCESS_KEY} -w ${AWS_SECRET_KEY}) &>> ${__dir}/logs/o2a-t.log
39
+ echo "$(date) [Result for ec2-import-instance]: ${__output}" &>> ${__dir}/logs/o2a-t.log
40
+
41
+ sleep 30
42
+ echo "Image transfered"
43
+ exit 0
44
+ else
45
+ echo "Requested image was uploaded."
46
+ exit 1
47
+ fi
48
+ else
49
+ echo "Image not converted."
50
+ exit 1
51
+ fi
@@ -0,0 +1,102 @@
1
+ #!/bin/bash
2
+
3
+ set -x
4
+
5
+ export __dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
6
+
7
+ if [ $# -eq 0 ] || [ $# -eq 1 ]
8
+ then
9
+ echo "Usage: $0 <image-uuid> <config-file>"
10
+ exit 1
11
+ fi
12
+
13
+ . ~/.creds
14
+ . $2
15
+
16
+ : ${OS_TENANT_NAME:?"Need to set OS_TENANT_NAME non-empty"}
17
+ : ${OS_USERNAME:?"Need to set OS_USERNAME non-empty"}
18
+ : ${OS_PASSWORD:?"Need to set OS_PASSWORD non-empty"}
19
+ : ${OS_AUTH_URL:?"Need to set OS_AUTH_URL non-empty"}
20
+
21
+ : ${AWS_ACCESS_KEY:?"Need to set AWS_ACCESS_KEY non-empty"}
22
+ : ${AWS_SECRET_KEY:?"Need to set AWS_SECRET_KEY non-empty"}
23
+ : ${EC2_URL:?"Need to set EC2_URL non-empty"}
24
+ : ${AWS_REGION:?"Need to set AWS_REGION non-empty"}
25
+ : ${SOURCE_CS:?"Need to set SOURCE_CS non-empty"}
26
+
27
+ command -v glance > /dev/null 2>&1 || { echo "Need to have 'glance'" >&2; exit 1; }
28
+
29
+ command -v sudo > /dev/null 2>&1 || { echo "Need to have 'sudo'" >&2; exit 1; }
30
+ command -v qemu-img > /dev/null 2>&1 || { echo "Need to have 'qemu-img'" >&2; exit 1; }
31
+
32
+ command -v ec2-import-instance > /dev/null 2>&1 || { echo "Need to have 'ec2-import-instance'" >&2; exit 1; }
33
+ command -v ec2-describe-conversion-tasks > /dev/null 2>&1 || { echo "Need to have 'ec2-describe-conversion-tasks'" >&2; exit 1; }
34
+ command -v ec2-create-image > /dev/null 2>&1 || { echo "Need to have 'ec2-create-image'" >&2; exit 1; }
35
+ command -v ec2-describe-images > /dev/null 2>&1 || { echo "Need to have 'ec2-describe-image'" >&2; exit 1; }
36
+ command -v ec2-create-tags > /dev/null 2>&1 || { echo "Need to have 'ec2-create-tags'" >&2; exit 1; }
37
+
38
+ image_uuid=$1
39
+ image_list=$(glance image-list)
40
+
41
+ check_local=$(echo "${image_list}" | grep ${image_uuid} | wc -l)
42
+
43
+ if [ ${check_local} -eq 1 ]
44
+ then
45
+ image_name=$(echo "${image_list}" | grep ${image_uuid} | awk -F'|' '{print $3}' | sed -e 's/^ *//' -e 's/ *$//')
46
+ hash_sum=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 7 | head -n 1)
47
+
48
+ if [ ! -f /tmp/${image_uuid}.raw ]
49
+ then
50
+ sudo qemu-img convert -f qcow2 -O raw /var/lib/glance/images/${image_uuid} /tmp/${image_uuid}.raw
51
+ fi
52
+
53
+ check_remote=$(ec2-describe-images | grep IMAGE | grep ${image_uuid} | wc -l)
54
+ if [ ${check_remote} -eq 0 ]
55
+ then
56
+ ec2-import-instance /tmp/${image_uuid}.raw -f RAW -b imported-images -p Linux --region ${AWS_REGION} -t m3.medium -a x86_64 -d ${image_uuid}-${hash_sum} -o ${AWS_ACCESS_KEY} -w ${AWS_SECRET_KEY}
57
+ echo "Transfered"
58
+
59
+ sleep 30
60
+
61
+ __output=$(ec2-describe-conversion-tasks | grep ${image_uuid}-${hash_sum})
62
+
63
+ if [ ! -z "${__output}" ]
64
+ then
65
+ instance=$(echo ${__output} | cut -f 12 -d " ")
66
+
67
+ until echo ${__output} | grep -E complete
68
+ do
69
+ sleep 30
70
+ __output=$(ec2-describe-conversion-tasks | grep ${instance})
71
+ done
72
+
73
+ sleep 30
74
+
75
+ ec2-create-image -n ${image_uuid}-${hash_sum} -d "${image_name}-${image_uuid}-${hash_sum}" ${instance}
76
+
77
+ sleep 30
78
+
79
+ __ami_id=$(ec2-describe-images | grep ${image_uuid}-${hash_sum} | awk '{print $2}')
80
+ until [ -n "${__ami_id}" ]
81
+ do
82
+ sleep 30
83
+ __ami_id=$(ec2-describe-images | grep ${image_uuid}-${hash_sum} | awk '{print $2}')
84
+ done
85
+
86
+ ec2-create-tags ${__ami_id} --tag source_cs=${SOURCE_CS} --tag source_uuid=${image_uuid} --tag Name="${image_name}-${image_uuid}-${hash_sum}"
87
+ echo "Registered"
88
+
89
+ rm -f /tmp/${image_uuid}.raw
90
+ exit 0
91
+ else
92
+ echo "Image was not uploaded."
93
+ exit 1
94
+ fi
95
+ else
96
+ echo "Requested image was uploaded."
97
+ exit 1
98
+ fi
99
+ else
100
+ echo "Requested image not exist."
101
+ exit 1
102
+ fi
@@ -0,0 +1,85 @@
1
+ #!/bin/bash
2
+
3
+ export __dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
4
+
5
+ if [ $# -eq 0 ] || [ $# -eq 1 ]
6
+ then
7
+ echo "Usage: $0 <image-uuid> <config-file>"
8
+ exit 1
9
+ fi
10
+
11
+ mkdir -p ${__dir}/logs
12
+ . ~/.creds
13
+ . $2
14
+
15
+ : ${OS_TENANT_NAME:?"Need to set OS_TENANT_NAME non-empty"}
16
+ : ${OS_USERNAME:?"Need to set OS_USERNAME non-empty"}
17
+ : ${OS_PASSWORD:?"Need to set OS_PASSWORD non-empty"}
18
+ : ${OS_AUTH_URL:?"Need to set OS_AUTH_URL non-empty"}
19
+
20
+ : ${IMAGES_DIR:?"Need to set IMAGES_DIR non-empty"}
21
+
22
+ : ${EXTERNAL_USER:?"Need to set EXTERNAL_USER non-empty"}
23
+ : ${EXTERNAL_HOST:?"Need to set EXTERNAL_HOST non-empty"}
24
+ : ${SOURCE_CS:?"Need to set SOURCE_CS non-empty"}
25
+
26
+ command -v glance > /dev/null 2>&1 || { echo "No 'glance' installed" >&2; exit 1; }
27
+ command -v rsync > /dev/null 2>&1 || { echo "No 'rsync' installed" >&2; exit 1; }
28
+ command -v ssh > /dev/null 2>&1 || { echo "No 'ssh' installed" >&2; exit 1; }
29
+
30
+ ssh ${EXTERNAL_USER}@${EXTERNAL_HOST} command -v glance > /dev/null 2>&1 || { echo "No 'glance' on external host" >&2; exit 1; }
31
+
32
+ image_uuid=$1
33
+
34
+ image_list=$(glance image-list) &>> ${__dir}/logs/o2o-r.log
35
+ echo "$(date) [Result for image_list]: ${image_list}" &>> ${__dir}/logs/o2o-r.log
36
+
37
+ check_local=$(echo "${image_list}" | grep ${image_uuid} | wc -l) &>> ${__dir}/logs/o2o-r.log
38
+ echo "$(date) [Result for check_local]: ${check_local}" &>> ${__dir}/logs/o2o-r.log
39
+
40
+ if [ ${check_local} -eq 1 ]
41
+ then
42
+ remote_checksums=$(ssh ${EXTERNAL_USER}@${EXTERNAL_HOST} \
43
+ "source ~/.creds;
44
+ glance image-list | head -n -1 | tail -n +4 | awk '{print \$2}' | while read remote_image_uuid
45
+ do
46
+ glance image-show \${remote_image_uuid} | grep checksum | awk '{print \$4}'
47
+ done") &>> ${__dir}/logs/o2o-r.log
48
+
49
+ checksum=$(glance image-show ${image_uuid} | grep checksum | awk '{print $4}') &>> ${__dir}/logs/o2o-r.log
50
+ echo "$(date) [Result for checksum]: ${checksum}" &>> ${__dir}/logs/o2o-r.log
51
+
52
+ check_remote=$(echo "${remote_checksums}" | grep ${checksum} | wc -l) &>> ${__dir}/logs/o2o-r.log
53
+ echo "$(date) [Result for check_remote]: ${check_remote}" &>> ${__dir}/logs/o2o-r.log
54
+
55
+ if [ ${check_remote} -eq 0 ]
56
+ then
57
+ image_name=$(echo "${image_list}" | grep ${image_uuid} | awk -F'|' '{print $3}' | sed -e 's/^ *//' -e 's/ *$//') &>> ${__dir}/logs/o2o-r.log
58
+ echo "$(date) [Result for image_name]: ${image_name}" &>> ${__dir}/logs/o2o-r.log
59
+
60
+ disk_format=$(echo "${image_list}" | grep ${image_uuid} | awk -F'|' '{print $4}' | sed -e 's/^ *//' -e 's/ *$//') &>> ${__dir}/logs/o2o-r.log
61
+ echo "$(date) [Result for disk_format]: ${image_name}" &>> ${__dir}/logs/o2o-r.log
62
+
63
+ container_format=$(echo "${image_list}" | grep ${image_uuid} | awk -F'|' '{print $5}' | sed -e 's/^ *//' -e 's/ *$//') &>> ${__dir}/logs/o2o-r.log
64
+ echo "$(date) [Result for container_format]: ${container_format}" &>> ${__dir}/logs/o2o-r.log
65
+
66
+ ssh ${EXTERNAL_USER}@${EXTERNAL_HOST} \
67
+ "source ~/.creds;
68
+ glance image-create \
69
+ --name \"${image_name}\" \
70
+ --disk-format ${disk_format} \
71
+ --container-format ${container_format} \
72
+ --property source_uuid=${image_uuid} \
73
+ --property source_cs=${SOURCE_CS} < /tmp/${image_uuid}; \
74
+ rm -f /tmp/${image_uuid}" &>> ${__dir}/logs/o2o-r.log
75
+
76
+ echo "Registered"
77
+ exit 0
78
+ else
79
+ echo "Requested image was uploaded."
80
+ exit 1
81
+ fi
82
+ else
83
+ echo "Requested image not exist."
84
+ exit 1
85
+ fi
@@ -0,0 +1,70 @@
1
+ #!/bin/bash
2
+
3
+ export __dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
4
+
5
+ if [ $# -eq 0 ] || [ $# -eq 1 ]
6
+ then
7
+ echo "Usage: $0 <image-uuid> <config-file>"
8
+ exit 1
9
+ fi
10
+
11
+ mkdir -p ${__dir}/logs
12
+ . ~/.creds
13
+ . $2
14
+
15
+ : ${OS_TENANT_NAME:?"Need to set OS_TENANT_NAME non-empty"}
16
+ : ${OS_USERNAME:?"Need to set OS_USERNAME non-empty"}
17
+ : ${OS_PASSWORD:?"Need to set OS_PASSWORD non-empty"}
18
+ : ${OS_AUTH_URL:?"Need to set OS_AUTH_URL non-empty"}
19
+
20
+ : ${IMAGES_DIR:?"Need to set IMAGES_DIR non-empty"}
21
+
22
+ : ${EXTERNAL_USER:?"Need to set EXTERNAL_USER non-empty"}
23
+ : ${EXTERNAL_HOST:?"Need to set EXTERNAL_HOST non-empty"}
24
+ : ${SOURCE_CS:?"Need to set SOURCE_CS non-empty"}
25
+
26
+ command -v glance > /dev/null 2>&1 || { echo "No 'glance' installed" >&2; exit 1; }
27
+ command -v rsync > /dev/null 2>&1 || { echo "No 'rsync' installed" >&2; exit 1; }
28
+ command -v ssh > /dev/null 2>&1 || { echo "No 'ssh' installed" >&2; exit 1; }
29
+
30
+ ssh ${EXTERNAL_USER}@${EXTERNAL_HOST} command -v glance > /dev/null 2>&1 || { echo "No 'glance' on external host" >&2; exit 1; }
31
+
32
+ image_uuid=$1
33
+
34
+ image_list=$(glance image-list) &>> ${__dir}/logs/o2o-t.log
35
+ echo "$(date) [Result for image_list]: ${image_list}" &>> ${__dir}/logs/o2o-t.log
36
+
37
+ check_local=$(echo "${image_list}" | grep ${image_uuid} | wc -l) &>> ${__dir}/logs/o2o-t.log
38
+ echo "$(date) [Result for check_local]: ${check_local}" &>> ${__dir}/logs/o2o-t.log
39
+
40
+ if [ ${check_local} -eq 1 ]
41
+ then
42
+ remote_checksums=$(ssh ${EXTERNAL_USER}@${EXTERNAL_HOST} \
43
+ "source ~/.creds;
44
+ glance image-list | head -n -1 | tail -n +4 | awk '{print \$2}' | while read remote_image_uuid
45
+ do
46
+ glance image-show \${remote_image_uuid} | grep checksum | awk '{print \$4}'
47
+ done") &>> ${__dir}/logs/o2o-t.log
48
+ echo "$(date) [Result for remote_checksums]: ${remote_checksums}" &>> ${__dir}/logs/o2o-t.log
49
+
50
+ checksum=$(glance image-show ${image_uuid} | grep checksum | awk '{print $4}') &>> ${__dir}/logs/o2o-t.log
51
+ echo "$(date) [Result for checksum]: ${checksum}" &>> ${__dir}/logs/o2o-t.log
52
+
53
+ check_remote=$(echo "${remote_checksums}" | grep ${checksum} | wc -l) &>> ${__dir}/logs/o2o-t.log
54
+ echo "$(date) [Result for check_remote]: ${check_remote}" &>> ${__dir}/logs/o2o-t.log
55
+
56
+ if [ ${check_remote} -eq 0 ]
57
+ then
58
+ rsync ${IMAGES_DIR}/${image_uuid} \
59
+ ${EXTERNAL_USER}@${EXTERNAL_HOST}:/tmp/${image_uuid} &>> ${__dir}/logs/o2o-t.log
60
+
61
+ echo "Transfered"
62
+ exit 0
63
+ else
64
+ echo "Requested image was uploaded."
65
+ exit 1
66
+ fi
67
+ else
68
+ echo "Requested image not exist."
69
+ exit 1
70
+ fi
@@ -0,0 +1,79 @@
1
+ #!/bin/bash
2
+
3
+ set -x
4
+
5
+ export __dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
6
+
7
+ if [ $# -eq 0 ] || [ $# -eq 1 ]
8
+ then
9
+ echo "Usage: $0 <image-uuid> <config-file>"
10
+ exit 1
11
+ fi
12
+
13
+ . ~/.creds
14
+ . $2
15
+
16
+ : ${OS_TENANT_NAME:?"Need to set OS_TENANT_NAME non-empty"}
17
+ : ${OS_USERNAME:?"Need to set OS_USERNAME non-empty"}
18
+ : ${OS_PASSWORD:?"Need to set OS_PASSWORD non-empty"}
19
+ : ${OS_AUTH_URL:?"Need to set OS_AUTH_URL non-empty"}
20
+
21
+ : ${IMAGES_DIR:?"Need to set IMAGES_DIR non-empty"}
22
+
23
+ : ${EXTERNAL_USER:?"Need to set EXTERNAL_USER non-empty"}
24
+ : ${EXTERNAL_HOST:?"Need to set EXTERNAL_HOST non-empty"}
25
+ : ${SOURCE_CS:?"Need to set SOURCE_CS non-empty"}
26
+
27
+ command -v glance > /dev/null 2>&1 || { echo "Need to have 'glance'" >&2; exit 1; }
28
+ command -v rsync > /dev/null 2>&1 || { echo "Need to have 'rsync'" >&2; exit 1; }
29
+ command -v ssh > /dev/null 2>&1 || { echo "Need to have 'ssh'" >&2; exit 1; }
30
+
31
+ ssh ${EXTERNAL_USER}@${EXTERNAL_HOST} command -v glance > /dev/null 2>&1 || { echo "Need to have 'glance' on external host" >&2; exit 1; }
32
+
33
+ image_uuid=$1
34
+ image_list=$(glance image-list)
35
+
36
+ check_local=$(echo "${image_list}" | grep ${image_uuid} | wc -l)
37
+
38
+ if [ ${check_local} -eq 1 ]
39
+ then
40
+ remote_checksums=$(ssh ${EXTERNAL_USER}@${EXTERNAL_HOST} \
41
+ "source ~/.creds;
42
+ glance image-list | head -n -1 | tail -n +4 | awk '{print \$2}' | while read remote_image_uuid
43
+ do
44
+ glance image-show \${remote_image_uuid} | grep checksum | awk '{print \$4}'
45
+ done")
46
+
47
+ checksum=$(glance image-show ${image_uuid} | grep checksum | awk '{print $4}')
48
+ check_remote=$(echo "${remote_checksums}" | grep ${checksum} | wc -l)
49
+
50
+ if [ ${check_remote} -eq 0 ]
51
+ then
52
+ image_name=$(echo "${image_list}" | grep ${image_uuid} | awk -F'|' '{print $3}' | sed -e 's/^ *//' -e 's/ *$//')
53
+ disk_format=$(echo "${image_list}" | grep ${image_uuid} | awk -F'|' '{print $4}' | sed -e 's/^ *//' -e 's/ *$//')
54
+ container_format=$(echo "${image_list}" | grep ${image_uuid} | awk -F'|' '{print $5}' | sed -e 's/^ *//' -e 's/ *$//')
55
+ hash_sum=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 7 | head -n 1)
56
+
57
+ rsync ${IMAGES_DIR}/${image_uuid} \
58
+ ${EXTERNAL_USER}@${EXTERNAL_HOST}:/tmp/${image_uuid}-${hash_sum}
59
+ echo "Transfered"
60
+
61
+ ssh ${EXTERNAL_USER}@${EXTERNAL_HOST} \
62
+ "source ~/.creds;
63
+ glance image-create \
64
+ --name \"${image_name}-${hash_sum}\" \
65
+ --disk-format ${disk_format} \
66
+ --container-format ${container_format} \
67
+ --property source_uuid=${image_uuid} \
68
+ --property source_cs=${SOURCE_CS} < /tmp/${image_uuid}-${hash_sum}; \
69
+ rm -f /tmp/${image_uuid}-${hash_sum}"
70
+ echo "Registered"
71
+ exit 0
72
+ else
73
+ echo "Requested image was uploaded."
74
+ exit 1
75
+ fi
76
+ else
77
+ echo "Requested image not exist."
78
+ exit 1
79
+ fi
@@ -0,0 +1,31 @@
1
+ start on starting migration-worker
2
+ stop on stopping migration-worker
3
+ respawn
4
+
5
+ setuid atmosphere
6
+ chdir /home/atmosphere/migration-worker
7
+
8
+ script
9
+ # this script runs in /bin/sh by default
10
+ # respawn as bash so we can source in rbenv
11
+ exec /bin/bash <<EOT
12
+ # uncomment to use syslog for logging
13
+ # exec &> /dev/kmsg
14
+
15
+ export HOME=/home/atmosphere
16
+ export PATH="/home/atmosphere/.rbenv/bin:/home/atmosphere/.rbenv/shims:$PATH"
17
+
18
+ # Pick your poison :) Or none if you're using a system wide installed Ruby.
19
+ # rbenv
20
+ source $HOME/.bash_profile
21
+ # OR
22
+ # source /home/apps/.profile
23
+ # OR system:
24
+ # source /etc/profile.d/rbenv.sh
25
+ #
26
+ # rvm
27
+ # source /home/apps/.rvm/scripts/rvm
28
+
29
+ exec bundle exec ./bin/run >> /home/atmosphere/migration-worker/log/migration-worker.log 2>&1
30
+ EOT
31
+ end script
@@ -0,0 +1,2 @@
1
+ start on starting migration
2
+ stop on stopping migration
@@ -0,0 +1,12 @@
1
+ pre-start script
2
+ mkdir -p /home/atmosphere/migration-worker/log
3
+ chown -R atmosphere /home/atmosphere/migration-worker/log
4
+ end script
5
+
6
+ start on (started network-interface
7
+ or started network-manager
8
+ or started networking)
9
+
10
+ stop on (stopping network-interface
11
+ or stopping network-manager
12
+ or stopping networking)
metadata ADDED
@@ -0,0 +1,119 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: migratio
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ platform: ruby
6
+ authors:
7
+ - Paweł Suder
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-01-13 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: sidekiq
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ description: Migration worker
56
+ email:
57
+ - pawel@suder.info
58
+ executables:
59
+ - migratio-client
60
+ - migratio-run
61
+ extensions: []
62
+ extra_rdoc_files: []
63
+ files:
64
+ - ".gitignore"
65
+ - Gemfile
66
+ - LICENSE.txt
67
+ - README.md
68
+ - Rakefile
69
+ - bin/migratio-client
70
+ - bin/migratio-run
71
+ - config.yml.example
72
+ - config/amazon.conf
73
+ - config/cyfronet-folsom.conf
74
+ - config/cyfronet-icehouse.conf
75
+ - config/vienna.conf
76
+ - lib/migratio/config.rb
77
+ - lib/migratio/runner.rb
78
+ - lib/migratio/worker.rb
79
+ - lib/migratio/worker/migrator.rb
80
+ - lib/migratio/worker/openstack_amazon_migrator.rb
81
+ - lib/migratio/worker/openstack_openstack_migrator.rb
82
+ - lib/migratio/worker/version.rb
83
+ - migratio.gemspec
84
+ - scripts/openstack2amazon-convert.sh
85
+ - scripts/openstack2amazon-import.sh
86
+ - scripts/openstack2amazon-register.sh
87
+ - scripts/openstack2amazon-transfer.sh
88
+ - scripts/openstack2amazon.sh
89
+ - scripts/openstack2openstack-register.sh
90
+ - scripts/openstack2openstack-transfer.sh
91
+ - scripts/openstack2openstack.sh
92
+ - support/upstart/migration-worker-1.conf
93
+ - support/upstart/migration-worker.conf
94
+ - support/upstart/migration.conf
95
+ homepage: https://github.com/dice-cyfronet/migratio
96
+ licenses:
97
+ - MIT
98
+ metadata: {}
99
+ post_install_message:
100
+ rdoc_options: []
101
+ require_paths:
102
+ - lib
103
+ required_ruby_version: !ruby/object:Gem::Requirement
104
+ requirements:
105
+ - - ">="
106
+ - !ruby/object:Gem::Version
107
+ version: '0'
108
+ required_rubygems_version: !ruby/object:Gem::Requirement
109
+ requirements:
110
+ - - ">="
111
+ - !ruby/object:Gem::Version
112
+ version: '0'
113
+ requirements: []
114
+ rubyforge_project:
115
+ rubygems_version: 2.2.2
116
+ signing_key:
117
+ specification_version: 4
118
+ summary: Worker is responsible for migrating virtual machine templates between sites
119
+ test_files: []