jack-eb 1.0.1 → 1.1.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 76b0040e5d118b1213b149fe176b254c3205402b
4
- data.tar.gz: 1c2e8104fd6e56b05e5de6d940ae8a37308e7a55
3
+ metadata.gz: a12aefa1e04666526e9afa664b848c27ab22c4a7
4
+ data.tar.gz: e0d8f2f0dd5b415bcd7381ed38de4ada5c31c714
5
5
  SHA512:
6
- metadata.gz: 2d7c4d5fc2d1db074b7e77a8c2ad0d1e7f3578f3b522fb0be7feb51a36be0c8efdf1482032febfb7fd92b257c1f03cd33258e428f5fc7996797309393c2afb88
7
- data.tar.gz: 18d00db24f042dd4d1d8ad18616b540c2e097656e16c490a572d1f7a7ce2c2f73f840fec094061ad2d8d6ec581b203e9ad772da1336cbc81afdb22619e4db3c7
6
+ metadata.gz: 8964f711975df4c4bac1b028592639a6bbf16998246c1fbbabf38ebb4bd7ef3bda9779591c08c48c999a1c43a2f03a5024b826cfe18289181372be1b1975a235
7
+ data.tar.gz: 3d6c0322d650e684d0bad994addc80dbab14a5c2bedbaddf6d5bb4b69b6d7500bda53543fba86161949bed836bfab18fb01f2ad9c9d624a81ca79c2c605383b1
data/CHANGELOG.md CHANGED
@@ -3,6 +3,11 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  This project *tries* to adhere to [Semantic Versioning](http://semver.org/), even before v1.0.
5
5
 
6
+ ## [1.1.0]
7
+ - add jack terminate
8
+ - refactoring: https://github.com/tongueroo/jack/pull/6
9
+ - autodetect eb_bin and aws_bin
10
+
6
11
  ## [1.0.1]
7
12
  - improve jack eb install error message
8
13
 
data/README.md CHANGED
@@ -161,7 +161,7 @@ $ jack config upload hi-web-prod-1 --app customappname
161
161
 
162
162
  This will save the config to `jack/cfg/hi-web-prod-1.cfg.yml`.
163
163
 
164
- You will notice that the `eb config upload` command prompts you with the diff and asks for confirmation before uploading. You can bypass the prompt with the force option.
164
+ You will notice that the `eb config upload` command prompts you with the diff and asks for confirmation before uploading. You can bypass the prompt with the `--sure` option.
165
165
 
166
166
  #### Diff Config - Comparing your local config to the live environment config
167
167
 
data/circle.yml ADDED
@@ -0,0 +1,3 @@
1
+ machine:
2
+ ruby:
3
+ version: 2.4.1
data/lib/jack.rb CHANGED
@@ -6,8 +6,10 @@ require File.expand_path("../jack/ext/hash", __FILE__)
6
6
 
7
7
  module Jack
8
8
  autoload :Command, 'jack/command'
9
+ autoload :Help, 'jack/help'
9
10
  autoload :CLI, 'jack/cli'
10
11
  autoload :Create, 'jack/create'
12
+ autoload :Terminate, 'jack/terminate'
11
13
  autoload :Settings, 'jack/settings'
12
14
  autoload :EbConfig, 'jack/eb_config'
13
15
  autoload :Config, 'jack/config'
data/lib/jack/cli.rb CHANGED
@@ -1,36 +1,35 @@
1
1
  require 'thor'
2
2
  require 'jack/command'
3
- require 'jack/cli/help'
4
3
  require 'jack/version_checker'
5
4
  Jack::VersionChecker.new.run unless ENV['TEST']
6
5
 
7
6
  module Jack
8
7
  class Config < Command
9
8
  desc "upload ENV_NAME", "upload and apply jack config changes to EB environment"
10
- long_desc Jack::CLI::Help.upload
11
- option :force, aliases: :f, type: :boolean, desc: "skip prompt"
9
+ long_desc Help.upload
10
+ option :sure, aliases: :f, type: :boolean, desc: "skip prompt"
12
11
  def upload(env_name)
13
- Jack::Config::Upload.new(options.merge(env_name: env_name)).run
12
+ Upload.new(options.merge(env_name: env_name)).run
14
13
  end
15
14
 
16
15
  desc "download ENV_NAME", "downloads environment config to jack/cfg folder"
17
- long_desc Jack::CLI::Help.download
16
+ long_desc Help.download
18
17
  option :dirty, type: :boolean, desc: "leave the remote eb config and download config behind"
19
18
  def download(env_name)
20
- Jack::Config::Download.new(options.merge(env_name: env_name)).run
19
+ Download.new(options.merge(env_name: env_name)).run
21
20
  end
22
21
 
23
22
  desc "diff ENV_NAME", "diff jack config vs environment config"
24
- long_desc Jack::CLI::Help.diff
23
+ long_desc Help.diff
25
24
  option :dirty, type: :boolean, desc: "leave the remote eb config and download config behind"
26
25
  def diff(env_name)
27
- Jack::Config::Diff.new(options.merge(env_name: env_name)).run
26
+ Diff.new(options.merge(env_name: env_name)).run
28
27
  end
29
28
 
30
29
  desc "sort ENV_NAME", "reformat local jack config file to a sorted yaml file format"
31
- long_desc Jack::CLI::Help.sort
30
+ long_desc Help.sort
32
31
  def sort(env_name)
33
- Jack::Config::Sort.new(options.merge(env_name: env_name)).run
32
+ Sort.new(options.merge(env_name: env_name)).run
34
33
  end
35
34
  end
36
35
 
@@ -38,7 +37,7 @@ module Jack
38
37
  class_option :verbose, type: :boolean
39
38
  class_option :mute, type: :boolean, desc: "mute all output, useful for specs"
40
39
  class_option :noop, type: :boolean, desc: "dont run any destructive commands"
41
- class_option :force, type: :boolean, desc: "bypass confirmation prompt"
40
+ class_option :sure, type: :boolean, desc: "bypass confirmation prompt"
42
41
  class_option :root, :default => '.', desc: "root of the project, useful for specs"
43
42
  class_option :cfg, aliases: :c, desc: "local config name if want to override the convention"
44
43
  class_option :app, aliases: :a, desc: "app name if want to override the convention"
@@ -46,12 +45,18 @@ module Jack
46
45
  desc "create ENV_NAME", "create EB environment"
47
46
  long_desc Help.create
48
47
  def create(env_name)
49
- Jack::Create.new(options.merge(env_name: env_name)).run
48
+ Create.new(options.merge(env_name: env_name)).run
49
+ end
50
+
51
+ desc "terminate ENV_NAME", "deletes EB environment"
52
+ long_desc Help.terminate
53
+ def terminate(env_name)
54
+ Terminate.new(options.merge(env_name: env_name)).run
50
55
  end
51
56
 
52
57
  desc "version", "display jack version number"
53
58
  def version
54
- puts Jack::VERSION
59
+ puts VERSION
55
60
  end
56
61
 
57
62
  desc "config ACTION ENV_NAME", "manage environment config"
data/lib/jack/config.rb CHANGED
@@ -3,6 +3,7 @@ require 'thor'
3
3
 
4
4
  module Jack
5
5
  class Config < Command
6
+ autoload :Help, 'jack/config/help'
6
7
  autoload :Base, 'jack/config/base'
7
8
  autoload :Diff, 'jack/config/diff'
8
9
  autoload :Download, 'jack/config/download'
@@ -11,19 +11,24 @@ module Jack
11
11
 
12
12
  def run
13
13
  @download.get_current_cfg
14
- do_diff(@download.current_path, @download.local_config_path)
14
+ difference = compute_diff(@download.current_path, @download.local_config_path)
15
15
  cleanup_files
16
+ difference
16
17
  end
17
18
 
18
- def do_diff(current, local)
19
- UI.say "Comparing #{current} and #{local}"
19
+ def compute_diff(current, local)
20
+ # the diff command returns 0 when there is no difference and returns 1 when there is a difference
21
+ pretty_current_path = @download.current_path.sub(/.*\.elasticbeanstalk/,'.elasticbeanstalk')
22
+ command = "#{diff_command} #{pretty_current_path} #{@download.local_config_path}"
23
+ UI.say("=> #{command}")
24
+
20
25
  return if @options[:noop]
21
26
  sorter = YamlFormatter.new
22
27
  sorter.process(current)
23
28
  sorter.process(local)
24
- # need to use system so that the diff shows up properly in the terminal
25
- system(diff_command, @download.current_path, @download.local_config_path)
26
- puts ""
29
+
30
+ no_difference = system(command)
31
+ !no_difference
27
32
  end
28
33
 
29
34
  def cleanup_files
@@ -34,7 +34,7 @@ module Jack
34
34
  ignores = IO.read(path)
35
35
  has_ignore = ignores.include?("jack/cfg")
36
36
  end
37
- do_cmd("echo 'jack/cfg/*.yml' >> #{path}") unless has_ignore
37
+ sh("echo 'jack/cfg/*.yml' >> #{path}") unless has_ignore
38
38
  end
39
39
 
40
40
  def get_current_cfg
@@ -44,7 +44,7 @@ module Jack
44
44
 
45
45
  # for specs
46
46
  def eb_config_save
47
- do_cmd("eb config save --cfg #{current_name} #{@env_name}", @options)
47
+ sh("#{eb_bin} config save#{eb_base_flags} --cfg #{current_name} #{@env_name}", @options)
48
48
  end
49
49
 
50
50
  def copy_to_local_cfg
@@ -0,0 +1,70 @@
1
+ class Jack::Config::Help
2
+ class << self
3
+ def upload
4
+ <<-EOL
5
+ Uploads the specified template configuration in jack/cfg and applies it to the environment immediately.
6
+
7
+ #{convention}
8
+
9
+ Example:
10
+
11
+ $ jack config upload hi-web-stag-1
12
+
13
+ $ jack config upload myapp -c myconfig hi-web-stag-1
14
+ EOL
15
+ end
16
+
17
+ def download
18
+ <<-EOL
19
+ Downloads the environment's config to jack/cfg/[CONFIG_NAME].cfg.yml
20
+
21
+ #{convention}
22
+
23
+ Example:
24
+
25
+ $ jack config download hi-web-stag-1
26
+
27
+ $ jack config download myapp -c myconfig hi-web-stag-1
28
+ EOL
29
+ end
30
+
31
+
32
+ def diff
33
+ <<-EOL
34
+ Diff local jack config vs environment config. The environment config is generated on the fly.
35
+
36
+ If you have colordiff installed the diff command will use make use of it. If you want to have your own custom diff, you can set your JACK_DIFF environment variable to it.
37
+
38
+ #{convention}
39
+
40
+ Example:
41
+
42
+ $ jack config diff hi-web-stag-1
43
+
44
+ $ jack config diff myapp -c myconfig hi-web-stag-1
45
+ EOL
46
+ end
47
+
48
+ def sort
49
+ <<-EOL
50
+ Reformats local jack config file to a sorted yaml format.
51
+
52
+ #{convention}
53
+
54
+ Example:
55
+
56
+ $ jack config sort hi-web-stag-1
57
+
58
+ $ jack config sort -c myconfig hi-web-stag-1 # env name doesnt matter here
59
+ EOL
60
+ end
61
+
62
+ private
63
+ # duplicated in jack/help.rb
64
+ def convention
65
+ <<-EOL
66
+ The configuration name is based on convention. An environment with the name of hi-web-stag-1 results in the jack/cfg/hi-web-stag.cfg.yml being used. The convention can be overriden with the --cfg option.
67
+ EOL
68
+ end
69
+ end
70
+ end
@@ -18,13 +18,31 @@ module Jack
18
18
  UI.say "#{local_config_path} does not exist, nothing to upload"
19
19
  exit 0
20
20
  end
21
- compare
22
- if confirm
23
- upload
24
- update_env
21
+ difference = compare
22
+ if difference
23
+ if confirm(confirmation_message)
24
+ upload
25
+ update_env
26
+ else
27
+ UI.say("Whew, that was close. EB Configuration was not updated.")
28
+ end
29
+ else
30
+ UI.say("There was no difference detected from your #{@local_config_path} and what exists on the EB environment")
25
31
  end
26
32
  end
27
33
 
34
+ def confirmation_message
35
+ message = "Are you sure you want to update the environment with your the new config #{@local_config_path}?\n".colorize(:yellow)
36
+ message += <<-EOL
37
+ If the difference is not what you expected, you should say no.
38
+ If you want to download the config from the environment and get #{@local_config_path}
39
+ back in sync, you can use this command:
40
+ $ jack config download #{@env_name}
41
+ $ jack config download -h # for more info
42
+ EOL
43
+ message
44
+ end
45
+
28
46
  def compare
29
47
  Diff.new(@options).run
30
48
  end
@@ -37,26 +55,6 @@ module Jack
37
55
  clean_up
38
56
  end
39
57
 
40
- def confirm
41
- UI.say("Are you sure you want to update the environment with your the new config #{@config_path}?".colorize(:yellow))
42
- UI.say(<<-EOL)
43
- If the difference is not what you expected, you should say no.
44
- A blank newline indicates that there was no difference.
45
- If you want to download the config from the environment and
46
- overwrite your #{@local_config_path} instead, you can use this command:
47
- $ jack config download #{@env_name}
48
- $ jack config help download # for more info
49
- EOL
50
- print "yes/no? [no] " unless @options[:mute] || @options[:force]
51
- answer = get_answer
52
- answer =~ /^y/
53
- end
54
-
55
- def get_answer
56
- return 'y' if @options[:force]
57
- $stdin.gets
58
- end
59
-
60
58
  def update_env
61
59
  UI.say("Updating environment #{@env_name} with template #{upload_name}")
62
60
  eb.update_environment(
@@ -80,7 +78,7 @@ EOL
80
78
 
81
79
  # for specs
82
80
  def eb_config_put
83
- do_cmd("eb config put #{upload_name}", @options)
81
+ sh("#{eb_bin} config put#{eb_base_flags} #{upload_name}", @options)
84
82
  end
85
83
 
86
84
  def clean_up
data/lib/jack/create.rb CHANGED
@@ -12,6 +12,7 @@ module Jack
12
12
  end
13
13
 
14
14
  def run
15
+ check_aws_setup
15
16
  create_app
16
17
  EbConfig::Create.new(@options).sync unless @options[:noop]
17
18
  create_env
@@ -31,19 +32,19 @@ module Jack
31
32
 
32
33
  def create_env
33
34
  command = build_command
34
- do_cmd(command, @options)
35
+ sh(command, @options)
35
36
  end
36
37
 
37
38
  def build_command
38
39
  @cfg = upload_cfg
39
40
  flags = settings.create_flags
40
- "eb create --sample --nohang #{flags} #{@cfg}#{cname}#{@env_name}"
41
+ "#{eb_bin} create#{eb_base_flags} --sample --nohang #{flags} #{@cfg}#{cname}#{@env_name}"
41
42
  end
42
43
 
43
44
  def upload_cfg
44
45
  @upload = Config::Upload.new(@options)
45
46
  if @upload.local_cfg_exist?
46
- @upload.upload
47
+ @upload.upload
47
48
  cfg = "--cfg #{@upload.upload_name} "
48
49
  end
49
50
  end
@@ -21,7 +21,7 @@ module Jack
21
21
 
22
22
  def ensure_eb_init
23
23
  unless File.exist?(eb_config_path)
24
- do_cmd(%Q|eb init -r us-east-1 -p "#{platform}" "#{app_name}"|, @options)
24
+ sh(%Q|#{eb_bin} init#{eb_base_flags} -p "#{platform}" "#{app_name}"|, @options)
25
25
  end
26
26
  end
27
27
 
@@ -13,11 +13,15 @@ module Jack
13
13
  def app_name
14
14
  env.application_name
15
15
  end
16
-
16
+
17
17
  def env
18
18
  return @env if @env
19
19
  envs = describe_environments
20
20
  @env = envs[:environments].first
21
+ unless @env
22
+ abort("ERROR: Environment #{@env_name} not found. Are you sure it exists?".colorize(:red))
23
+ end
24
+ @env
21
25
  end
22
26
 
23
27
  # useful for specs
@@ -26,4 +30,4 @@ module Jack
26
30
  end
27
31
  end
28
32
  end
29
- end
33
+ end
data/lib/jack/help.rb ADDED
@@ -0,0 +1,59 @@
1
+ module Jack
2
+ class Help
3
+ class << self
4
+ def create
5
+ <<-EOL
6
+ Creates a new environment using the configuration in jack/cfg folder. The AWS sample app is initially used for the newly created environment. The sample app is used as a starting point to make sure that the environment is working before you introduce your own app code.
7
+
8
+ #{convention}
9
+
10
+ Example:
11
+
12
+ $ jack create hi-web-stag-1
13
+
14
+ $ jack create -c myconfig hi-web-stag-1
15
+
16
+ $ jack create -a myapp -c myconfig hi-web-stag-1
17
+ EOL
18
+ end
19
+
20
+ def terminate
21
+ <<-EOL
22
+ Deletes Elastic Beanstalk environment.
23
+
24
+ Example:
25
+
26
+ $ jack terminate hi-web-stag-1
27
+ EOL
28
+ end
29
+
30
+ # Thor auto generates the subcommand help menu.
31
+ # Leaving here in case we figure out a way to override this Thor behavior.
32
+ def config
33
+ <<-EOL
34
+ Manage the environment's config. Can use this to download the environment's config to jack/cfg folder or upload config in jack/cfg folder and apply it to the environment.
35
+
36
+ Example:
37
+
38
+ $ jack config download hi-web-stag-1
39
+
40
+ For more info:
41
+
42
+ $ jack help config
43
+
44
+ $ jack config help upload
45
+
46
+ $ jack config help download
47
+ EOL
48
+ end
49
+
50
+ private
51
+ # duplicated in jack/config/help.rb
52
+ def convention
53
+ <<-EOL
54
+ The configuration name is based on convention. An environment with the name of hi-web-stag-1 results in the jack/cfg/hi-web-stag.cfg.yml being used. The convention can be overriden with the --cfg option.
55
+ EOL
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,23 @@
1
+ module Jack
2
+ class Terminate
3
+ include Util
4
+
5
+ def initialize(options={})
6
+ @options = options
7
+ @root = options[:root] || '.'
8
+ @env_name = options[:env_name]
9
+ @app_name = options[:app] || app_name_convention(@env_name)
10
+ end
11
+
12
+ def run
13
+ check_aws_setup
14
+ message = "Are you sure you want to delete the environment #{@env_name}?".colorize(:yellow)
15
+ if confirm(message) && !@options[:noop]
16
+ eb.terminate_environment(environment_name: @env_name)
17
+ UI.say("Environment #{@env_name} is terminating!")
18
+ else
19
+ UI.say("Whew that was close. Environment #{@env_name} was not deleted.")
20
+ end
21
+ end
22
+ end
23
+ end
data/lib/jack/util.rb CHANGED
@@ -1,32 +1,156 @@
1
- module Jack
2
- # Any class that includes this module should define @root as it is used in
3
- # the settings method.
4
- module Util
5
- def do_cmd(command, options={})
6
- UI.say "Running: #{command.colorize(:green)}"
7
- return command if options[:noop]
1
+ # Any class that includes this module should define @root as it is used in
2
+ # the settings method.
3
+ module Jack::Util
4
+ def confirm(message)
5
+ Jack::UI.say(message)
6
+ print "yes/no? [no] " unless @options[:mute] || @options[:sure]
7
+ answer = get_answer
8
+ answer =~ /^y/
9
+ end
10
+
11
+ def get_answer
12
+ return 'y' if @options[:sure]
13
+ $stdin.gets
14
+ end
15
+
16
+ def sh(command, options={})
17
+ Jack::UI.say "=> #{command.colorize(:green)}"
18
+ return command if options[:noop]
19
+
20
+ if options[:backtick]
8
21
  out = `#{command}`
9
- UI.say out
22
+ Jack::UI.say out
23
+ success = $?.success?
24
+ else
25
+ success = system(command)
10
26
  end
11
27
 
12
- def app_name_convention(env_name)
13
- pattern = settings.app_name_pattern
14
- env_name.match(pattern)[1]
15
- end
28
+ abort "Exiting! Error running command: #{command}".colorize(:red) unless success
29
+ end
16
30
 
17
- def settings
18
- # do not like the instance @root variable in this module but better
19
- # than having to pass settings around
20
- @settings ||= Settings.new(@root)
21
- end
31
+ def app_name_convention(env_name)
32
+ pattern = settings.app_name_pattern
33
+ env_name.match(pattern)[1]
34
+ end
22
35
 
23
- def eb
24
- region = ENV['AWS_REGION'] || 'us-east-1'
25
- @@eb ||= Aws::ElasticBeanstalk::Client.new(region: region)
26
- end
36
+ def settings
37
+ # do not like the instance @root variable in this module but better
38
+ # than having to pass settings around
39
+ @settings ||= Jack::Settings.new(@root)
40
+ end
41
+
42
+ def eb
43
+ @@eb ||= Aws::ElasticBeanstalk::Client.new
44
+ end
45
+
46
+ def ensure_folder_exist(folder)
47
+ FileUtils.mkdir_p(folder) unless File.exist?(folder)
48
+ end
49
+
50
+ # Checks main if the ~/.aws/config has been set up properly. If it has not
51
+ # print a message to the user and exit the program.
52
+ def check_aws_setup
53
+ # abusing `aws configure get region` to check that aws is probably properly configured
54
+ get_region # method will exits when unable to query for the region
55
+ end
56
+
57
+ # get the region from ~/.aws/config settings
58
+ # The eb tool reqiures you to specify the region when you run `eb init`. After that
59
+ # the setting is saved in the ~/.elasticbeanstalk folder. We will default to what
60
+ # is set in ~/.aws/config.
61
+ def get_region
62
+ return 'us-west-2' if ENV['TEST']
27
63
 
28
- def ensure_folder_exist(folder)
29
- FileUtils.mkdir_p(folder) unless File.exist?(folder)
64
+ command = "#{aws_bin} configure get region"
65
+ region = `#{command}`.strip
66
+ success = $?.success?
67
+ unless success
68
+ abort <<~EOS.colorize(:red)
69
+ ERROR: Unable to infer the region from your ~/.aws/config settings with command: `#{command}`.
70
+ Maybe it is not properly configured? Please double check ~/.aws/config.
71
+ If you haven't set your region yet, ou can set your region with `aws configure set region REGION`. Example:
72
+ aws configure set region us-west-2
73
+ EOS
30
74
  end
75
+
76
+ # Defaults to us-east-1:
77
+ # right now aws configure get region will actually return an error 1 code so we
78
+ # will never default to us-east-1 here but doing this just in case the return code
79
+ # changes to 0.
80
+ region == '' ? 'us-east-1' : region
81
+ end
82
+
83
+ @@aws_bin = nil
84
+ # Auto detects the aws binary for use, will use an aws binary based on the following precedence:
85
+ #
86
+ # 1. JACK_AWS_BIN environmental variable
87
+ # 2. aws detected using the load path.
88
+ # For example: /usr/bin/local/aws if /usr/bin/local/ is earlest in the load path.
89
+ # 3. /opt/bolts/embedded/bin/aws - This comes packaged with the the bolts toolbelt.
90
+ # https://boltops.com/toolbelt
91
+ #
92
+ # If an aws installation is not deetcted it'll display a message and exit the program.
93
+ def aws_bin
94
+ return @@aws_bin if @@aws_bin
95
+
96
+ return @@aws_bin = "aws" if ENV['TEST']
97
+
98
+ return @@aws_bin = ENV["JACK_AWS_BIN"] if ENV["JACK_AWS_BIN"]
99
+
100
+ which_aws = `which aws`.strip
101
+ return @@aws_bin = which_aws if which_aws
102
+
103
+ embedded_aws = "/opt/bolts/embedded/bin/aws"
104
+ return @@aws_bin = embedded_aws if File.exist?(embedded_aws)
105
+
106
+ # if reach here we did not detect the eb binary
107
+ message = "ERROR: Unable to auto detect an aws executable. Please make sure you have installed the aws cli tool.\n"
108
+ message << if RUBY_PLATFORM =~ /darwin/
109
+ "You can install the aws tool via homebrew:\n\nbrew install awscli"
110
+ else
111
+ "Installation instructions: http://docs.aws.amazon.com/cli/latest/userguide/installing.html"
112
+ end
113
+ abort(message)
114
+ end
115
+
116
+ @@eb_bin = nil
117
+ # Auto detects the eb binary for use, will use an eb binary based on the following precedence:
118
+ #
119
+ # 1. JACK_EB_BIN environmental variable
120
+ # 2. eb detected using the load path.
121
+ # For example: /usr/bin/local/eb if /usr/bin/local/ is earlest in the load path.
122
+ # 3. /opt/bolts/embedded/bin/eb - This comes packaged with the the bolts toolbelt.
123
+ # https://boltops.com/toolbelt
124
+ #
125
+ # If an eb installation is not deetcted it'll display a message and exit the program.
126
+ def eb_bin
127
+ return @@eb_bin if @@eb_bin
128
+
129
+ return @@eb_bin = "eb" if ENV['TEST']
130
+
131
+ return @@eb_bin = ENV["JACK_EB_BIN"] if ENV["JACK_EB_BIN"]
132
+
133
+ which_eb = `which eb`.strip
134
+ return @@eb_bin = which_eb if which_eb
135
+
136
+ embedded_eb = "/opt/bolts/embedded/bin/eb"
137
+ return @@eb_bin = embedded_eb if File.exist?(embedded_aws)
138
+
139
+ # if reach here we did not detect the eb binary
140
+ message = "ERROR: Unable to auto detect an eb executable. Please make sure you have installed the eb cli tool.\n"
141
+ instructions = VersionChecker.new.install_instructions
142
+ message << instructions
143
+ abort(message)
144
+ end
145
+
146
+ def eb_base_flags
147
+ return @eb_base_flags if @eb_base_flags
148
+ region = get_region
149
+ profile = ENV['AWS_PROFILE']
150
+ flags = {
151
+ profile: region ? " --profile #{profile}" : "",
152
+ region: region ? " -r #{region}" : ""
153
+ }
154
+ @eb_base_flags = "#{flags[:profile]}#{flags[:region]}"
31
155
  end
32
156
  end
data/lib/jack/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Jack
2
- VERSION = "1.0.1"
2
+ VERSION = "1.1.0"
3
3
  end
@@ -1,23 +1,25 @@
1
1
  module Jack
2
2
  class VersionChecker
3
3
  REQUIRED_VERSION = "3.1.2"
4
+ include Util
4
5
 
5
6
  def run
6
- leave(not_installed) unless system("type eb > /dev/null 2>&1")
7
+ leave(not_installed) unless system("type #{eb_bin} > /dev/null 2>&1")
7
8
  leave(version_too_low) unless check
8
- # "SORRY: #{message}, please install at least version #{REQUIRED_VERSION}")
9
9
  end
10
10
 
11
11
  def check
12
- major, minor, patch = normalize_version(parsed_version)
13
- r_major, r_minor, r_patch = normalize_version(REQUIRED_VERSION)
12
+ major, minor, patch = version_parts(parsed_version)
13
+ r_major, r_minor, r_patch = version_parts(REQUIRED_VERSION)
14
14
  (major > r_major) ||
15
15
  (major == r_major && minor > r_minor) ||
16
16
  (major == r_major && minor == r_minor && patch >= r_patch)
17
17
  end
18
18
 
19
19
  def get_version
20
- `eb --version`
20
+ command = "#{eb_bin} --version"
21
+ puts "command: #{command}"
22
+ `#{eb_bin} --version`
21
23
  end
22
24
 
23
25
  def parsed_version
@@ -29,7 +31,7 @@ module Jack
29
31
  end
30
32
 
31
33
 
32
- def normalize_version(parsed)
34
+ def version_parts(parsed)
33
35
  parsed.split('.').collect(&:to_i)
34
36
  end
35
37
 
data/spec/lib/cli_spec.rb CHANGED
@@ -2,7 +2,7 @@ require 'spec_helper'
2
2
 
3
3
  describe Jack::CLI do
4
4
  before(:all) do
5
- @args = "hi-web-stag-1 --root spec/fixtures/project --noop --force"
5
+ @args = "hi-web-stag-1 --root spec/fixtures/project --noop --sure"
6
6
  FileUtils.rm_rf("spec/fixtures/project/.elasticbeanstalk")
7
7
  end
8
8
 
@@ -19,7 +19,7 @@ describe Jack::CLI do
19
19
  it "should upload and apply config to environment" do
20
20
  out = execute("bin/jack config upload #{@args}")
21
21
  # puts out
22
- expect(out).to include('eb config put')
22
+ expect(out).to include('eb config save')
23
23
  end
24
24
 
25
25
  it "should download config from environment" do
@@ -31,7 +31,7 @@ describe Jack::CLI do
31
31
  it "should diff local config from eb environment config" do
32
32
  out = execute("bin/jack config diff #{@args}")
33
33
  # puts out
34
- expect(out).to include("Comparing")
34
+ expect(out).to include("diff")
35
35
  end
36
36
 
37
37
  it "should reformat the local config to a sorted yaml format" do
@@ -39,5 +39,11 @@ describe Jack::CLI do
39
39
  # puts out
40
40
  expect(out).to include("Reformatted the local config")
41
41
  end
42
+
43
+ it "should terminate enviornment" do
44
+ out = execute("bin/jack terminate #{@args}")
45
+ # puts out
46
+ expect(out).to include("Whew that was close")
47
+ end
42
48
  end
43
49
  end
@@ -8,8 +8,8 @@ describe Jack::Config do
8
8
  let(:diff) { Jack::Config::Diff.new(test_options) }
9
9
 
10
10
  describe "diff" do
11
- it "diff do_diff" do
12
- expect(diff).to receive(:do_diff)
11
+ it "diff compute_diff" do
12
+ expect(diff).to receive(:compute_diff)
13
13
  diff.run
14
14
  end
15
15
 
@@ -18,4 +18,4 @@ describe Jack::Config do
18
18
  expect(command).to match /diff/
19
19
  end
20
20
  end
21
- end
21
+ end
@@ -17,6 +17,8 @@ describe Jack::Config::Upload do
17
17
  end
18
18
 
19
19
  it "upload flow" do
20
+ allow(upload).to receive(:compare).and_return(true)
21
+
20
22
  expect(upload).to receive(:compare)
21
23
  expect(upload).to receive(:upload)
22
24
  expect(upload).to receive(:update_env)
@@ -26,7 +26,7 @@ describe Jack::VersionChecker do
26
26
 
27
27
  it "parse version" do
28
28
  version = checker.parse_version("EB CLI 3.2.0 (Python 2.7.6)")
29
- expect(version).to eq [3,2,0]
29
+ expect(version).to eq "3.2.0"
30
30
  end
31
31
  end
32
- end
32
+ end
data/spec/spec_helper.rb CHANGED
@@ -1,4 +1,6 @@
1
1
  ENV['TEST'] = '1'
2
+ # Ensures aws api never called. Fixture home folder does not contain ~/.aws/credentails
3
+ ENV['HOME'] = "spec/fixtures/home"
2
4
 
3
5
  require "pp"
4
6
  require 'ostruct'
@@ -10,6 +12,7 @@ require "#{root}/lib/jack"
10
12
  require "#{root}/spec/support/fake_project"
11
13
 
12
14
  module Helpers
15
+ # TEST=1 DEBUG=1 bin/jack config diff hi-web-stag-1 --root spec/fixtures/project --noop --sure
13
16
  def execute(cmd)
14
17
  puts "Running: #{cmd}" if ENV['DEBUG']
15
18
  out = `#{cmd}`
@@ -21,7 +24,7 @@ module Helpers
21
24
  {
22
25
  noop: true,
23
26
  mute: true,
24
- force: true,
27
+ sure: true,
25
28
  root: @root,
26
29
  env_name: env_name
27
30
  }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jack-eb
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tung Nguyen
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-06-02 00:00:00.000000000 Z
11
+ date: 2017-06-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
@@ -118,7 +118,6 @@ extra_rdoc_files: []
118
118
  files:
119
119
  - ".gitignore"
120
120
  - ".rspec"
121
- - ".travis.yml"
122
121
  - CHANGELOG.md
123
122
  - Gemfile
124
123
  - Guardfile
@@ -126,14 +125,15 @@ files:
126
125
  - README.md
127
126
  - Rakefile
128
127
  - bin/jack
128
+ - circle.yml
129
129
  - jack.gemspec
130
130
  - lib/jack.rb
131
131
  - lib/jack/cli.rb
132
- - lib/jack/cli/help.rb
133
132
  - lib/jack/command.rb
134
133
  - lib/jack/config.rb
135
134
  - lib/jack/config/diff.rb
136
135
  - lib/jack/config/download.rb
136
+ - lib/jack/config/help.rb
137
137
  - lib/jack/config/sort.rb
138
138
  - lib/jack/config/transmit.rb
139
139
  - lib/jack/config/upload.rb
@@ -145,7 +145,9 @@ files:
145
145
  - lib/jack/eb_config/create.rb
146
146
  - lib/jack/eb_config/update.rb
147
147
  - lib/jack/ext/hash.rb
148
+ - lib/jack/help.rb
148
149
  - lib/jack/settings.rb
150
+ - lib/jack/terminate.rb
149
151
  - lib/jack/ui.rb
150
152
  - lib/jack/util.rb
151
153
  - lib/jack/version.rb
data/.travis.yml DELETED
@@ -1,4 +0,0 @@
1
- language: ruby
2
- cache: bundler
3
- rvm:
4
- - 2.3.3
data/lib/jack/cli/help.rb DELETED
@@ -1,107 +0,0 @@
1
- module Jack
2
- class CLI < Command
3
- class Help
4
- class << self
5
- def convention
6
- <<-EOL
7
- The configuration name is based on convention. An environment with the name of hi-web-stag-1 results in the jack/cfg/stag-rails-app.cfg.yml being used. The convention can be overriden with the --cfg option.
8
- EOL
9
- end
10
-
11
- def create
12
- <<-EOL
13
- Creates a new environment using the configuration in jack/cfg folder. The AWS sample app is initially used for the newly created environment. The sample app is used as a starting point to make sure that the environment is working before you introduce your own app code.
14
-
15
- #{convention}
16
-
17
- Example:
18
-
19
- $ jack create hi-web-stag-1
20
-
21
- $ jack create -c myconfig hi-web-stag-1
22
-
23
- $ jack create -a myapp -c myconfig hi-web-stag-1
24
- EOL
25
- end
26
-
27
- def upload
28
- <<-EOL
29
- Uploads the specified template configuration in jack/cfg and applies it to the environment immediately.
30
-
31
- #{convention}
32
-
33
- Example:
34
-
35
- $ jack config upload hi-web-stag-1
36
-
37
- $ jack config upload myapp -c myconfig hi-web-stag-1
38
- EOL
39
- end
40
-
41
- def download
42
- <<-EOL
43
- Downloads the environment's config to jack/cfg/[CONFIG_NAME].cfg.yml
44
-
45
- #{convention}
46
-
47
- Example:
48
-
49
- $ jack config download hi-web-stag-1
50
-
51
- $ jack config download myapp -c myconfig hi-web-stag-1
52
- EOL
53
- end
54
-
55
-
56
- def diff
57
- <<-EOL
58
- Diff local jack config vs environment config. The environment config is generated on the fly.
59
-
60
- If you have colordiff installed the diff command will use make use of it. If you want to have your own custom diff, you can set your JACK_DIFF environment variable to it.
61
-
62
- #{convention}
63
-
64
- Example:
65
-
66
- $ jack config diff hi-web-stag-1
67
-
68
- $ jack config diff myapp -c myconfig hi-web-stag-1
69
- EOL
70
- end
71
-
72
- def sort
73
- <<-EOL
74
- Reformats local jack config file to a sorted yaml format.
75
-
76
- #{convention}
77
-
78
- Example:
79
-
80
- $ jack config sort hi-web-stag-1
81
-
82
- $ jack config sort -c myconfig hi-web-stag-1 # env name doesnt matter here
83
- EOL
84
- end
85
-
86
- # dumb thor bug, so this doesnt even show, leaving here in case Thor is fixed
87
- def config
88
- <<-EOL
89
- Manage the environment's config. Can use this to download the environment's config to jack/cfg folder or upload config in jack/cfg folder and apply it to the environment.
90
-
91
- Example:
92
-
93
- $ jack config download hi-web-stag-1
94
-
95
- For more info:
96
-
97
- $ jack help config
98
-
99
- $ jack config help apply
100
-
101
- $ jack config help download
102
- EOL
103
- end
104
- end
105
- end
106
- end
107
- end