cyoi 0.5.1 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ MDA0OTA5Y2IyMTc3MWYyZTg4NDcyN2M3NWQwN2M5MzU5MmZhMWRhZg==
5
+ data.tar.gz: !binary |-
6
+ MjE4Yjc1OTU4MjcwMDMzMzU4YWE5YTYxMDQ0YTQxODBhZWY5MWI1NQ==
7
+ SHA512:
8
+ metadata.gz: !binary |-
9
+ YWEyNDY1MTc4YTFjODcyMTgzZmRlNWFiYTBiYmExZGNjYmI0ZTM1OTgyOWY3
10
+ MzYzZWY3NDk1NDVhMzA3NDBkNTJmMGE0MjM5MTZkN2QzYjMyODI2NjA2NmY1
11
+ N2E1ZWYyODlmZDQwOWFkNTNmZTIyZjZhYWRiMjVmNmJmNGQzMWE=
12
+ data.tar.gz: !binary |-
13
+ MDczYzBhMTBjY2M2NWZhMzkxZTc1ZTM0OGIyNGY0M2E5YTVhMzBkYmZhMzQ3
14
+ YmFkNjFhNmZlNzc3M2FmNjk2MmZlZDI3ZmE3ZWM2YjBiYmNiOTMxMjM3Nzcx
15
+ NDI5MGNlYzc0MzFiZDVhMjYyNGVkZmIxYjM5M2RiMWQyNWEyZmU=
data/.travis.yml CHANGED
@@ -13,5 +13,6 @@ notifications:
13
13
  env:
14
14
  matrix:
15
15
  - SUITE=unit
16
+ - SUITE=integration
16
17
  global:
17
18
  - secure: ""
data/ChangeLog.md CHANGED
@@ -2,6 +2,10 @@
2
2
 
3
3
  Cyoi (choose-your-own-infrastructure) is a library to ask an end-user to choose an infrastructure (AWS, OpenStack, etc), region, and login credentials.
4
4
 
5
+ ## v0.6
6
+
7
+ * added `cyoi image` - AWS: public AMI for Ubuntu 13.04; OpenStack: choose an Image from menu
8
+
5
9
  ## v0.5
6
10
 
7
11
  * OpenStack implementation completed by Ferdy!
data/bin/cyoi CHANGED
@@ -14,6 +14,9 @@ when :provider
14
14
  when :address
15
15
  require "cyoi/cli/address"
16
16
  Cyoi::Cli::Address.new(argv)
17
+ when :image
18
+ require "cyoi/cli/image"
19
+ Cyoi::Cli::Image.new(argv)
17
20
  when :keypair, :key_pair
18
21
  require "cyoi/cli/key_pair"
19
22
  Cyoi::Cli::KeyPair.new(argv)
