sistero 0.4.0 → 0.4.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4080a3d41d94a1fc0bf76f4119ee171345ffeac0
4
- data.tar.gz: 011f83fc73f1089f652443f107f1ecd3e1aee9f7
3
+ metadata.gz: fdd66f2da7e7ea38ca56f0d04c109514d747d438
4
+ data.tar.gz: 033a3a3595eae6e1b9d4fd1c0b3ace83b23364c6
5
5
  SHA512:
6
- metadata.gz: b440ed4172f0f1fea35cabb912e3f05f3e6ad6e203f3b5e2ec848e5d2193b8409e1145b7c1ef122ba0242825a32377d3d741f90d0836e8bbf1834235d322863e
7
- data.tar.gz: 13ef1838719c35eeebfade47f3ae52eaa2289b6fee33d7198c93587d672ee002e50976dba22df501b7e71e663481e7129d6b154b22ee5967d6cf367f632bd6f9
6
+ metadata.gz: d7b12ca75bcc2b361bc68cef3d1222fe0fdeddd9950a75b4e24b62c63f370b3dad83da3fac83276f037de5f41eed70d567b7b5dd83a608ae7a0c7556dafe04cc
7
+ data.tar.gz: 2a020dbeeff2bf026266b2a57ce4fe826e107d74a58434914fd51b9aeb5853387fa63c47438e45d27127b670b8f6950ce33be5d300f48eb9808465ba0904852e
data/bin/sistero CHANGED
@@ -20,13 +20,15 @@ module Sistero::Command
20
20
  end
21
21
  end
22
22
 
23
- def self.parse_opts op
24
- op.order!
23
+ def self.parse_opts op, args
24
+ args = @config.args = args.clone
25
+ op.order! args
26
+ raise "must supply subcommand" if args.empty?
25
27
 
26
- action = ARGV[0]
28
+ action = args.first
27
29
  subcmd_meta = @subcommands[action]
28
- raise "invalid subcommand #{action}" unless @subcommands.has_key? action
29
- ARGV.shift
30
+ raise "invalid subcommand: #{action}" unless @subcommands.has_key? action
31
+ args.shift
30
32
 
31
33
  @config.action = action
32
34
  OptionParser.new do |subop|
@@ -34,11 +36,10 @@ module Sistero::Command
34
36
  with_help subop
35
37
  parse_cmdline = subcmd_meta[:parse_cmdline]
36
38
  parse_cmdline.call(subop) if parse_cmdline
37
- end.order!
38
- @config.action_arg = ARGV[0]
39
+ end.order! args
39
40
  end
40
41
 
41
- def self.run
42
+ def self.run args
42
43
  OptionParser.new do |op|
43
44
  @op = op
44
45
 
@@ -56,6 +57,10 @@ module Sistero::Command
56
57
  exit
57
58
  end
58
59
 
60
+ op.on '-c', '--config file', 'override path to config file' do |cfg_file_path|
61
+ @config.cfg_file_path = cfg_file_path
62
+ end
63
+
59
64
  subcommand 'ssh', 'ssh to vm' do |subop|
60
65
  subop.on '-o val', 'add ssh options' do |ssh_options|
61
66
  @config.ssh_options = ssh_options
@@ -70,7 +75,15 @@ module Sistero::Command
70
75
 
71
76
  subcommand 'show-config', 'show configuration'
72
77
 
73
- parse_opts op
78
+ subcommand 'ssh-keys', 'show ssh keys'
79
+
80
+ subcommand 'sizes', 'show possible sizes'
81
+
82
+ subcommand 'regions', 'show possible regions'
83
+
84
+ subcommand 'images', 'show images'
85
+
86
+ parse_opts op, args
74
87
  end
75
88
 
76
89
  unless @config.action
@@ -78,26 +91,34 @@ module Sistero::Command
78
91
  exit
79
92
  end
80
93
 
