admiral-check 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +6 -0
- data/Gemfile +3 -0
- data/LICENSE +16 -0
- data/README.md +20 -0
- data/Rakefile +2 -0
- data/admiral-check.gemspec +28 -0
- data/bin/admiral +10 -0
- data/lib/admiral/config.rb +96 -0
- data/lib/admiral/core.rb +154 -0
- data/lib/admiral/docker.rb +368 -0
- data/lib/admiral/layer.rb +186 -0
- data/lib/admiral/layers/admiral.build.sh.rb +40 -0
- data/lib/admiral/layers/admiral.exemple.test.rb +25 -0
- data/lib/admiral/layers/admiral.puppet.apply.rb +31 -0
- data/lib/admiral/layers/admiral.svn.proxy.rb +42 -0
- data/lib/admiral/layers/admiral.svn.proxy.sh +9 -0
- data/lib/admiral/layers/admiral.svn.puppet.cookbook.rb +47 -0
- data/lib/admiral/layers/admiral.svn.puppet.manifest.rb +35 -0
- data/lib/admiral/layers/admiral.test.chef.install.rb +26 -0
- data/lib/admiral/layers/admiral.test.serverspec.install.rb +37 -0
- data/lib/admiral/layers/admiral.test.serverspec.install.sh +6 -0
- data/lib/admiral/layers/admiral.test.serverspec.run.rb +37 -0
- data/lib/admiral/layers/admiral.test.serverspec.run.sh +5 -0
- data/lib/admiral/layers/admiral.test.serverspec.upload.d/.rspec +4 -0
- data/lib/admiral/layers/admiral.test.serverspec.upload.d/Rakefile +17 -0
- data/lib/admiral/layers/admiral.test.serverspec.upload.rb +33 -0
- data/lib/admiral/shell.rb +30 -0
- data/lib/admiral/version.rb +19 -0
- metadata +187 -0
data/CHANGELOG.md
ADDED
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
Author:: Gattsu Blackswordsman (<gattsu.blackswordsman@gmail.com>)
|
2
|
+
|
3
|
+
Copyright (C) 2014, Gattsu Blackswordsman
|
4
|
+
|
5
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
you may not use this file except in compliance with the License.
|
7
|
+
You may obtain a copy of the License at
|
8
|
+
|
9
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
|
11
|
+
Unless required by applicable law or agreed to in writing, software
|
12
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
See the License for the specific language governing permissions and
|
15
|
+
limitations under the License.
|
16
|
+
|
data/README.md
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
# Admiral-Check
|
2
|
+
|
3
|
+
A tool for deploying and testing under docker
|
4
|
+
|
5
|
+
|
6
|
+
|
7
|
+
|
8
|
+
|
9
|
+
## Author
|
10
|
+
|
11
|
+
Created by [Gattsu][author]
|
12
|
+
|
13
|
+
## License
|
14
|
+
Apache 2.0 (see [LICENSE][license])
|
15
|
+
|
16
|
+
|
17
|
+
|
18
|
+
[author]: https://github.com/gattsublackswordsman
|
19
|
+
[license]: https://github.com/gattsublackswordsman/admiral-check/blob/master/LICENSE
|
20
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'admiral/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = 'admiral-check'
|
8
|
+
spec.version = Admiral::ADMIRAL__VERSION
|
9
|
+
spec.authors = ['Gattsu']
|
10
|
+
spec.email = ['gattsu.blackswordsman@gmail.com']
|
11
|
+
spec.description = %q{Deployment and testing tool}
|
12
|
+
spec.summary = spec.description
|
13
|
+
spec.homepage = 'https://github.com/gattsublackswordsman/admiral-check'
|
14
|
+
spec.license = 'Apache 2.0'
|
15
|
+
|
16
|
+
spec.files = `git ls-files`.split($/)
|
17
|
+
spec.executables = %w(admiral)
|
18
|
+
spec.require_paths = ['lib']
|
19
|
+
|
20
|
+
spec.add_runtime_dependency 'mixlib-shellout', '~> 1.6.1'
|
21
|
+
spec.add_runtime_dependency 'net-scp', '~> 1.1'
|
22
|
+
spec.add_runtime_dependency 'net-ssh', '~> 2.7'
|
23
|
+
spec.add_runtime_dependency 'safe_yaml', '~> 1.0'
|
24
|
+
spec.add_runtime_dependency 'thor', '~> 0.18'
|
25
|
+
|
26
|
+
spec.add_development_dependency 'bundler', '~> 1.3'
|
27
|
+
spec.add_development_dependency 'rake'
|
28
|
+
end
|
data/bin/admiral
ADDED
@@ -0,0 +1,96 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
#
|
3
|
+
|
4
|
+
require 'yaml'
|
5
|
+
|
6
|
+
module Admiral
|
7
|
+
class Config
|
8
|
+
attr_reader :platforms
|
9
|
+
|
10
|
+
def initialize
|
11
|
+
|
12
|
+
local_config_file = ".admiral.yml"
|
13
|
+
global_config_file = File.expand_path("~/.admiral.yml")
|
14
|
+
|
15
|
+
if not File.exist?(local_config_file)
|
16
|
+
STDERR.puts "File .admiral.yml must be present"
|
17
|
+
exit!
|
18
|
+
end
|
19
|
+
|
20
|
+
local_config = YAML.load_file(local_config_file)
|
21
|
+
|
22
|
+
if File.exist?(global_config_file)
|
23
|
+
global_config = YAML.load_file(File.expand_path("~/.admiral.yml"))
|
24
|
+
|
25
|
+
common_global_config = global_config['common']
|
26
|
+
common_local_config = local_config['common']
|
27
|
+
|
28
|
+
if common_global_config.nil?
|
29
|
+
if common_local_config.nil?
|
30
|
+
STDERR.puts "No common config defined"
|
31
|
+
exit!
|
32
|
+
else
|
33
|
+
common_config = common_local_config
|
34
|
+
end
|
35
|
+
else
|
36
|
+
if common_local_config.nil?
|
37
|
+
common_config = common_global_config
|
38
|
+
else
|
39
|
+
common_config = common_global_config.merge(common_local_config)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
else
|
43
|
+
common_config = local_config['common']
|
44
|
+
|
45
|
+
if common_config.nil?
|
46
|
+
STDERR.puts "No common config defined"
|
47
|
+
exit!
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
@platforms = Hash.new
|
52
|
+
@platforms_name = []
|
53
|
+
@platforms_config = Hash.new
|
54
|
+
|
55
|
+
common_applications = common_config['applications']
|
56
|
+
common_applications = [] if not common_applications
|
57
|
+
|
58
|
+
if local_config['platforms'].nil?
|
59
|
+
STDERR.puts "No platforms defined"
|
60
|
+
exit!
|
61
|
+
end
|
62
|
+
|
63
|
+
local_config['platforms'].each do | platform |
|
64
|
+
platform_name = platform['name']
|
65
|
+
@platforms[platform_name] = platform
|
66
|
+
@platforms_name << platform_name
|
67
|
+
|
68
|
+
@platforms_config[platform_name] = common_config.clone
|
69
|
+
@platforms_config[platform_name].merge!(platform)
|
70
|
+
|
71
|
+
platform_applications = @platforms_config[platform_name]['applications']
|
72
|
+
platform_applications = [] if not platform_applications
|
73
|
+
platform_applications_codes = []
|
74
|
+
|
75
|
+
platform_applications.each do |application|
|
76
|
+
platform_applications_codes << application['code']
|
77
|
+
end
|
78
|
+
|
79
|
+
common_applications.each do |application|
|
80
|
+
if not platform_applications_codes.include?(application['code'])
|
81
|
+
@platforms_config[platform_name]['applications'].push(application)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
def [](platform)
|
88
|
+
return @platforms_config[platform]
|
89
|
+
end
|
90
|
+
|
91
|
+
def platform?(platform)
|
92
|
+
return @platforms_config.key?(platform)
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
data/lib/admiral/core.rb
ADDED
@@ -0,0 +1,154 @@
|
|
1
|
+
require "thor"
|
2
|
+
require "admiral/docker"
|
3
|
+
|
4
|
+
module Admiral
|
5
|
+
|
6
|
+
class Core < Thor
|
7
|
+
|
8
|
+
def initialize(*args)
|
9
|
+
super
|
10
|
+
@config = Admiral::Config.new()
|
11
|
+
end
|
12
|
+
|
13
|
+
desc "list", "List available platforms"
|
14
|
+
def list()
|
15
|
+
platforms = @config.platforms
|
16
|
+
platforms.keys.each do | platform |
|
17
|
+
puts "#{platform}"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
desc "create NAME", "Create a container for a platform"
|
22
|
+
def create(platform_name)
|
23
|
+
|
24
|
+
if @config.platform?(platform_name)
|
25
|
+
Admiral::Docker::verify((@config[platform_name]))
|
26
|
+
Admiral::Docker::create(@config[platform_name])
|
27
|
+
else
|
28
|
+
STDERR.puts "Platform #{platform_name} don't exist"
|
29
|
+
exit!
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
desc "apply-layer PLATFORM LAYER", "Apply a layer in an existing container"
|
34
|
+
def apply_layer(platform_name, layer_uid)
|
35
|
+
Admiral::Docker::verify((@config[platform_name]))
|
36
|
+
|
37
|
+
if @config.platform?(platform_name)
|
38
|
+
container_id = Admiral::Docker::get_container_id(platform_name)
|
39
|
+
docker = @config[platform_name]['docker']
|
40
|
+
if container_id
|
41
|
+
ip_address = Admiral::Docker::get_ip_address(docker, container_id)
|
42
|
+
if ip_address
|
43
|
+
success = Admiral::Docker::apply_layer(@config[platform_name], layer_uid, ip_address)
|
44
|
+
if not success
|
45
|
+
STDERR.puts "failed to run the layer"
|
46
|
+
exit!
|
47
|
+
end
|
48
|
+
else
|
49
|
+
STDERR.puts "Failed to get IP address"
|
50
|
+
exit!
|
51
|
+
end
|
52
|
+
else
|
53
|
+
STDERR.puts "Failed to get container ID"
|
54
|
+
exit!
|
55
|
+
end
|
56
|
+
else
|
57
|
+
STDERR.puts "Platform #{platform_name} don't exist"
|
58
|
+
exit!
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
desc "login NAME", "Log in the container"
|
63
|
+
def login(platform_name)
|
64
|
+
Admiral::Docker::create(@config[platform_name])
|
65
|
+
if @config.platform?(platform_name)
|
66
|
+
Admiral::Docker::login(@config[platform_name])
|
67
|
+
else
|
68
|
+
STDERR.puts "Platform #{platform_name} don't exist"
|
69
|
+
exit!
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
desc "test NAME", "Run the tests suite"
|
74
|
+
def test(platform_name)
|
75
|
+
if @config.platform?(platform_name)
|
76
|
+
Admiral::Docker::create(@config[platform_name])
|
77
|
+
Admiral::Docker::test(@config[platform_name])
|
78
|
+
Admiral::Docker::destroy(@config[platform_name])
|
79
|
+
else
|
80
|
+
STDERR.puts "Platform #{platform_name} don't exist"
|
81
|
+
exit!
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
desc "destroy NAME", "Destroy a container"
|
86
|
+
def destroy(platform_name)
|
87
|
+
if @config.platform?(platform_name)
|
88
|
+
Admiral::Docker::destroy(@config[platform_name])
|
89
|
+
else
|
90
|
+
STDERR.puts "Platform #{platform_name} don't exist"
|
91
|
+
exit!
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
desc "layer-info NAME", "Show informations about a layer"
|
96
|
+
def layer_info(layer_uid)
|
97
|
+
begin
|
98
|
+
require "admiral/layers/#{layer_uid}.rb"
|
99
|
+
rescue LoadError
|
100
|
+
STDERR.puts "Layer #{layer_uid} not found"
|
101
|
+
return false
|
102
|
+
end
|
103
|
+
|
104
|
+
begin
|
105
|
+
kclass = ::Admiral::Layers.const_get(Admiral::Layer.uid_to_name(layer_uid))
|
106
|
+
rescue NameError
|
107
|
+
STDERR.puts "Layer #{layer_uid} has a mistake"
|
108
|
+
return false
|
109
|
+
end
|
110
|
+
layer = kclass.new(nil, nil)
|
111
|
+
layer.show_information
|
112
|
+
end
|
113
|
+
|
114
|
+
|
115
|
+
desc "config-help", "Show configuration help"
|
116
|
+
def config_help()
|
117
|
+
puts <<-EOF
|
118
|
+
|
119
|
+
The configuration is located in .admiral.yml files.
|
120
|
+
The global configuration is in ~/ and the local configuration is in any other directory.
|
121
|
+
|
122
|
+
common: # Configuration for all plaforms, in global or local configuration
|
123
|
+
docker: unix:///var/run/docker.sock # Docker socket
|
124
|
+
registry: 127.0.0.1:5000 # Docker registry
|
125
|
+
username: admiral # Username for Admiral user in the container
|
126
|
+
password: admiral # Password for Admiral
|
127
|
+
keyfile: docker_id_rsa # Private Key for Admiral connection in the container
|
128
|
+
pubkeyfile: docker_id_rsa.pub # Associated public Key
|
129
|
+
volumes: # Optional, list of volumes to export in the container
|
130
|
+
- guest: /path/in/the/guest # Path of the volume in the container
|
131
|
+
host: /path/in/the/host # Optional, path of the real directory
|
132
|
+
layers: # Layers for the configuration
|
133
|
+
- admiral.svn.puppet.manifest
|
134
|
+
- admiral.svn.puppet.cookbook
|
135
|
+
- admiral.puppet.apply
|
136
|
+
tests: # Layers for the tests
|
137
|
+
- admiral.test.chef.install
|
138
|
+
- admiral.test.serverspec.install
|
139
|
+
- admiral.test.serverspec.upload
|
140
|
+
- admiral.test.serverspec.run
|
141
|
+
|
142
|
+
platforms: # List of platforms' configuration, only in local configuration
|
143
|
+
- name: my-server
|
144
|
+
image: ubuntu16 # Docker image
|
145
|
+
hostname: web.domain.lan
|
146
|
+
lsp: false # A layer parameter
|
147
|
+
...
|
148
|
+
|
149
|
+
EOF
|
150
|
+
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
@@ -0,0 +1,368 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
#
|
3
|
+
|
4
|
+
require 'admiral/config'
|
5
|
+
require 'admiral/shell'
|
6
|
+
require 'admiral/layer'
|
7
|
+
|
8
|
+
module Admiral
|
9
|
+
module Docker
|
10
|
+
|
11
|
+
@@core_parameters = ['docker', 'image', 'username', 'password', 'keyfile', 'pubkeyfile', 'registry', 'layers', 'tests', 'hostname']
|
12
|
+
|
13
|
+
def self.verify (platform)
|
14
|
+
@@core_parameters.each do | parameter |
|
15
|
+
if not platform.key?(parameter)
|
16
|
+
STDERR.puts "Parameter #{parameter} not found"
|
17
|
+
exit!
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.create (platform)
|
23
|
+
|
24
|
+
platform_name = platform['name']
|
25
|
+
image = platform['image']
|
26
|
+
docker = platform['docker']
|
27
|
+
hostname = platform['hostname']
|
28
|
+
ssh_key_file = platform['keyfile']
|
29
|
+
username = platform['username']
|
30
|
+
password = platform['password']
|
31
|
+
volumes = platform['volumes']
|
32
|
+
|
33
|
+
last_container_id = get_container_id(platform_name)
|
34
|
+
if last_container_id
|
35
|
+
puts "Container exist : #{last_container_id}"
|
36
|
+
else
|
37
|
+
dockerfile = generate_dockerfile(platform)
|
38
|
+
|
39
|
+
volumes_cmd = ''
|
40
|
+
|
41
|
+
if volumes.kind_of?(Array)
|
42
|
+
volumes.each do | volume |
|
43
|
+
if not volume['guest']
|
44
|
+
STDERR.puts "ERROR: Volume must have 'guest' parameter"
|
45
|
+
exit!
|
46
|
+
else
|
47
|
+
if volume['host']
|
48
|
+
volumes_cmd << "-v #{volume['host']}:#{volume['guest']} "
|
49
|
+
else
|
50
|
+
volumes_cmd << "-v #{volume['guest']} "
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
puts "=== Create image ==="
|
57
|
+
|
58
|
+
begin
|
59
|
+
output = Admiral::Shell.local("docker -H #{docker} build --build-arg=USERNAME='#{username}' --build-arg=PASSWORD='#{password}' --no-cache -", {:input => dockerfile}, true)
|
60
|
+
rescue Interrupt
|
61
|
+
STDERR.puts "Creation interrupted"
|
62
|
+
exit!
|
63
|
+
end
|
64
|
+
|
65
|
+
if output
|
66
|
+
|
67
|
+
image_id = output.gsub(/.* /m, "")
|
68
|
+
puts "Image ID : #{image_id}"
|
69
|
+
|
70
|
+
Dir.mkdir(".states") unless File.exists?(".states")
|
71
|
+
f = File.open(".states/#{platform_name}.image", "w")
|
72
|
+
f.write("#{image_id}")
|
73
|
+
f.close
|
74
|
+
|
75
|
+
puts "=== Create container ==="
|
76
|
+
container_id = Admiral::Shell.local("docker -H #{docker} run -d -p 22 -h #{hostname} --privileged --cap-add ALL #{volumes_cmd} #{image_id}")
|
77
|
+
|
78
|
+
if container_id
|
79
|
+
puts "Container ID : #{container_id}"
|
80
|
+
Dir.mkdir(".states") unless File.exists?(".states")
|
81
|
+
f = File.open(".states/#{platform_name}.container", "w")
|
82
|
+
f.write("#{container_id}")
|
83
|
+
f.close
|
84
|
+
|
85
|
+
output = Admiral::Shell.local("docker -H #{docker} inspect #{container_id}")
|
86
|
+
if output
|
87
|
+
ipaddress = extract_ipaddress(output)
|
88
|
+
puts "=== Configuring container ==="
|
89
|
+
success = self.apply_layers(platform, ipaddress)
|
90
|
+
if not success
|
91
|
+
STDERR.puts "Failed to apply configuration layers, run destroy"
|
92
|
+
destroy(platform)
|
93
|
+
exit!
|
94
|
+
end
|
95
|
+
else
|
96
|
+
STDERR.puts "Failed to log in container, run destroy"
|
97
|
+
destroy(platform)
|
98
|
+
exit!
|
99
|
+
end
|
100
|
+
else
|
101
|
+
STDERR.puts "Failed to create container, run destroy"
|
102
|
+
destroy(platform)
|
103
|
+
exit!
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
def self.test (platform)
|
110
|
+
platform_name = platform['name']
|
111
|
+
testdir = "test"
|
112
|
+
if Dir.exists?(testdir)
|
113
|
+
puts "=== Run tests ==="
|
114
|
+
container_id = get_container_id(platform['name'])
|
115
|
+
docker = platform['docker']
|
116
|
+
|
117
|
+
if container_id
|
118
|
+
output = Admiral::Shell.local("docker -H #{docker} inspect #{container_id}")
|
119
|
+
if output
|
120
|
+
ipaddress = extract_ipaddress(output)
|
121
|
+
success = self.apply_test_layers(platform, ipaddress)
|
122
|
+
if not success
|
123
|
+
STDERR.puts "One or more tests failed, run destroy"
|
124
|
+
destroy(platform)
|
125
|
+
exit!
|
126
|
+
end
|
127
|
+
else
|
128
|
+
STDERR.puts "Failed to get IP address"
|
129
|
+
destroy(platform)
|
130
|
+
exit!
|
131
|
+
end
|
132
|
+
else
|
133
|
+
STDERR.puts "Failed to container ID"
|
134
|
+
destroy(platform)
|
135
|
+
exit!
|
136
|
+
end
|
137
|
+
else
|
138
|
+
STDERR.puts "Test directory not found"
|
139
|
+
destroy(platform)
|
140
|
+
exit!
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
def self.destroy (platform)
|
145
|
+
platform_name = platform['name']
|
146
|
+
docker = platform['docker']
|
147
|
+
|
148
|
+
last_container_id = get_container_id(platform_name)
|
149
|
+
if last_container_id
|
150
|
+
puts "Remove container #{last_container_id}"
|
151
|
+
Admiral::Shell.local("docker -H #{docker} rm -f #{last_container_id}")
|
152
|
+
File.delete(".states/#{platform_name}.container")
|
153
|
+
else
|
154
|
+
puts "No container"
|
155
|
+
end
|
156
|
+
|
157
|
+
last_image_id = get_image_id(platform_name)
|
158
|
+
|
159
|
+
if last_container_id
|
160
|
+
puts "Remove image #{last_image_id}"
|
161
|
+
Admiral::Shell.local("docker -H #{docker} rmi -f #{last_image_id}")
|
162
|
+
File.delete(".states/#{platform_name}.image")
|
163
|
+
else
|
164
|
+
puts "No image"
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
def self.login(platform)
|
169
|
+
|
170
|
+
container_id = get_container_id(platform['name'])
|
171
|
+
docker = platform['docker']
|
172
|
+
|
173
|
+
if container_id
|
174
|
+
output = Admiral::Shell.local("docker -H #{docker} inspect #{container_id}")
|
175
|
+
if output
|
176
|
+
ipaddress = extract_ipaddress(output)
|
177
|
+
username = platform['username']
|
178
|
+
keyfile = platform['keyfile']
|
179
|
+
cmd = "/bin/bash"
|
180
|
+
|
181
|
+
puts "Log in to #{ipaddress}"
|
182
|
+
Admiral::Shell.remote(ipaddress, username, keyfile, cmd)
|
183
|
+
else
|
184
|
+
puts "Failed to get ip address"
|
185
|
+
end
|
186
|
+
else
|
187
|
+
puts "No container"
|
188
|
+
end
|
189
|
+
end
|
190
|
+
|
191
|
+
def self.get_image_id(platform_name)
|
192
|
+
if File.exists?(".states/#{platform_name}.image")
|
193
|
+
f = File.open(".states/#{platform_name}.image", "r")
|
194
|
+
image_id = f.read()
|
195
|
+
f.close
|
196
|
+
return image_id
|
197
|
+
else
|
198
|
+
return nil
|
199
|
+
end
|
200
|
+
end
|
201
|
+
|
202
|
+
def self.get_container_id(platform_name)
|
203
|
+
if File.exists?(".states/#{platform_name}.container")
|
204
|
+
f = File.open(".states/#{platform_name}.container", "r")
|
205
|
+
container_id = f.read()
|
206
|
+
f.close
|
207
|
+
return container_id
|
208
|
+
else
|
209
|
+
return nil
|
210
|
+
end
|
211
|
+
end
|
212
|
+
|
213
|
+
def self.apply_layers(platform, ipaddress)
|
214
|
+
|
215
|
+
layers = platform['layers']
|
216
|
+
|
217
|
+
layers.each do | layer_uid |
|
218
|
+
begin
|
219
|
+
require "admiral/layers/#{layer_uid}.rb"
|
220
|
+
rescue LoadError
|
221
|
+
STDERR.puts "Layer #{layer_uid} not found"
|
222
|
+
return false
|
223
|
+
end
|
224
|
+
|
225
|
+
begin
|
226
|
+
kclass = ::Admiral::Layers.const_get(Admiral::Layer.uid_to_name(layer_uid))
|
227
|
+
rescue NameError
|
228
|
+
STDERR.puts "Layer #{layer_uid} has a mistake"
|
229
|
+
return false
|
230
|
+
end
|
231
|
+
layer = kclass.new(platform,ipaddress)
|
232
|
+
|
233
|
+
valid = layer.verify()
|
234
|
+
if not valid
|
235
|
+
return false
|
236
|
+
end
|
237
|
+
|
238
|
+
success = layer.run()
|
239
|
+
if not success
|
240
|
+
return false
|
241
|
+
end
|
242
|
+
|
243
|
+
end
|
244
|
+
return true
|
245
|
+
end
|
246
|
+
|
247
|
+
def self.apply_test_layers(platform, ipaddress)
|
248
|
+
|
249
|
+
layers = platform['tests']
|
250
|
+
|
251
|
+
layers.each do | layer_uid |
|
252
|
+
begin
|
253
|
+
require "admiral/layers/#{layer_uid}.rb"
|
254
|
+
rescue LoadError
|
255
|
+
STDERR.puts "Layer #{layer_uid} not found"
|
256
|
+
return false
|
257
|
+
end
|
258
|
+
|
259
|
+
begin
|
260
|
+
kclass = ::Admiral::Layers.const_get(Admiral::Layer.uid_to_name(layer_uid))
|
261
|
+
rescue NameError
|
262
|
+
STDERR.puts "Layer #{layer_uid} has a mistake"
|
263
|
+
return false
|
264
|
+
end
|
265
|
+
layer = kclass.new(platform,ipaddress)
|
266
|
+
|
267
|
+
valid = layer.verify()
|
268
|
+
if not valid
|
269
|
+
return false
|
270
|
+
end
|
271
|
+
|
272
|
+
success = layer.run()
|
273
|
+
if not success
|
274
|
+
return false
|
275
|
+
end
|
276
|
+
|
277
|
+
end
|
278
|
+
return true
|
279
|
+
end
|
280
|
+
|
281
|
+
|
282
|
+
def self.apply_layer(platform, layer_uid, ipaddress)
|
283
|
+
|
284
|
+
begin
|
285
|
+
require "admiral/layers/#{layer_uid}.rb"
|
286
|
+
rescue LoadError
|
287
|
+
STDERR.puts "Layer #{layer_uid} not found"
|
288
|
+
return false
|
289
|
+
end
|
290
|
+
|
291
|
+
begin
|
292
|
+
kclass = ::Admiral::Layers.const_get(Admiral::Layer.uid_to_name(layer_uid))
|
293
|
+
rescue NameError
|
294
|
+
STDERR.puts "Layer #{layer_uid} has a mistake"
|
295
|
+
return false
|
296
|
+
end
|
297
|
+
layer = kclass.new(platform,ipaddress)
|
298
|
+
|
299
|
+
valid = layer.verify()
|
300
|
+
if not valid
|
301
|
+
return false
|
302
|
+
end
|
303
|
+
|
304
|
+
return layer.run()
|
305
|
+
end
|
306
|
+
|
307
|
+
|
308
|
+
def self.generate_dockerfile(platform)
|
309
|
+
image = platform["image"]
|
310
|
+
username = platform['username']
|
311
|
+
password = platform['password']
|
312
|
+
pubkeyfile = platform['pubkeyfile']
|
313
|
+
registry = platform['registry']
|
314
|
+
|
315
|
+
begin
|
316
|
+
f = File.open(pubkeyfile, 'r')
|
317
|
+
public_key = f.read().chomp()
|
318
|
+
f.close
|
319
|
+
rescue Errno::ENOENT => e
|
320
|
+
STDERR.puts "Error with public key : #{e.message}"
|
321
|
+
exit!
|
322
|
+
end
|
323
|
+
|
324
|
+
from = "FROM #{registry}/#{image}\n"
|
325
|
+
|
326
|
+
user = <<-eos
|
327
|
+
ARG USERNAME
|
328
|
+
ARG PASSWORD
|
329
|
+
RUN useradd -d /home/${USERNAME} -m -s /bin/bash ${USERNAME}
|
330
|
+
RUN echo ${USERNAME}:${PASSWORD} | chpasswd
|
331
|
+
RUN echo "${USERNAME} ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
|
332
|
+
eos
|
333
|
+
|
334
|
+
key = <<-eos
|
335
|
+
RUN mkdir /home/${USERNAME}/.ssh
|
336
|
+
RUN echo '#{public_key}' >> /home/${USERNAME}/.ssh/authorized_keys
|
337
|
+
eos
|
338
|
+
|
339
|
+
tmpdir = <<-eos
|
340
|
+
RUN mkdir /tmp/${USERNAME}/
|
341
|
+
RUN chown ${USERNAME}:${USERNAME} /tmp/${USERNAME}
|
342
|
+
eos
|
343
|
+
|
344
|
+
ssh_env = <<-eos
|
345
|
+
RUN echo "AcceptEnv *" >> /etc/ssh/sshd_config
|
346
|
+
eos
|
347
|
+
|
348
|
+
[from, user, key, tmpdir, ssh_env].join("\n")
|
349
|
+
end
|
350
|
+
|
351
|
+
def self.get_ip_address(docker, container_id)
|
352
|
+
container_info = Admiral::Shell.local("docker -H #{docker} inspect #{container_id}")
|
353
|
+
if container_info
|
354
|
+
data = YAML.load(container_info).first
|
355
|
+
return data['NetworkSettings']['IPAddress']
|
356
|
+
else
|
357
|
+
return nil
|
358
|
+
end
|
359
|
+
end
|
360
|
+
|
361
|
+
def self.extract_ipaddress(container_info)
|
362
|
+
data = YAML.load(container_info).first
|
363
|
+
return data['NetworkSettings']['IPAddress']
|
364
|
+
end
|
365
|
+
|
366
|
+
end
|
367
|
+
end
|
368
|
+
|