@@ -0,0 +1,61 @@
1
+ require "cyoi/cli"
2
+ require "cyoi/cli/auto_detection"
3
+ require "cyoi/cli/helpers"
4
+ class Cyoi::Cli::Image
5
+ include Cyoi::Cli::Helpers
6
+
7
+ def initialize(argv, stdin=STDIN, stdout=STDOUT, stderr=STDERR, kernel=Kernel)
8
+ @argv, @stdin, @stdout, @stderr, @kernel = argv, stdin, stdout, stderr, kernel
9
+ @settings_dir = @argv.shift || "/tmp/provider_settings"
10
+ @settings_dir = File.expand_path(@settings_dir)
11
+ end
12
+
13
+ # TODO run Cyoi::Cli::Provider first if settings.provider.name missing
14
+ def execute!
15
+ unless settings.exists?("provider.name")
16
+ $stderr.puts("Please run 'cyoi provider' first")
17
+ exit 1
18
+ end
19
+ unless valid?
20
+ settings["image"] = perform_and_return_attributes
21
+ save_settings!
22
+ end
23
+ image_cli.display_confirmation
24
+ end
25
+
26
+ # Continue the interactive session with the user
27
+ # specific to the infrastructure they have chosen.
28
+ #
29
+ # The returned object is a class from cyoi/cli/provider_image/provier_cli_INFRASTRUCTURE.rb
30
+ # The class loads itself into `@image_clis` via `register_image_cli`
31
+ #
32
+ # Returns nil if settings.key_pair.name not set
33
+ def image_cli
34
+ @image_cli ||= begin
35
+ provider_name = settings.exists?("provider.name")
36
+ return nil unless provider_name
37
+ require "cyoi/cli/provider_image/image_cli_#{settings.provider.name}"
38
+ settings["image"] ||= {}
39
+ klass = self.class.image_cli(settings.provider.name)
40
+ klass.new(provider_client, settings.image, hl)
41
+ end
42
+ end
43
+
44
+ def perform_and_return_attributes
45
+ image_cli.perform_and_return_attributes
46
+ end
47
+
48
+ def self.register_image_cli(name, klass)
49
+ @image_clis ||= {}
50
+ @image_clis[name] = klass
51
+ end
52
+
53
+ def self.image_cli(name)
54
+ @image_clis[name]
55
+ end
56
+
57
+ protected
58
+ def valid?
59
+ settings["image"] && settings["image"]["image_id"]
60
+ end
61
+ end
@@ -0,0 +1,34 @@
1
+ require "cyoi/cli/provider_image/image_cli_base"
2
+ class Cyoi::Cli::Image::ImageCliAws < Cyoi::Cli::Image::ImageCliBase
3
+
4
+ def image_id
5
+ ubuntu_1304_image_id
6
+ end
7
+
8
+ # Ubuntu 13.04
9
+ def ubuntu_1304_image_id
10
+ region = provider_client.attributes.region
11
+ # http://cloud-images.ubuntu.com/locator/ec2/
12
+ image_id = case region.to_s
13
+ when "ap-northeast-1"
14
+ "ami-6b26ab6a"
15
+ when "ap-southeast-1"
16
+ "ami-2b511e79"
17
+ when "eu-west-1"
18
+ "ami-3d160149"
19
+ when "sa-east-1"
20
+ "ami-28e43e35"
21
+ when "us-east-1"
22
+ "ami-c30360aa"
23
+ when "us-west-1"
24
+ "ami-d383af96"
25
+ when "ap-southeast-2"
26
+ "ami-84a333be"
27
+ when "us-west-2"
28
+ "ami-bf1d8a8f"
29
+ end
30
+ image_id || raise("Please add Ubuntu 13.04 64bit (EBS) AMI image id to aws.rb#raring_image_id method for region '#{region}'")
31
+ end
32
+ end
33
+
34
+ Cyoi::Cli::Image.register_image_cli("aws", Cyoi::Cli::Image::ImageCliAws)
@@ -0,0 +1,34 @@
1
+ class Cyoi::Cli::Image; end
2
+ class Cyoi::Cli::Image::ImageCliBase
3
+ attr_reader :provider_client
4
+ attr_reader :attributes
5
+ attr_reader :hl
6
+
7
+ def initialize(provider_client, attributes, highline)
8
+ @provider_client = provider_client
9
+ @hl = highline
10
+ @attributes = attributes.is_a?(Hash) ? ReadWriteSettings.new(attributes) : attributes
11
+ raise "@attributes must be ReadWriteSettings (or Hash); was #{@attributes.class}" unless @attributes.is_a?(ReadWriteSettings)
12
+ end
13
+
14
+ def perform_and_return_attributes
15
+ unless valid?
16
+ attributes["image_id"] = image_id
17
+ end
18
+ export_attributes
19
+ end
20
+
21
+ # helper to export the complete nested attributes.
22
+ def export_attributes
23
+ attributes.to_nested_hash
24
+ end
25
+
26
+ def valid?
27
+ attributes["image_id"]
28
+ end
29
+
30
+ def display_confirmation
31
+ puts "\n"
32
+ puts "Confirming: Using image #{attributes["image_id"]}"
33
+ end
34
+ end
@@ -0,0 +1,23 @@
1
+ require "cyoi/cli/provider_image/image_cli_base"
2
+ class Cyoi::Cli::Image::ImageCliOpenStack < Cyoi::Cli::Image::ImageCliBase
3
+
4
+ def image_id
5
+ choose_image_id
6
+ end
7
+
8
+ def choose_image_id
9
+ hl.choose do |menu|
10
+ menu.prompt = "Choose image: "
11
+ images.each do |image|
12
+ label, code = image[:label], image[:code]
13
+ menu.choice(label) { return code }
14
+ end
15
+ end
16
+ end
17
+
18
+ def images
19
+ provider_client.fog_compute.images.map { |image| { label: image.name, code: image.id }}
20
+ end
21
+ end
22
+
23
+ Cyoi::Cli::Image.register_image_cli("openstack", Cyoi::Cli::Image::ImageCliOpenStack)
data/lib/cyoi/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Cyoi
2
- VERSION = "0.5.1"
2
+ VERSION = "0.6.0"
3
3
  end