81
- vm_name = @config.action_arg
82
-
83
- begin
84
- sistero = Sistero::Instance.new
85
- case @config.action
86
- when 'ssh'
87
- sistero.ssh_to_vm(vm_name, ssh_options: @config.ssh_options)
88
- when 'create'
89
- sistero.create_vm(vm_name)
90
- when 'destroy'
91
- sistero.destroy_vm(vm_name)
92
- when 'list'
93
- sistero.list_vms()
94
- when 'show-config'
95
- sistero.show_config()
96
- end
97
- rescue RuntimeError => e
98
- puts e.to_s
94
+ sistero = Sistero::Instance.new({ cfg_file_path: @config.cfg_file_path })
95
+ case @config.action
96
+ when 'ssh'
97
+ vm_name, *ssh_args = @config.args
98
+ # TODO: pass ssh_args
99
+ sistero.ssh_to_vm(vm_name, ssh_options: @config.ssh_options)
100
+ when 'create'
101
+ vms = @config.args.empty? ? [nil] : @config.args
102
+ vms.each { |vm_name| sistero.create_vm(vm_name) }
103
+ when 'destroy'
104
+ vms = @config.args.empty? ? [nil] : @config.args
105
+ vms.each { |vm_name| sistero.destroy_vm(vm_name) }
106
+ when 'list'
107
+ sistero.list_vms()
108
+ when 'show-config'
109
+ sistero.show_config()
110
+ when 'ssh-keys'
111
+ sistero.show_ssh_keys()
112
+ when 'sizes'
113
+ sistero.show_sizes()
114
+ when 'regions'
115
+ sistero.show_regions()
116
+ when 'images'
117
+ sistero.show_images()
99
118
  end
119
+ rescue RuntimeError => e
120
+ puts e.to_s
100
121
  end
101
122
  end
102
123
 
103
- Sistero::Command::run
124
+ Sistero::Command::run ARGV.clone if __FILE__ == $0
@@ -0,0 +1,63 @@
1
+ require "yaml"
2
+ APP_NAME = "sistero"
3
+
4
+ module Sistero
5
+ PROFILE_KEYS = [:vm_name, :vm_size, :vm_region, :vm_image, :access_token, :ssh_keys, :ssh_options]
6
+
7
+ Profile = Struct.new(*PROFILE_KEYS) do
8
+ def to_s
9
+ "vm #{vm_name}\n" + PROFILE_KEYS.map do |key|
10
+ val = self[key]
11
+ if val and key != :vm_name
12
+ " #{key} #{val}\n"
13
+ else
14
+ ""
15
+ end
16
+ end.join
17
+ end
18
+ end
19
+
20
+ class Config
21
+ attr_accessor :defaults, :profiles
22
+
23
+ def profile vm_name
24
+ if @defaults['vm_name'] and vm_name.nil?
25
+ profile = @defaults
26
+ else
27
+ # TODO: also handle wildcards
28
+ profile = @profiles.find do |profile|
29
+ profile.vm_name == vm_name
30
+ end
31
+ raise "could not find profile for #{vm_name}" unless profile
32
+ end
33
+ profile
34
+ end
35
+
36
+ def initialize(opts = {})
37
+ # read defaults from config file
38
+ cfg_file_path = opts[:cfg_file_path] || "#{ENV['HOME']}/.config/#{APP_NAME}"
39
+
40
+ @defaults = Profile.new
41
+ @profiles = []
42
+
43
+ cfg = YAML.load_file cfg_file_path
44
+ cfg['defaults'].each do |key, value|
45
+ @defaults[key] = value
46
+ end
47
+
48
+ @profiles = cfg['profiles'].map do |profile_cfg|
49
+ profile = Profile.new *@defaults
50
+ profile_cfg.each do |key, value|
51
+ profile[key] = value
52
+ end
53
+ profile
54
+ end
55
+
56
+ @profiles.push(@defaults) if @defaults.vm_name
57
+ end
58
+
59
+ def to_s
60
+ @profiles.map(&:to_s).join "\n"
61
+ end
62
+ end
63
+ end
@@ -1,3 +1,3 @@
1
1
  module Sistero
