ey-core 3.4.0 → 3.4.1

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.
Files changed (36) hide show
  1. data/Rakefile +4 -1
  2. data/ey-core.gemspec +3 -0
  3. data/features/accounts.feature +13 -0
  4. data/features/applications.feature +29 -0
  5. data/features/current_user.feature +14 -0
  6. data/features/environments.feature +30 -0
  7. data/features/init.feature +6 -0
  8. data/features/login.feature +6 -0
  9. data/features/scp.feature +6 -0
  10. data/features/step_definitions/accounts_steps.rb +23 -0
  11. data/features/step_definitions/applications_steps.rb +46 -0
  12. data/features/step_definitions/current_user_steps.rb +11 -0
  13. data/features/step_definitions/deprecated_command_steps.rb +3 -0
  14. data/features/step_definitions/environments_steps.rb +37 -0
  15. data/features/step_definitions/version_steps.rb +3 -0
  16. data/features/support/account_helpers.rb +89 -0
  17. data/features/support/app_helpers.rb +19 -0
  18. data/features/support/aruba.rb +1 -0
  19. data/features/support/boilerplate.rb +1 -0
  20. data/features/support/client_helpers.rb +36 -0
  21. data/features/support/config_file_helpers.rb +42 -0
  22. data/features/support/core.rb +19 -0
  23. data/features/support/deployment_helpers.rb +19 -0
  24. data/features/support/env.rb +40 -0
  25. data/features/support/environment_helpers.rb +23 -0
  26. data/features/support/fake_kernel.rb +23 -0
  27. data/features/support/io.rb +5 -0
  28. data/features/support/mock_api.rb +21 -0
  29. data/features/support/output_helpers.rb +7 -0
  30. data/features/support/resource_helpers.rb +189 -0
  31. data/features/support/server_helpers.rb +27 -0
  32. data/features/version.feature +8 -0
  33. data/features/whoami.feature +14 -0
  34. data/lib/ey-core/version.rb +1 -1
  35. metadata +215 -56
  36. checksums.yaml +0 -7
data/Rakefile CHANGED
@@ -1,5 +1,6 @@
1
1
  #!/usr/bin/env rake
2
2
  require "bundler/gem_tasks"
3
+ require 'cucumber/rake/task'
3
4
 
4
5
  namespace :spec do
5
6
  task :mocked do
@@ -12,4 +13,6 @@ end
12
13
 
13
14
  task :spec => ["spec:mocked", "spec:unmocked"]
14
15
 
15
- task default: "spec:mocked"
16
+ Cucumber::Rake::Task.new
17
+
18
+ task default: ["spec:mocked", :cucumber]
data/ey-core.gemspec CHANGED
@@ -45,4 +45,7 @@ Gem::Specification.new do |gem|
45
45
  gem.add_development_dependency "rspec", "~> 3.0"
46
46
  gem.add_development_dependency "ffaker"
47
47
  gem.add_development_dependency "rake"
48
+ gem.add_development_dependency "aruba", "~> 0.11"
49
+ gem.add_development_dependency "cucumber", "~> 2.1"
50
+ gem.add_development_dependency "factis", "~> 1.0"
48
51
  end