@@ -0,0 +1,15 @@
1
+ describe "cyoi image aws" do
2
+ include Cyoi::Cli::Helpers::Settings
3
+ include SettingsHelper
4
+ include Aruba::Api
5
+ before { @settings_dir = File.expand_path("~/.cyoi_client_lib") }
6
+
7
+ it "provider choices already made" do
8
+ setting "provider.name", "aws"
9
+ setting "provider.credentials.aws_access_key_id", "aws_access_key_id"
10
+ setting "provider.credentials.aws_secret_access_key", "aws_secret_access_key"
11
+ setting "provider.region", "us-west-2"
12
+ run_interactive(unescape("cyoi image #{settings_dir}"))
13
+ assert_passing_with("Confirming: Using image ami-bf1d8a8f")
14
+ end
15
+ end
@@ -0,0 +1,28 @@
1
+ describe "cyoi image openstack" do
2
+ include Cyoi::Cli::Helpers::Settings
3
+ include SettingsHelper
4
+ include Aruba::Api
5
+ before { @settings_dir = File.expand_path("~/.cyoi_client_lib") }
6
+
7
+ it "provider choices already made" do
8
+ setting "provider.name", "openstack"
9
+ setting "provider.credentials.openstack_username", "username"
10
+ setting "provider.credentials.openstack_api_key", "password"
11
+ setting "provider.credentials.openstack_tenant", "tenant"
12
+ setting "provider.credentials.openstack_auth_url", "http://1.2.3.4:5000/v2.0/tokens"
13
+ setting "provider.credentials.openstack_region", ""
14
+
15
+ run_interactive(unescape("cyoi image #{settings_dir}"))
16
+ type("1")
17
+ assert_passing_with(<<-OUT)
18
+ 1. cirros-0.3.0-x86_64-blank
19
+ Choose image:
20
+ Confirming: Using image 0e09fbd6-43c5-448a-83e9-0d3d05f9747e
21
+ OUT
22
+
23
+ reload_settings!
24
+ settings.image.to_nested_hash.should == {
25
+ "image_id" => "0e09fbd6-43c5-448a-83e9-0d3d05f9747e"
26
+ }
27
+ end
28
+ end
@@ -0,0 +1,66 @@
1
+ require "fog"
2
+ require "cyoi/cli/image"
3
+
4
+ describe "cyoi" do
5
+ include Cyoi::Cli::Helpers::Settings
6
+ include SettingsHelper
7
+ include StdoutCapture
8
+ include Aruba::Api
9
+ before { @settings_dir = File.expand_path("~/.cyoi_client_lib") }
10
+ before { Fog.mock!; Fog::Mock.reset }
11
+
12
+ describe "cyoi image aws" do
13
+ before do
14
+ setting "provider.name", "aws"
15
+ setting "provider.credentials.aws_access_key_id", "aws_access_key_id"
16
+ setting "provider.credentials.aws_secret_access_key", "aws_secret_access_key"
17
+ setting "provider.region", "us-west-2"
18
+ end
19
+
20
+ subject { Cyoi::Cli::Image.new([settings_dir]) }
21
+
22
+ let(:fog_compute) { subject.key_pair_cli.provider_client.fog_compute }
23
+
24
+ it "does nothing if image_id already set" do
25
+ setting "image.image_id", "ami-123456"
26
+ capture_stdout { subject.execute! }
27
+ reload_settings!
28
+ settings.image.image_id.should == "ami-123456"
29
+ end
30
+
31
+ it "auto-selects Ubuntu 13.04 image in region" do
32
+ capture_stdout { subject.execute! }
33
+ reload_settings!
34
+ settings.image.image_id.should == "ami-bf1d8a8f"
35
+ end
36
+ end
37
+
38
+ describe "cyoi image openstack" do
39
+ before do
40
+ setting "provider.name", "openstack"
41
+ setting "provider.credentials.openstack_username", "username"
42
+ setting "provider.credentials.openstack_api_key", "password"
43
+ setting "provider.credentials.openstack_tenant", "tenant"
44
+ setting "provider.credentials.openstack_auth_url", "http://1.2.3.4:5000/v2.0/tokens"
45
+ setting "provider.credentials.openstack_region", ""
46
+ end
47
+
48
+ subject { Cyoi::Cli::Image.new([settings_dir]) }
49
+
50
+ let(:fog_compute) { subject.key_pair_cli.provider_client.fog_compute }
51
+
52
+ it "does nothing if image_id already set" do
53
+ setting "image.image_id", "b2d1fa83-67aa-4b6d-b171-5ea466d6d8ab"
54
+ capture_stdout { subject.execute! }
55
+ reload_settings!
56
+ settings.image.image_id.should == "b2d1fa83-67aa-4b6d-b171-5ea466d6d8ab"
57
+ end
58
+
59
+ it "prompts for image in menu" do
60
+ subject.should_receive(:perform_and_return_attributes).and_return({"image_id" => "chosen-image-id"})
61
+ capture_stdout { subject.execute! }
62
+ reload_settings!
63
+ settings.image.image_id.should == "chosen-image-id"
64
+ end
65
+ end
66
+ end
metadata CHANGED
@@ -1,20 +1,18 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cyoi
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.1
5
- prerelease:
4
+ version: 0.6.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Dr Nic Williams
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-05-24 00:00:00.000000000 Z
11
+ date: 2013-10-27 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: fog
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
17
  - - ! '>='