2
- VERSION = '0.4.0'
2
+ VERSION = '0.4.1'
3
3
  end
data/lib/sistero.rb CHANGED
@@ -1,68 +1,8 @@
1
1
  require "sistero/version"
2
- require "yaml"
2
+ require "sistero/config"
3
3
  require "droplet_kit"
4
4
 
5
- APP_NAME = "sistero"
6
-
7
5
  module Sistero
8
- PROFILE_KEYS = [:vm_name, :vm_size, :vm_region, :vm_image, :access_token, :ssh_keys, :ssh_options]
9
-
10
- Profile = Struct.new(*PROFILE_KEYS) do
11
- def to_s
12
- "vm #{vm_name}\n" + PROFILE_KEYS.map do |key|
13
- val = self[key]
14
- if val and key != :vm_name
15
- " #{key} #{val}\n"
16
- else
17
- ""
18
- end
19
- end.join
20
- end
21
- end
22
-
23
- class Config
24
- attr_accessor :defaults, :profiles
25
-
26
- def profile vm_name
27
- if @defaults['vm_name'] and vm_name.nil?
28
- profile = @defaults
29
- else
30
- # TODO: also handle wildcards
31
- profile = @profiles.find do |profile|
32
- profile.vm_name == vm_name
33
- end
34
- raise "could not find profile for #{vm_name}" unless profile
35
- end
36
- profile
37
- end
38
-
39
- def initialize(opts = {})
40
- # read defaults from config file
41
- cfg_file_path = "#{ENV['HOME']}/.config/#{APP_NAME}"
42
- @defaults = Profile.new
43
- @profiles = []
44
-
45
- cfg = YAML.load_file cfg_file_path
46
- cfg['defaults'].each do |key, value|
47
- @defaults[key] = value
48
- end
49
-
50
- @profiles = cfg['profiles'].map do |profile_cfg|
51
- profile = Profile.new *@defaults
52
- profile_cfg.each do |key, value|
53
- profile[key] = value
54
- end
55
- profile
56
- end
57
-
58
- @profiles.push(@defaults) if @defaults['vm_name']
59
- end
60
-
61
- def to_s
62
- @profiles.map(&:to_s).join "\n"
63
- end
64
- end
65
-
66
6
  class Instance
67
7
  def initialize(opts = {})
68
8
  @config = Config.new(opts)
@@ -159,5 +99,41 @@ module Sistero
159
99
  def show_config
160
100
  puts @config.to_s
161
101
  end
102
+
103
+ def show_ssh_keys
104
+ @client.ssh_keys.all().each do |key|
105
+ puts "#{key.name}: #{key.id}"
106
+ end
107
+ end
108
+
109
+ def show_sizes
110
+ @client.sizes.all().each do |size|
111
+ puts "size #{size.slug}"
112
+ puts " regions #{size.regions.join ', '}"
113
+ puts " available #{size.available}"
114
+ end
115
+ end
116
+
117
+ def show_regions
118
+ @client.regions.all().each do |region|
119
+ puts "region #{region.slug}" + (region.available ? '' : ' (unavailable)')
120
+ puts " name #{region.name}"
121
+ if region.available
122
+ puts " sizes #{region.sizes.join ', '}"
123
+ puts " features #{region.features.join ', '}"
124
+ end
125
+ end
126
+ end
127
+
128
+ def show_images
129
+ @client.images.all().each do |image|
130
+ puts "image #{image.slug}"
131
+ puts " name #{image.name}"
132
+ puts " distribution #{image.distribution}"
133
+ puts " public #{image.public}"
134
+ puts " type #{image.type}"
135
+ puts " regions #{image.regions.join ', '}"
136
+ end
137
+ end
162
138
  end
