sistero 0.6.0 → 0.7.0
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 +4 -4
- data/bin/sistero +4 -2
- data/lib/sistero/config.rb +28 -28
- data/lib/sistero/version.rb +1 -1
- data/lib/sistero.rb +38 -38
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3c05a40e7cbaf966250545adca8bedcaeab750a7
|
4
|
+
data.tar.gz: 28d77522246e1e102e90bb25919fedd756bd8fe9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2eadc9dcdc499285f719f8798e6fbcb64192eb816cd778f01df49097ee11f5b4d2ce5bde18f8bfbda735268ff68ba1dfc5af5fab19186319338a18d83e08f2a6
|
7
|
+
data.tar.gz: 40c4a034b59468d9dc3201f0b69abe04a0239d884749c967311bb310fe5349e0c335d3c6a390e85f03d09e78f4a40bee85d0a18297ba519ed9728027cfce7409
|
data/bin/sistero
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
require 'bundler/setup'
|
4
4
|
require 'sistero'
|
5
|
+
require 'sistero/version'
|
5
6
|
require 'moister'
|
6
7
|
|
7
8
|
module Sistero::Command
|
@@ -10,7 +11,8 @@ module Sistero::Command
|
|
10
11
|
command = nil
|
11
12
|
|
12
13
|
Moister::SubcommandOptionParser.new do |op|
|
13
|
-
op.banner =
|
14
|
+
op.banner = "sistero #{Sistero::VERSION}\nusage: sistero [global options] command [command options]"
|
15
|
+
op.version = Sistero::VERSION
|
14
16
|
|
15
17
|
op.for_all do |op|
|
16
18
|
op.on_tail '-h', '--help', 'show this help message' do
|
@@ -26,7 +28,7 @@ module Sistero::Command
|
|
26
28
|
end
|
27
29
|
|
28
30
|
op.subcommand 'create [*vms]', 'create vm'
|
29
|
-
op.subcommand 'create-all', 'create all vms in
|
31
|
+
op.subcommand 'create-all', 'create all vms in config'
|
30
32
|
op.subcommand 'destroy [*vms]', 'destroy vm'
|
31
33
|
op.subcommand 'list', 'list vms'
|
32
34
|
op.subcommand 'show-config', 'show configuration'
|
data/lib/sistero/config.rb
CHANGED
@@ -2,14 +2,14 @@ require "yaml"
|
|
2
2
|
APP_NAME = "sistero"
|
3
3
|
|
4
4
|
module Sistero
|
5
|
-
|
6
|
-
|
5
|
+
VM_KEYS = [:name, :size, :region, :image, :access_token, :user_data, :private_networking,
|
6
|
+
:ssh_keys, :ssh_options, :ssh_user ]
|
7
7
|
|
8
|
-
|
8
|
+
VM = Struct.new(*VM_KEYS) do
|
9
9
|
def to_s
|
10
|
-
"vm #{
|
10
|
+
"vm #{name}\n" + VM_KEYS.map do |key|
|
11
11
|
val = self[key]
|
12
|
-
if val and key != :
|
12
|
+
if val and key != :name
|
13
13
|
" #{key} #{val}\n"
|
14
14
|
else
|
15
15
|
""
|
@@ -19,17 +19,17 @@ module Sistero
|
|
19
19
|
end
|
20
20
|
|
21
21
|
class Config
|
22
|
-
attr_accessor :defaults, :
|
22
|
+
attr_accessor :defaults, :vms
|
23
23
|
|
24
|
-
def
|
25
|
-
|
26
|
-
raise "must set a default
|
24
|
+
def vm name
|
25
|
+
name ||= @defaults['name']
|
26
|
+
raise "must set a default name or specify one" unless name
|
27
27
|
# TODO: also handle wildcards
|
28
|
-
|
29
|
-
|
28
|
+
vm = @vms.find do |vm|
|
29
|
+
vm.name == name
|
30
30
|
end
|
31
|
-
raise "could not find
|
32
|
-
|
31
|
+
raise "could not find vm for #{name}" unless vm
|
32
|
+
vm
|
33
33
|
end
|
34
34
|
|
35
35
|
def initialize(opts = {})
|
@@ -40,8 +40,8 @@ module Sistero
|
|
40
40
|
@cfg_file_path = "#{ENV['HOME']}/.config/#{APP_NAME}" unless File.exists? @cfg_file_path
|
41
41
|
end
|
42
42
|
|
43
|
-
@defaults =
|
44
|
-
@
|
43
|
+
@defaults = VM.new
|
44
|
+
@vms = []
|
45
45
|
|
46
46
|
cfg = YAML.load_file @cfg_file_path
|
47
47
|
postprocess_cfg cfg
|
@@ -50,30 +50,30 @@ module Sistero
|
|
50
50
|
@defaults[key] = value
|
51
51
|
end
|
52
52
|
|
53
|
-
@
|
54
|
-
|
55
|
-
|
53
|
+
@vms = cfg['vms'].map do |vm_cfg|
|
54
|
+
vm = VM.new *@defaults
|
55
|
+
vm.name = nil
|
56
56
|
|
57
|
-
|
58
|
-
|
57
|
+
vm_cfg.each do |key, value|
|
58
|
+
vm[key] = value
|
59
59
|
end
|
60
|
-
unless
|
61
|
-
user_data =
|
62
|
-
|
63
|
-
value =
|
60
|
+
unless vm.user_data.nil?
|
61
|
+
user_data = vm.user_data.dup
|
62
|
+
VM_KEYS.each do |key|
|
63
|
+
value = vm[key]
|
64
64
|
if value.is_a? String
|
65
65
|
user_data.gsub! "\#{#{key}}", value
|
66
66
|
end
|
67
67
|
end
|
68
|
-
|
68
|
+
vm.user_data = user_data
|
69
69
|
end
|
70
|
-
raise "every
|
71
|
-
|
70
|
+
raise "every vm must have a name field" unless vm.name
|
71
|
+
vm
|
72
72
|
end
|
73
73
|
end
|
74
74
|
|
75
75
|
def to_s
|
76
|
-
@
|
76
|
+
@vms.map(&:to_s).join "\n"
|
77
77
|
end
|
78
78
|
|
79
79
|
private
|
data/lib/sistero/version.rb
CHANGED
data/lib/sistero.rb
CHANGED
@@ -9,8 +9,8 @@ module Sistero
|
|
9
9
|
@client = DropletKit::Client.new(access_token: @config.defaults.access_token)
|
10
10
|
end
|
11
11
|
|
12
|
-
def
|
13
|
-
@client.droplets.all.find { |vm| vm.name ==
|
12
|
+
def find_droplet(name)
|
13
|
+
@client.droplets.all.find { |vm| vm.name == name }
|
14
14
|
end
|
15
15
|
|
16
16
|
def list_vms()
|
@@ -19,33 +19,33 @@ module Sistero
|
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
22
|
-
def
|
23
|
-
|
24
|
-
|
25
|
-
[
|
22
|
+
def get_vm name
|
23
|
+
vm = @config.vm name
|
24
|
+
name = vm.name if name.nil?
|
25
|
+
[ vm, name ]
|
26
26
|
end
|
27
27
|
|
28
|
-
def
|
29
|
-
|
30
|
-
puts "creating vm: #{
|
31
|
-
|
32
|
-
|
33
|
-
name:
|
34
|
-
region:
|
35
|
-
size:
|
36
|
-
image:
|
37
|
-
ssh_keys:
|
38
|
-
user_data:
|
39
|
-
private_networking:
|
28
|
+
def create_droplet_from_vm(name)
|
29
|
+
vm, name = get_vm name
|
30
|
+
puts "creating vm: #{name}"
|
31
|
+
|
32
|
+
droplet = DropletKit::Droplet.new(
|
33
|
+
name: name,
|
34
|
+
region: vm.region,
|
35
|
+
size: vm.size,
|
36
|
+
image: vm.image,
|
37
|
+
ssh_keys: vm.ssh_keys,
|
38
|
+
user_data: vm.user_data,
|
39
|
+
private_networking: vm.private_networking
|
40
40
|
)
|
41
|
-
|
42
|
-
puts "created: #{
|
43
|
-
|
41
|
+
droplet = @client.droplets.create(droplet)
|
42
|
+
puts "created: #{vm.to_s}"
|
43
|
+
droplet
|
44
44
|
end
|
45
45
|
|
46
46
|
def create_all
|
47
|
-
@config.
|
48
|
-
|
47
|
+
@config.vms.each do |vm|
|
48
|
+
create_droplet_from_vm vm.name
|
49
49
|
end
|
50
50
|
end
|
51
51
|
|
@@ -65,17 +65,17 @@ module Sistero
|
|
65
65
|
return false
|
66
66
|
end
|
67
67
|
|
68
|
-
def ssh_to_vm(
|
69
|
-
|
70
|
-
ssh_options ||=
|
68
|
+
def ssh_to_vm(name, ssh_options: nil)
|
69
|
+
vm, name = get_vm name
|
70
|
+
ssh_options ||= vm.ssh_options
|
71
71
|
|
72
|
-
|
73
|
-
public_network =
|
72
|
+
droplet = find_droplet(name) || create_droplet_from_vm(name)
|
73
|
+
public_network = droplet.networks.v4.find { |network| network.type == 'public' }
|
74
74
|
until public_network
|
75
75
|
puts "no public interfaces, trying again in a second"
|
76
76
|
sleep 1
|
77
|
-
|
78
|
-
public_network =
|
77
|
+
droplet = find_droplet(name)
|
78
|
+
public_network = droplet.networks.v4.find { |network| network.type == 'public' }
|
79
79
|
end
|
80
80
|
ip = public_network.ip_address
|
81
81
|
|
@@ -87,20 +87,20 @@ module Sistero
|
|
87
87
|
end
|
88
88
|
end
|
89
89
|
|
90
|
-
cmd = "ssh -o 'StrictHostKeyChecking no' #{ssh_options} #{
|
90
|
+
cmd = "ssh -o 'StrictHostKeyChecking no' #{ssh_options} #{vm.ssh_user || 'root'}@#{ip}"
|
91
91
|
puts cmd
|
92
92
|
exec cmd
|
93
93
|
end
|
94
94
|
|
95
|
-
def destroy_vm(
|
96
|
-
|
95
|
+
def destroy_vm(name)
|
96
|
+
vm, name = get_vm name
|
97
97
|
|
98
|
-
|
99
|
-
if
|
100
|
-
puts "destroying #{
|
101
|
-
@client.droplets.delete(id:
|
98
|
+
droplet = find_droplet(name)
|
99
|
+
if droplet
|
100
|
+
puts "destroying #{droplet.id}"
|
101
|
+
@client.droplets.delete(id: droplet.id)
|
102
102
|
else
|
103
|
-
puts "vm #{
|
103
|
+
puts "vm #{name} not found"
|
104
104
|
end
|
105
105
|
end
|
106
106
|
|