20
18
  - !ruby/object:Gem::Version
@@ -22,7 +20,6 @@ dependencies:
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
24
  - - ! '>='
28
25
  - !ruby/object:Gem::Version
@@ -30,7 +27,6 @@ dependencies:
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: highline
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
31
  - - ~>
36
32
  - !ruby/object:Gem::Version
@@ -38,7 +34,6 @@ dependencies:
38
34
  type: :runtime
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
38
  - - ~>
44
39
  - !ruby/object:Gem::Version
@@ -46,7 +41,6 @@ dependencies:
46
41
  - !ruby/object:Gem::Dependency
47
42
  name: readwritesettings
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
45
  - - ~>
52
46
  - !ruby/object:Gem::Version
@@ -54,7 +48,6 @@ dependencies:
54
48
  type: :runtime
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
51
  requirements:
59
52
  - - ~>
60
53
  - !ruby/object:Gem::Version
@@ -62,7 +55,6 @@ dependencies:
62
55
  - !ruby/object:Gem::Dependency
63
56
  name: bundler
64
57
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
58
  requirements:
67
59
  - - ~>
68
60
  - !ruby/object:Gem::Version
@@ -70,7 +62,6 @@ dependencies:
70
62
  type: :development
71
63
  prerelease: false
72
64
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
65
  requirements:
75
66
  - - ~>
76
67
  - !ruby/object:Gem::Version
@@ -78,7 +69,6 @@ dependencies:
78
69
  - !ruby/object:Gem::Dependency
79
70
  name: rake
80
71
  requirement: !ruby/object:Gem::Requirement
81
- none: false
82
72
  requirements:
83
73
  - - ! '>='
84
74
  - !ruby/object:Gem::Version
@@ -86,7 +76,6 @@ dependencies:
86
76
  type: :development
87
77
  prerelease: false
88
78
  version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
79
  requirements:
91
80
  - - ! '>='
92
81
  - !ruby/object:Gem::Version
@@ -94,7 +83,6 @@ dependencies:
94
83
  - !ruby/object:Gem::Dependency
95
84
  name: rspec
96
85
  requirement: !ruby/object:Gem::Requirement
97
- none: false
98
86
  requirements:
99
87
  - - ! '>='
100
88
  - !ruby/object:Gem::Version
@@ -102,7 +90,6 @@ dependencies:
102
90
  type: :development
103
91
  prerelease: false
104
92
  version_requirements: !ruby/object:Gem::Requirement
105
- none: false
106
93
  requirements:
107
94
  - - ! '>='
108
95
  - !ruby/object:Gem::Version
@@ -110,7 +97,6 @@ dependencies:
110
97
  - !ruby/object:Gem::Dependency
111
98
  name: aruba
112
99
  requirement: !ruby/object:Gem::Requirement
113
- none: false
114
100
  requirements:
115
101
  - - ! '>='
116
102
  - !ruby/object:Gem::Version
@@ -118,7 +104,6 @@ dependencies:
118
104
  type: :development
119
105
  prerelease: false
120
106
  version_requirements: !ruby/object:Gem::Requirement
121
- none: false
122
107
  requirements:
123
108
  - - ! '>='
124
109
  - !ruby/object:Gem::Version