@@ -0,0 +1,13 @@
1
+ Feature: Accounts
2
+ In order to know what Engine Yard accounts I can access
3
+ As a User
4
+ I want to be able to list the accounts with which I'm associated
5
+
6
+ Background:
7
+ Given I'm an Engine Yard user
8
+ And ey-core is configured with my cloud token
9
+ And I'm associated with several accounts
10
+
11
+ Scenario: Listing my accounts
12
+ When I run `ey-core accounts`
13
+ Then I see the name and ID of each of my accounts
@@ -0,0 +1,29 @@
1
+ Feature: Applications
2
+ In order to determine what I can work with
3
+ As a User
4
+ I want to be able to list the applications that live in my accounts
5
+
6
+ Background:
7
+ Given I'm an Engine Yard user
8
+ And ey-core is configured with my cloud token
9
+ And I have the following accounts:
10
+ | Account Name |
11
+ | one |
12
+ | two |
13
+ | three |
14
+ And each of my accounts has several applications
15
+
16
+ Scenario: Listing all of my applications
17
+ When I run `ey-core applications`
18
+ Then I see the name and ID for all of my applications
19
+
20
+ Scenario Outline: Listing applications for a specific account
21
+ When I run `ey-core applications <Account Flag> one`
22
+ Then I see the applications in the one account
23
+ But I do not see applications from other accounts
24
+
25
+ Examples:
26
+ | Account Flag |
27
+ | -a |
28
+ | --account |
29
+
@@ -0,0 +1,14 @@
1
+ Feature: Current User
2
+ In order to ensure that I'm logged into the right account
3
+ As a User
4
+ I want to be able to see my user information
5
+
6
+ Background:
7
+ Given I'm an Engine Yard user
8
+ And ey-core is configured with my cloud token
9
+
10
+ Scenario: Getting the current user information
11
+ When I run `ey-core current_user`
12
+ Then I should see my user ID
13
+ And I should see my email address
14
+ And I should see my name
@@ -0,0 +1,30 @@
1
+ Feature: Environments
2
+ In order to know what Engine Yard environments I can access
3
+ As a User
4
+ I want to be able to list the environments with which I'm associated
5
+
6
+ Background:
7
+ Given I'm an Engine Yard user
8
+ And ey-core is configured with my cloud token
9
+ And I have the following accounts:
10
+ | Account Name |
11
+ | one |
12
+ | two |
13
+ | three |
14
+ And each of my accounts has several applications
15
+ And each of my applications has an environment
16
+
17
+ Scenario: Listing all of my environments
18
+ When I run `ey-core environments`
19
+ Then I see the name and ID for all of my environments
20
+
21
+ Scenario Outline: Listing environments for a specific account
22
+ When I run `ey-core environments <Account Flag> one`
23
+ Then I see the environments in the one account
24
+ But I do not see environments from other accounts
25
+
26
+ Examples:
27
+ | Account Flag |
28
+ | -a |
29
+ | --account |
30
+
@@ -0,0 +1,6 @@
1
+ Feature: Init
2
+ This command is deprecated
3
+
4
+ Scenario: Running init
5
+ When I run `ey-core init`
6
+ Then I am advised that this command has been deprecated
@@ -0,0 +1,6 @@
1
+ Feature: Login
2
+ In order to interact with Engine Yard Cloud
3
+ As a User
4
+ I want to be able to log into the Cloud API
5
+
6
+
@@ -0,0 +1,6 @@
1
+ Feature: Scp
2
+ This command is deprecated
3
+
4
+ Scenario: Running init
5
+ When I run `ey-core init`
6
+ Then I am advised that this command has been deprecated
@@ -0,0 +1,23 @@
1
+ Given %(I'm an Engine Yard user) do
2
+ memorize_fact(:me, create_user(client: client))
3
+ true
4
+ end
5
+
6
+ Given %(ey-core is configured with my cloud token) do
7
+ add_config_option(
8
+ 'https://api.engineyard.com/' => current_user_hash['token']
9
+ )
10
+ end
11
+
12
+ Given %(I'm associated with several accounts) do
13
+ account1 = create_account(client: client, owner: current_user)
14
+ account2 = create_account(client: client, owner: current_user)
15
+ memorize_fact(:accounts, [account1, account2])
16
+ end
17
+
18
+ Then %(I see the name and ID of each of my accounts) do
19
+ recall_fact(:accounts).each do |account|
20
+ expect(output_text).to include(account.id)
21
+ expect(output_text).to include(account.name)
22
+ end
23
+ end
@@ -0,0 +1,46 @@
1
+ Given %r(^I have the following accounts:$) do |account_names|
2
+ account_names.hashes.each do |account_hash|
3
+ known_accounts.push(
4
+ create_account(
5
+ client: client,
6
+ owner: current_user,
7
+ account: {
8
+ name: account_hash['Account Name']
9
+ }
10
+ )
11
+ )
12
+ end
13
+ end
14
+
15
+ Given %(each of my accounts has several applications) do
16
+ known_accounts.each do |account|
17
+ known_apps.push(
18
+ create_application(account: account, name: "#{account.name}_1")
19
+ )
20
+
21
+ known_apps.push(
22
+ create_application(account: account, name: "#{account.name}_2")
23
+ )
24
+ end
25
+ end
26
+
27
+ Then %(I see the name and ID for all of my applications) do
28
+ known_apps.each do |app|
29
+ expect(output_text).to match(/#{Regexp.escape(app.id.to_s)}\s+\|\s+#{Regexp.escape(app.name)}/)
30
+ end
31
+ end
32
+
33
+ Then %(I see the applications in the one account) do
34
+ account_named('one').applications.all.each do |app|
35
+ expect(output_text).to match(/#{Regexp.escape(app.id.to_s)}\s+\|\s+#{Regexp.escape(app.name)}/)
36
+ end
37
+ end
38
+
39
+ Then %(I do not see applications from other accounts) do
40
+ two = account_named('two').applications.all.to_a
41
+ three = account_named('three').applications.all.to_a
42
+
43
+ (two + three).each do |app|
44
+ expect(output_text).not_to match(/#{Regexp.escape(app.id.to_s)}\s+\|\s+#{Regexp.escape(app.name)}/)
45
+ end
46
+ end
@@ -0,0 +1,11 @@
1
+ Then %(I should see my user ID) do
2
+ expect(output_text).to match(/#{Regexp.escape(current_user.id)}/)
3
+ end
4
+
5
+ Then %(I should see my email address) do
6
+ expect(output_text).to match(/#{Regexp.escape(current_user.email)}/)
7
+ end
8
+
9
+ Then %(I should see my name) do
10
+ expect(output_text).to match(/#{Regexp.escape(current_user.name)}/)
11
+ end
@@ -0,0 +1,3 @@
1
+ Then %(I am advised that this command has been deprecated) do
2
+ expect(output_text).to match(/.*This command is deprecated.*/)
3
+ end
@@ -0,0 +1,37 @@
1
+ Given %(each of my applications has an environment) do
2
+ known_accounts.each do |account|
3
+ account.applications.each do |app|
4
+ known_environments.push(
5
+ create_environment(
6
+ account: account,
7
+ application: app,
8
+ environment: {
9
+ name: "#{app.name}_env"
10
+ }
11
+ )
12
+ )
13
+ end
14
+ end
15
+ end
16
+
17
+ Then %(I see the name and ID for all of my environments) do
18
+ known_environments.each do |environment|
19
+ expect(output_text).to match(/#{Regexp.escape(environment.id.to_s)}\s+\|\s+#{Regexp.escape(environment.name)}/)
20
+ end
21
+ end
22
+
23
+ Then %(I see the environments in the one account) do
24
+ account_named('one').environments.all.each do |environment|
25
+ expect(output_text).to match(/#{Regexp.escape(environment.id.to_s)}\s+\|\s+#{Regexp.escape(environment.name)}/)
26
+ end
27
+ end
28
+
29
+ Then %(I do not see environments from other accounts) do
30
+ two = account_named('two').environments.all.to_a
31
+ three = account_named('three').environments.all.to_a
32
+
33
+ (two + three).each do |environment|
34
+ expect(output_text).not_to match(/#{Regexp.escape(environment.id.to_s)}\s+\|\s+#{Regexp.escape(environment.name)}/)
35
+ end
36
+
37
+ end
@@ -0,0 +1,3 @@
1
+ Then %(I see the current ey-core version) do
2
+ expect(output_text).to include(Ey::Core::VERSION)
3
+ end
@@ -0,0 +1,89 @@
1
+ module AccountHelpers
2
+ def account_named(name)
3
+ client.accounts.first(name: name)
4
+ end
5
+
6
+ def known_accounts
7
+ begin
8
+ recall_fact(:known_accounts)
9
+ rescue
10
+ memorize_fact(:known_accounts, [])
11
+ end
12
+ end
13
+
14
+ def first_account
15
+ known_accounts.first.reload
16
+ end
17
+
18
+ def last_account
19
+ known_accounts.last.reload
20
+ end
21
+
22
+ def create_account(options={})
23
+ creator = options[:creator] || create_client
24
+ client = options[:client]
25
+
26
+ attributes = options[:account] || {}
27
+ attributes[:type] ||= "beta" # get around awsm billing requirements for tests
28
+ attributes[:name] ||= SecureRandom.hex(6)
29
+
30
+ if client
31
+ attributes[:owner] ||= begin
32
+ client.users.current
33
+ rescue Ey::Core::Response::NotFound
34
+ end
35
+ end
36
+ attributes[:owner] ||= create_user(client: client)
37
+
38
+ created_account = (client || creator).accounts.create!(attributes)
39
+
40
+ if client
41
+ client.accounts.get!(created_account.identity)
42
+ else
43
+ created_account
44
+ end
45
+ end
46
+
47
+ def create_user(options={})
48
+ creator = options[:creator] || create_client
49
+ client = options[:client]
50
+
51
+ attributes = options[:user] || {}
52
+ attributes[:name] ||= Faker::Name.name
53
+ attributes[:email] ||= Faker::Internet.email
54
+
55
+ created_user = creator.users.create!(attributes)
56
+
57
+ if client
58
+ client.users.get!(created_user.identity)
59
+ else
60
+ created_user
61
+ end
62
+ end
63
+
64
+ def create_provider(options={})
65
+ account = options[:account] || create_account(options)
66
+
67
+ attributes = options[:provider] || {}
68
+ attributes[:type] ||= :aws
69
+ attributes[:provisioned_id] ||= SecureRandom.hex(8)
70
+ attributes[:credentials] ||= case attributes[:type]
71
+ when :aws then
72
+ {
73
+ :instance_aws_secret_id => SecureRandom.hex(6),
74
+ :instance_aws_secret_key => SecureRandom.hex(6),
75
+ :aws_secret_id => SecureRandom.hex(6),
76
+ :aws_secret_key => SecureRandom.hex(6),
77
+ :aws_login => Faker::Internet.email,
78
+ :aws_pass => SecureRandom.hex(6),
79
+ }
80
+ when :azure then
81
+ {
82
+ }
83
+ end
84
+
85
+ account.providers.create!(attributes).resource!
86
+ end
87
+ end
88
+
89
+ World(AccountHelpers)
@@ -0,0 +1,19 @@
1
+ module AppHelpers
2
+ def known_apps
3
+ begin
4
+ recall_fact(:known_apps)
5
+ rescue
6
+ memorize_fact(:known_apps, [])
7
+ end
8
+ end
9
+
10
+ def first_app
11
+ known_apps.first.reload
12
+ end
13
+
14
+ def last_app
15
+ known_apps.last.reload
16
+ end
17
+ end
18
+
19
+ World(AppHelpers)
@@ -0,0 +1 @@
1
+ require 'aruba/cucumber'
@@ -0,0 +1 @@
1
+ require 'faker'
@@ -0,0 +1,36 @@
1
+ module ClientHelpers
2
+ def create_client(attributes={})
3
+ token = if (user = attributes.delete(:user)) && Ey::Core::Client.mocking?
4
+ core = Ey::Core::Client::Mock.data.values.find { |c| c[:users][user.identity] }
5
+ core[:users][user.identity]["token"]
6
+ end
7
+ token ||= begin
8
+ token_dotfile = YAML.load_file(File.expand_path("/../../../.token"), __FILE__) rescue {}
9
+ ENV["CORE_TOKEN"] || token_dotfile[ENV["CORE_URL"]] || "a4bf6558da8c1051536d1596b8931ebd346aff0b"
10
+ end
11
+
12
+ merged_attributes = attributes.merge(token: token, cache: true)
13
+ merged_attributes.merge!(logger: Logger.new(STDOUT)) if ENV['VERBOSE']
14
+
15
+ Ey::Core::Client.new(merged_attributes)
16
+ end
17
+
18
+ def create_server_client(server, attributes={})
19
+ unless core = Ey::Core::Client::Mock.data.values.find { |data| data[:servers][server.identity] }
20
+ raise "Failed to find server in mock data: #{server}"
21
+ end
22
+
23
+ token = core[:servers][server.identity]["token"]
24
+
25
+ merged_attributes = attributes.merge(token: token, cache: true)
26
+ merged_attributes.merge!(logger: Logger.new(STDOUT)) if ENV['VERBOSE']
27
+
28
+ Ey::Core::Client.new(merged_attributes)
29
+ end
30
+
31
+ def create_unauthenticated_client
32
+ Ey::Core::Client.new(token: nil)
33
+ end
34
+ end
35
+
36
+ World(ClientHelpers)
@@ -0,0 +1,42 @@
1
+ require 'yaml'
2
+
3
+ module ConfigFileHelpers
4
+ def config_file_location
5
+ File.expand_path(File.join(aruba.current_directory, '.ey-core'))
6
+ end
7
+
8
+ def write_config_file(hash = {})
9
+ c = File.open(config_file_location, 'w')
10
+ c.write(hash.to_yaml)
11
+ c.close
12
+ end
13
+
14
+ def read_config_file
15
+ begin
16
+ YAML.load_file(File.read(config_file_location))
17
+ rescue
18
+ {}
19
+ end
20
+ end
21
+
22
+ def nuke_config_file
23
+ FileUtils.rm_f(config_file_location) if File.exist?(config_file_location)
24
+ end
25
+
26
+ def add_config_option(hash = {})
27
+ current = read_config_file
28
+ write_config_file(current.merge(hash))
29
+ end
30
+
31
+ def remove_config_option(key)
32
+ current = read_config_file
33
+ current.delete(key)
34
+ write_config_file(current)
35
+ end
36
+ end
37
+
38
+ World(ConfigFileHelpers)
39
+
40
+ After do
41
+ nuke_config_file
42
+ end