163
139
  end
data/readme.md ADDED
@@ -0,0 +1,49 @@
1
+ # Sistero
2
+
3
+ sistero is a profile based tool to manage a digital ocean cluster.
4
+
5
+ ## Installation
6
+
7
+ ```gem install sistero```
8
+
9
+ ## Configuration
10
+
11
+ The configuration file lives at `.config/sistero`, an example looks like this:
12
+
13
+ ```
14
+ defaults:
15
+ vm_name: default-vm
16
+ ssh_keys:
17
+ - 1234567
18
+ ssh_options: -D1080 -A
19
+ access_token: f788fffffffffffff8ffffffffffffffffffffff8fffffffffffffffffffffff
20
+ vm_size: 512mb
21
+ vm_region: nyc3
22
+ vm_image: ubuntu-14-04-x64
23
+ profiles:
24
+ -
25
+ vm_name: london-vm
26
+ vm_region: lon1
27
+ -
28
+ vm_name: london-bigger-vm
29
+ vm_region: lon1
30
+ vm_size: 1gb
31
+ ```
32
+
33
+ Any values not specified in a profile are taken from `defaults`. If the `defaults` entry specifies a `vm_name` then it becomes the default VM for the `create`, `ssh` and `destroy` commands.
34
+
35
+ The `ssh_keys` is a list of ID numbers (rather than names) of ssh keys, these can be found by running `sistero ssh-keys`.
36
+
37
+ The valid options for `region`, `vm_size` and `vm_image` can be found by running `sistero regions`, `sistero sizes` and `sistero images` respectively.
38
+
39
+ ## Running
40
+
41
+ Assuming the previous config file, to create a VM in new york called default-vm:
42
+ ```
43
+ sistero create
44
+ ```
45
+
46
+ Or to create a VM called `london-vm` in london:
47
+ ```
48
+ sistero create london-vm
49
+ ```
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sistero
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Pike
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-01-01 00:00:00.000000000 Z
11
+ date: 2016-01-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -80,13 +80,14 @@ files:
80
80
  - ".rspec"
81
81
  - ".travis.yml"
82
82
  - Gemfile
83
- - README.md
84
83
  - Rakefile
85
84
  - bin/console
86
85
  - bin/setup
87
86
  - bin/sistero
88
87
  - lib/sistero.rb
88
+ - lib/sistero/config.rb
89
89
  - lib/sistero/version.rb
90
+ - readme.md
90
91
  - sistero.gemspec
91
92
  homepage: http://github.com/ohjames/sistero
92
93
  licenses: []
data/README.md DELETED
@@ -1,44 +0,0 @@
1
- # Sistero
2
-
3
- sistero is a profile based tool to manage a digital ocean cluster.
4
-
5
- ## Installation
6
-
7
- ```gem install sistero```
8
-
9
- ## Usage
10
-
11
- Create a config file at `.config/sistero` with something like:
12
-
13
- ```
14
- ---
15
- defaults:
16
- vm_name: default-vm
17
- ssh_keys:
18
- - 1234567
19
- ssh_options: -D1080 -A
20
- access_token: f788fffffffffffff8ffffffffffffffffffffff8fffffffffffffffffffffff
21
- vm_size: 512mb
22
- vm_region: nyc3
23
- vm_image: ubuntu-14-04-x64
24
- profiles:
25
- -
26
- vm_name: london-vm
27
- vm_region: lon1
28
- -
29
- vm_name: london-bigger-vm
30
- vm_region: lon1
31
- vm_size: 1gb
32
- ```
33
-
34
- The `ssh_keys` is a list of the ID numbers of your ssh keys.
35
-
36
- Then to create a VM in new york called default-vm:
37
- ```
38
- sistero create
39
- ```
40
-
41
- Or to create a VM called `london-vm` in london:
42
- ```
43
- sistero create london
44
- ```