@@ -152,10 +137,14 @@ files:
152
137
  - lib/cyoi/cli/helpers/interactions.rb
153
138
  - lib/cyoi/cli/helpers/provider.rb
154
139
  - lib/cyoi/cli/helpers/settings.rb
140
+ - lib/cyoi/cli/image.rb
155
141
  - lib/cyoi/cli/key_pair.rb
156
142
  - lib/cyoi/cli/provider.rb
157
143
  - lib/cyoi/cli/provider_addresses/address_cli_aws.rb
158
144
  - lib/cyoi/cli/provider_addresses/address_cli_openstack.rb
145
+ - lib/cyoi/cli/provider_image/image_cli_aws.rb
146
+ - lib/cyoi/cli/provider_image/image_cli_base.rb
147
+ - lib/cyoi/cli/provider_image/image_cli_openstack.rb
159
148
  - lib/cyoi/cli/provider_key_pair/key_pair_aws.rb
160
149
  - lib/cyoi/cli/provider_key_pair/key_pair_openstack.rb
161
150
  - lib/cyoi/cli/providers/provider_cli.rb
@@ -172,6 +161,8 @@ files:
172
161
  - spec/.DS_Store
173
162
  - spec/integration/cli/address/address_aws_spec.rb
174
163
  - spec/integration/cli/address/address_openstack_spec.rb
164
+ - spec/integration/cli/image/image_aws_spec.rb
165
+ - spec/integration/cli/image/image_openstack_spec.rb
175
166
  - spec/integration/cli/key_pair/key_pair_aws_spec.rb
176
167
  - spec/integration/cli/key_pair/key_pair_openstack_spec.rb
177
168
  - spec/integration/cli/provider/provider_aws_spec.rb
@@ -180,37 +171,31 @@ files:
180
171
  - spec/support/settings_helper.rb
181
172
  - spec/support/stdout_capture.rb
182
173
  - spec/unit/.gitkeep
174
+ - spec/unit/cli/image_spec.rb
183
175
  - spec/unit/cli/key_pair_spec.rb
184
176
  homepage: https://github.com/drnic/cyoi
185
177
  licenses:
186
178
  - MIT
179
+ metadata: {}
187
180
  post_install_message:
188
181
  rdoc_options: []
189
182
  require_paths:
190
183
  - lib
191
184
  required_ruby_version: !ruby/object:Gem::Requirement
192
- none: false
193
185
  requirements:
194
186
  - - ! '>='
195
187
  - !ruby/object:Gem::Version
196
188
  version: '0'
197
- segments:
198
- - 0
199
- hash: 3082000765500697274
200
189
  required_rubygems_version: !ruby/object:Gem::Requirement
201
- none: false
202
190
  requirements:
203
191
  - - ! '>='
204
192
  - !ruby/object:Gem::Version
205
193
  version: '0'
206
- segments:
207
- - 0
208
- hash: 3082000765500697274
209
194
  requirements: []
210
195
  rubyforge_project:
211
- rubygems_version: 1.8.25
196
+ rubygems_version: 2.1.2
212
197
  signing_key:
213
- specification_version: 3
198
+ specification_version: 4
214
199
  summary: A library to ask an end-user to choose an infrastructure (AWS, OpenStack,
215
200
  etc), region, and login credentials. This library was extracted from [inception-server](https://github.com/drnic/inception-server)
216
201
  for reuse by [bosh-bootstrap](https://github.com/StarkAndWayne/bosh-bootstrap).
@@ -221,6 +206,8 @@ test_files:
221
206
  - spec/.DS_Store
222
207
  - spec/integration/cli/address/address_aws_spec.rb
223
208
  - spec/integration/cli/address/address_openstack_spec.rb
209
+ - spec/integration/cli/image/image_aws_spec.rb
210
+ - spec/integration/cli/image/image_openstack_spec.rb
224
211
  - spec/integration/cli/key_pair/key_pair_aws_spec.rb
225
212
  - spec/integration/cli/key_pair/key_pair_openstack_spec.rb
226
213
  - spec/integration/cli/provider/provider_aws_spec.rb
@@ -229,4 +216,5 @@ test_files:
229
216
  - spec/support/settings_helper.rb
230
217
  - spec/support/stdout_capture.rb
231
218
  - spec/unit/.gitkeep
219
+ - spec/unit/cli/image_spec.rb
232
220
  - spec/unit/cli/key_pair_spec.rb