engineyard-serverside-adapter 2.0.7 → 2.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.
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ NzQ0Mzk3ZTIyMjc5NzcyY2YyNTU5MDg4NjI5YzhlNDQyYjRkNjNiOQ==
5
+ data.tar.gz: !binary |-
6
+ MGEzZDk5NzlkZDkzMWRjOTk2YWIwZTVmM2U4NDBmNjFkMWJjNTBhNQ==
7
+ !binary "U0hBNTEy":
8
+ metadata.gz: !binary |-
9
+ ZDM2ODRjOWMwMzdkMGEyMTEzNTI4OGY5YzExMzhhOWQyODIwYjE2ODZmYzNi
10
+ ZTg3NWZmMzIxOTM5YjA2NmE1NjUzMDc2N2YzYWMyYzMwOWNmYzY0MjdjZjVl
11
+ YzRkZGJkNWZjY2U1ZjE4MjNhZTMxMTI5MGJiMmM0MDg5OGVjMDc=
12
+ data.tar.gz: !binary |-
13
+ YWU5NzM5YzA1Y2ZiYzljYzcyYzk3NmQ3NzhkMmQ5YTNkNzE1Yzk4NTIzOTJk
14
+ ZDcwOGIzMmI0ODQ0ZDE4OWYwYjRmYzNkNjExNDM0ZThkNjA5ZmM5OWVmMWUx
15
+ YzAwOGQ1ODYzZTY2YzliMGQzOTFjZGNmY2M1ZjFmYTljMGE0ZGY=
@@ -7,6 +7,9 @@ rvm:
7
7
  notifications:
8
8
  recipients:
9
9
  - memde@engineyard.com
10
- branches:
11
- only:
12
- - master
10
+ webhooks:
11
+ urls:
12
+ - https://ensemble.engineyard.com/travis
13
+ on_success: always
14
+ on_failure: always
15
+ on_start: true
data/README.md CHANGED
@@ -27,8 +27,8 @@ This example is adapted from the engineyard gem:
27
27
  def adapter(app, verbose)
28
28
  EY::Serverside::Adapter.new("/usr/local/ey_resin/ruby/bin") do |args|
29
29
  args.app = app.name
30
- args.repo = app.repository_uri
31
- args.instances = environment.instances.map { |i| {:hostname => i.public_hostname, :role => i.role, :name => i.name} }
30
+ args.git = app.repository_uri
31
+ args.instances = environment.instances.map { |i| {:hostname => i.public_hostname, :roles => [i.role], :name => i.name} }
32
32
  args.verbose = verbose || ENV['DEBUG']
33
33
  args.stack = environment.stack_name
34
34
  args.framework_env = environment.framework_env
@@ -10,6 +10,7 @@ Gem::Specification.new do |s|
10
10
  s.homepage = "http://github.com/engineyard/engineyard-serverside-adapter"
11
11
  s.summary = "Adapter for speaking to engineyard-serverside"
12
12
  s.description = "A separate adapter for speaking the CLI language of the engineyard-serverside gem."
13
+ s.license = 'MIT'
13
14
 
14
15
  s.required_rubygems_version = ">= 1.3.6"
15
16
  s.rubyforge_project = "engineyard-serverside-adapter"
@@ -14,11 +14,11 @@ module EY
14
14
  autoload :Restart, 'engineyard-serverside-adapter/restart'
15
15
  autoload :Rollback, 'engineyard-serverside-adapter/rollback'
16
16
 
17
- def initialize(gem_bin_path = "")
17
+ def initialize(gem_bin_path = "", &block)
18
18
  @gem_bin_path = Pathname.new(gem_bin_path)
19
19
  @arguments = Arguments.new
20
20
 
21
- yield @arguments if block_given?
21
+ block.call(@arguments) if block
22
22
  end
23
23
 
24
24
  def deploy(&b)
@@ -8,6 +8,15 @@ module EY
8
8
  class Adapter
9
9
  class Action
10
10
 
11
+ class << self
12
+ attr_accessor :options
13
+
14
+ def option(*args)
15
+ self.options ||= []
16
+ options << Option.new(*args)
17
+ end
18
+ end
19
+
11
20
  GEM_NAME = 'engineyard-serverside'
12
21
  BIN_NAME = GEM_NAME
13
22
 
@@ -34,16 +43,7 @@ module EY
34
43
  end
35
44
 
36
45
  def verbose
37
- @arguments[:verbose]
38
- end
39
-
40
- class << self
41
- attr_accessor :options
42
-
43
- def option(*args)
44
- self.options ||= []
45
- options << Option.new(*args)
46
- end
46
+ @arguments.verbose
47
47
  end
48
48
 
49
49
  private
@@ -85,19 +85,45 @@ module EY
85
85
  @gem_bin_path.join(@serverside_bin_name).to_s
86
86
  end
87
87
 
88
+ # Initialize a command from arguments.
89
+ #
90
+ # Returns an instance of Command.
88
91
  def action_command
89
92
  Command.new(serverside_command_path, @serverside_version, *task) do |cmd|
90
- applicable_options.each do |option|
91
- cmd.send("#{option.type}_argument", option.to_switch, @arguments[option.name])
93
+ given_applicable_options = given_options & applicable_options
94
+ given_applicable_options.each do |option|
95
+ cmd.send("#{option.type}_argument", option.to_switch, @arguments.send(option.name))
92
96
  end
93
97
  end
94
98
  end
95
99
 
100
+ # only options with a value or with `:include` are used as command flags.
101
+ #
102
+ # This is not constrained to applicable options because we need to
103
+ # error if there are duplicate options given even if the version does
104
+ # not support those options.
105
+ #
106
+ # Primarily, this is for :git and :archive. If both are given for a
107
+ # version that doesn't support it, it's still an error. We don't want
108
+ # to exclude archive from a older version and then perform a git
109
+ # deploy, which really we should have errored for receiving both.
110
+ def given_options
111
+ @given_options ||= self.class.options.select do |option|
112
+ @arguments.send(option.name) || option.include?
113
+ end
114
+ end
115
+
116
+ def required_options
117
+ applicable_options.select do |option|
118
+ option.required_on_version?(@serverside_version)
119
+ end
120
+ end
121
+
96
122
  def validate!
97
- applicable_options.each do |option|
98
- if option.required? && !@arguments[option.name]
99
- raise ArgumentError, "Required field '#{option.name}' not provided."
100
- end
123
+ missing = required_options - given_options
124
+ unless missing.empty?
125
+ options_s = missing.map{|option| option.name}.join(', ')
126
+ raise ArgumentError, "Required fields [#{options_s}] not provided."
101
127
  end
102
128
  end
103
129
 
@@ -3,55 +3,33 @@ module EY
3
3
  class Adapter
4
4
  class Arguments
5
5
 
6
- def self.nonempty_writer(*names)
6
+ def self.nonempty_attr_accessor(*names)
7
7
  names.each do |name|
8
8
  define_method(name) do
9
- self[name]
9
+ instance_variable_get("@#{name}")
10
10
  end
11
11
 
12
12
  define_method(:"#{name}=") do |value|
13
13
  if value.nil? || value.to_s.empty?
14
14
  raise ArgumentError, "Value for '#{name}' must be non-empty."
15
15
  end
16
- self[name] = value
16
+ instance_variable_set("@#{name}", value)
17
17
  end
18
18
  end
19
19
  end
20
20
 
21
- def self.writer(*names)
22
- names.each do |name|
23
- define_method(name) do
24
- self[name]
25
- end
26
-
27
- define_method(:"#{name}=") do |value|
28
- self[name] = value
29
- end
21
+ def self.aliased_attribute(pairs)
22
+ pairs.each do |from, to|
23
+ alias_method from, to
24
+ alias_method :"#{from}=", "#{to}="
30
25
  end
31
26
  end
32
27
 
33
- nonempty_writer :app, :environment_name, :account_name, :framework_env, :ref, :repo, :serverside_version, :stack
34
- writer :config, :migrate, :verbose
35
-
36
- def initialize(data={})
37
- @data = data
38
- end
39
-
40
- def dup
41
- self.class.new(@data.dup)
42
- end
43
-
44
- def []=(key, val)
45
- @data[key.to_sym] = val
46
- end
47
-
48
- def [](key)
49
- @data[key.to_sym]
50
- end
51
-
52
- def key?(key)
53
- @data.key?(key.to_sym)
54
- end
28
+ nonempty_attr_accessor :app, :account_name, :archive, :environment_name
29
+ nonempty_attr_accessor :framework_env, :git, :ref, :serverside_version, :stack
30
+ attr_accessor :config, :migrate, :verbose
31
+ attr_reader :instances
32
+ alias repo git # for versions where --repo is required, it is accessed via this alias
55
33
 
56
34
  def instances=(instances)
57
35
  unless instances.respond_to?(:each)
@@ -68,12 +46,12 @@ module EY
68
46
  end
69
47
  end
70
48
 
71
- self[:instances] = instances
49
+ @instances = instances
72
50
  end
73
51
 
74
52
  # Uses Gem::Version.create to validate the version string
75
53
  def serverside_version=(value)
76
- self[:serverside_version] = Gem::Version.create(value.dup) # dup b/c Gem::Version sometimes modifies its argument :(
54
+ @serverside_version = Gem::Version.create(value.dup) # dup b/c Gem::Version sometimes modifies its argument :(
77
55
  end
78
56
 
79
57
  end
@@ -4,16 +4,18 @@ module EY
4
4
  class Deploy < Action
5
5
 
6
6
  option :app, :string, :required => true
7
- option :account_name, :string, :required => true, :version => '>=2.0.0'
8
- option :environment_name, :string, :required => true, :version => '>=2.0.0'
9
- option :stack, :string, :required => true
10
- option :instances, :instances, :required => true
7
+ option :account_name, :string, :required => true, :version => '>= 2.0.0'
8
+ option :archive, :string, :version => '>= 2.3.0'
11
9
  option :config, :json
12
- option :verbose, :boolean
10
+ option :environment_name, :string, :required => true, :version => '>= 2.0.0'
11
+ option :git, :string, :version => '>= 2.3.0'
13
12
  option :framework_env, :string, :required => true
14
- option :ref, :string, :required => true
15
- option :repo, :string, :required => true
16
- option :migrate, :string
13
+ option :instances, :instances, :required => true
14
+ option :migrate, :string, :include => true
15
+ option :ref, :string, :required => '< 2.3.0'
16
+ option :repo, :string, :required => '< 2.3.0', :version => '< 2.3.0'
17
+ option :stack, :string, :required => true
18
+ option :verbose, :boolean
17
19
 
18
20
  private
19
21
 
@@ -21,6 +23,17 @@ module EY
21
23
  ['deploy']
22
24
  end
23
25
 
26
+ def validate!
27
+ super
28
+ given = given_options.map{|opt| opt.name}
29
+ if given.include?(:archive) && (given.include?(:git) || given.include?(:repo))
30
+ raise ArgumentError, "Both :git & :archive options given. No precedence order is defined. Specify only one."
31
+ elsif ([:git,:repo,:archive] & given).empty?
32
+ raise ArgumentError, "Either :git or :archive options must be given."
33
+ else
34
+ # archive xor git
35
+ end
36
+ end
24
37
  end
25
38
  end
26
39
  end
@@ -18,8 +18,21 @@ module EY
18
18
  !@version_requirement or @version_requirement.satisfied_by?(serverside_version)
19
19
  end
20
20
 
21
- def required?
22
- @options[:required]
21
+ # Check if the option should always be included.
22
+ #
23
+ # Returns a boolean.
24
+ def include?
25
+ @options[:include]
26
+ end
27
+
28
+ def required_on_version?(serverside_version)
29
+ case @options[:required]
30
+ when true
31
+ true
32
+ when String
33
+ requirement = Gem::Requirement.create(@options[:required])
34
+ requirement.satisfied_by?(serverside_version)
35
+ end
23
36
  end
24
37
 
25
38
  end
@@ -1,11 +1,11 @@
1
1
  module EY
2
2
  module Serverside
3
3
  class Adapter
4
- VERSION = "2.0.7"
4
+ VERSION = "2.1.0"
5
5
  # For backwards compatibility, the serverside version default will be maintained until 2.1
6
6
  # It is recommended that you supply a serverside_version to engineyard-serverside-adapter
7
7
  # rather than relying on the default version here. This default will go away soon.
8
- ENGINEYARD_SERVERSIDE_VERSION = ENV['ENGINEYARD_SERVERSIDE_VERSION'] || "2.0.1"
8
+ ENGINEYARD_SERVERSIDE_VERSION = ENV['ENGINEYARD_SERVERSIDE_VERSION'] || "2.3.0"
9
9
  end
10
10
  end
11
11
  end
@@ -9,14 +9,14 @@ shared_examples_for "a serverside action" do
9
9
  args.instances = [{:hostname => 'localhost', :roles => %w[a b c]}]
10
10
  args.framework_env = 'production'
11
11
  args.ref = 'master'
12
- args.repo = 'git@github.com:engineyard/engineyard-serverside.git'
12
+ args.git = 'git@github.com:engineyard/engineyard-serverside.git'
13
13
  args.stack = 'nginx_unicorn'
14
14
  args
15
15
  end
16
16
  end
17
17
 
18
18
  it "gives you an Arguments already set up from when you instantiated the adapter" do
19
- command = @adapter.send(@method) do |args|
19
+ @adapter.send(@method) do |args|
20
20
  args.app.should == 'app-from-adapter-new'
21
21
  end
22
22
  end
@@ -56,12 +56,12 @@ shared_examples_for "a serverside action" do
56
56
  end
57
57
 
58
58
  it "does not let arguments changes propagate back up to the adapter" do
59
- command1 = @adapter.send(@method) do |args|
59
+ @adapter.send(@method) do |args|
60
60
  args.app = 'sporkr'
61
61
  end
62
62
 
63
63
  @adapter.send(@method) do |args|
64
- args[:app].should == 'app-from-adapter-new'
64
+ args.app.should == 'app-from-adapter-new'
65
65
  end
66
66
  end
67
67
 
@@ -86,7 +86,7 @@ shared_examples_for "a serverside action" do
86
86
  args.instances = [{:hostname => 'localhost', :roles => %w[a b c]}]
87
87
  args.framework_env = 'production'
88
88
  args.ref = 'master'
89
- args.repo = 'git@github.com:engineyard/engineyard-serverside.git'
89
+ args.git = 'git@github.com:engineyard/engineyard-serverside.git'
90
90
  args.stack = 'nginx_unicorn'
91
91
  args
92
92
  end
@@ -119,7 +119,7 @@ end
119
119
  describe EY::Serverside::Adapter do
120
120
  context ".new" do
121
121
  it "lets you access the arguments" do
122
- adapter = described_class.new do |args|
122
+ described_class.new do |args|
123
123
  args.app = 'myapp'
124
124
  end
125
125
  end
@@ -152,9 +152,8 @@ describe EY::Serverside::Adapter do
152
152
  args.instances = [{:hostname => 'localhost', :roles => %w[a b c]}]
153
153
  args.framework_env = 'production'
154
154
  args.ref = 'master'
155
- args.repo = 'git@github.com:engineyard/engineyard-serverside.git'
155
+ args.git = 'git@github.com:engineyard/engineyard-serverside.git'
156
156
  args.stack = 'nginx_unicorn'
157
- args
158
157
  end
159
158
  end
160
159
 
@@ -4,33 +4,174 @@ describe EY::Serverside::Adapter::Deploy do
4
4
  it_should_behave_like "it installs engineyard-serverside"
5
5
 
6
6
  it_should_behave_like "it accepts app"
7
- it_should_behave_like "it accepts environment_name"
8
7
  it_should_behave_like "it accepts account_name"
8
+ it_should_behave_like "it accepts archive"
9
+ it_should_behave_like "it accepts environment_name"
9
10
  it_should_behave_like "it accepts framework_env"
11
+ it_should_behave_like "it accepts git"
10
12
  it_should_behave_like "it accepts instances"
11
13
  it_should_behave_like "it accepts migrate"
12
14
  it_should_behave_like "it accepts ref"
13
- it_should_behave_like "it accepts repo"
14
15
  it_should_behave_like "it accepts stack"
15
16
  it_should_behave_like "it accepts verbose"
16
17
  it_should_behave_like "it accepts serverside_version"
17
18
 
18
19
  it_should_require :app
19
- it_should_require :environment_name
20
- it_should_require :account_name
20
+ it_should_require :environment_name, %w[2.0.0 2.1.0 2.2.0 2.3.0]
21
+ it_should_require :account_name, %w[2.0.0 2.1.0 2.2.0 2.3.0]
21
22
  it_should_require :instances
22
23
  it_should_require :framework_env
23
- it_should_require :ref
24
- it_should_require :repo
25
24
  it_should_require :stack
25
+ it_should_require :ref, %w[1.6.4 2.0.0 2.1.0 2.2.0]
26
+ it_should_require :git, %w[1.6.4 2.0.0 2.1.0 2.2.0]
27
+
28
+ it_should_ignore_requirement :environment_name, '1.6.4'
29
+ it_should_ignore_requirement :account_name, '1.6.4'
30
+ it_should_ignore_requirement :ref, '2.3.0'
26
31
 
27
- it_should_ignore_requirement_for_version :environment_name, '1.6.4'
28
- it_should_ignore_requirement_for_version :account_name, '1.6.4'
32
+ it_should_exclude_from_command :environment_name, %w[1.6.4]
33
+ it_should_exclude_from_command :account_name, %w[1.6.4]
34
+ it_should_exclude_from_command :repo, %w[2.3.0]
35
+ it_should_exclude_from_command :git, %w[1.6.4 2.0.0 2.1.0 2.2.0]
36
+ it_should_exclude_from_command :archive, %w[1.6.4 2.0.0 2.1.0 2.2.0]
29
37
 
30
38
  it_should_behave_like "it treats config as optional"
31
39
  it_should_behave_like "it treats migrate as optional"
32
40
 
33
41
  context "with valid arguments" do
42
+ def deploy_command(&block)
43
+ adapter = described_class.new do |arguments|
44
+ arguments.app = "rackapp"
45
+ arguments.environment_name = 'rackapp_production'
46
+ arguments.account_name = 'ey'
47
+ arguments.framework_env = 'production'
48
+ arguments.config = {'a' => 1}
49
+ arguments.instances = [{:hostname => 'localhost', :roles => %w[han solo], :name => 'chewie'}]
50
+ arguments.migrate = 'rake db:migrate'
51
+ arguments.ref = 'master'
52
+ arguments.git = 'git@github.com:engineyard/engineyard-serverside.git'
53
+ arguments.stack = "nginx_unicorn"
54
+ arguments.serverside_version = '2.3.0'
55
+ block.call arguments if block
56
+ end
57
+ last_command(adapter)
58
+ end
59
+
60
+ def archive_deploy_command(&block)
61
+ adapter = described_class.new do |arguments|
62
+ arguments.archive = 'https://github.com/engineyard/engineyard-serverside/archive/master.zip'
63
+ arguments.app = "rackapp"
64
+ arguments.environment_name = 'rackapp_production'
65
+ arguments.account_name = 'ey'
66
+ arguments.framework_env = 'production'
67
+ arguments.config = {'a' => 1}
68
+ arguments.instances = [{:hostname => 'localhost', :roles => %w[han solo], :name => 'chewie'}]
69
+ arguments.migrate = 'rake db:migrate'
70
+ arguments.stack = "nginx_unicorn"
71
+ arguments.serverside_version = '2.3.0'
72
+ block.call arguments if block_given?
73
+ end
74
+ last_command(adapter)
75
+ end
76
+
77
+ it "puts the config in the command line as json" do
78
+ deploy_command.should =~ /--config '#{Regexp.quote '{"a":1}'}'/
79
+ end
80
+
81
+ it "invokes exactly the right command" do
82
+ deploy_command.should == [
83
+ "engineyard-serverside",
84
+ "_#{EY::Serverside::Adapter::ENGINEYARD_SERVERSIDE_VERSION}_",
85
+ "deploy",
86
+ "--account-name ey",
87
+ "--app rackapp",
88
+ "--config '{\"a\":1}'",
89
+ "--environment-name rackapp_production",
90
+ "--framework-env production",
91
+ "--git git@github.com:engineyard/engineyard-serverside.git",
92
+ "--instance-names localhost:chewie",
93
+ "--instance-roles localhost:han,solo",
94
+ "--instances localhost",
95
+ "--migrate 'rake db:migrate'",
96
+ "--ref master",
97
+ "--stack nginx_unicorn",
98
+ ].join(' ')
99
+ end
100
+
101
+ %w[1.6.4 2.0.0 2.1.0 2.2.0].each do |version|
102
+ context "on version ~> #{version}" do
103
+ it "sets --repo instead of --git flag" do
104
+ git_repo = 'git@github.com:engineyard/engineyard-serverside.git'
105
+ command = deploy_command do |args|
106
+ args.serverside_version = version
107
+ args.git = git_repo
108
+ end
109
+
110
+ expect(command).to match(/--repo #{Regexp.escape(git_repo)}/)
111
+ expect(command).not_to match(/--git/)
112
+ end
113
+
114
+ it "raises if both --archive and --git are set (you must specify git)" do
115
+ expect do
116
+ command = deploy_command do |args|
117
+ args.archive = "url"
118
+ args.serverside_version = version
119
+ end
120
+ end.to raise_error(ArgumentError)
121
+ end
122
+ end
123
+ end
124
+
125
+ context "on version ~> 2.3.0" do
126
+ let(:version) { "2.3.0" }
127
+
128
+ it "sets --git and not --repo flag" do
129
+ git_repo = 'git@github.com:engineyard/engineyard-serverside.git'
130
+ command = deploy_command do |args|
131
+ args.serverside_version = version
132
+ args.git = git_repo
133
+ end
134
+ expect(command).to match(/--git #{Regexp.escape(git_repo)}/)
135
+ expect(command).not_to match(/--repo/)
136
+ end
137
+
138
+ it "raises if both --archive and --git are set" do
139
+ expect do
140
+ deploy_command do |args|
141
+ args.serverside_version = version
142
+ args.archive = "url"
143
+ end
144
+ end.to raise_error(ArgumentError)
145
+ end
146
+
147
+ it "raises if neither --archive nor --git are set" do
148
+ expect do
149
+ described_class.new do |arguments|
150
+ arguments.app = "rackapp"
151
+ arguments.environment_name = 'rackapp_production'
152
+ arguments.account_name = 'ey'
153
+ arguments.framework_env = 'production'
154
+ arguments.config = {'a' => 1}
155
+ arguments.instances = [{:hostname => 'localhost', :roles => %w[han solo], :name => 'chewie'}]
156
+ arguments.migrate = 'rake db:migrate'
157
+ arguments.ref = 'master'
158
+ arguments.stack = "nginx_unicorn"
159
+ arguments.serverside_version = version
160
+ end
161
+ end.to raise_error(ArgumentError)
162
+ end
163
+
164
+ it "sets --archive" do
165
+ command = archive_deploy_command do |args|
166
+ args.serverside_version = version
167
+ args.archive = "url"
168
+ end
169
+ expect(command).to match(/--archive url/)
170
+ end
171
+ end
172
+ end
173
+
174
+ context "with git deploy" do
34
175
  let(:command) do
35
176
  adapter = described_class.new do |arguments|
36
177
  arguments.app = "rackapp"
@@ -41,16 +182,12 @@ describe EY::Serverside::Adapter::Deploy do
41
182
  arguments.instances = [{:hostname => 'localhost', :roles => %w[han solo], :name => 'chewie'}]
42
183
  arguments.migrate = 'rake db:migrate'
43
184
  arguments.ref = 'master'
44
- arguments.repo = 'git@github.com:engineyard/engineyard-serverside.git'
185
+ arguments.git = 'git@github.com:engineyard/engineyard-serverside.git'
45
186
  arguments.stack = "nginx_unicorn"
46
187
  end
47
188
  last_command(adapter)
48
189
  end
49
190
 
50
- it "puts the config in the command line as json" do
51
- command.should =~ /--config '#{Regexp.quote '{"a":1}'}'/
52
- end
53
-
54
191
  it "invokes exactly the right command" do
55
192
  command.should == [
56
193
  "engineyard-serverside",
@@ -61,17 +198,54 @@ describe EY::Serverside::Adapter::Deploy do
61
198
  "--config '{\"a\":1}'",
62
199
  "--environment-name rackapp_production",
63
200
  "--framework-env production",
201
+ "--git git@github.com:engineyard/engineyard-serverside.git",
64
202
  "--instance-names localhost:chewie",
65
203
  "--instance-roles localhost:han,solo",
66
204
  "--instances localhost",
67
205
  "--migrate 'rake db:migrate'",
68
206
  "--ref master",
69
- "--repo git@github.com:engineyard/engineyard-serverside.git",
70
- "--stack nginx_unicorn",
207
+ "--stack nginx_unicorn"
71
208
  ].join(' ')
72
209
  end
73
210
  end
74
211
 
212
+ context "with package deploy" do
213
+ let(:command) do
214
+ adapter = described_class.new do |args|
215
+ args.app = "rackapp"
216
+ args.environment_name = 'rackapp_production'
217
+ args.account_name = 'ey'
218
+ args.framework_env = 'production'
219
+ args.instances = [{:hostname => 'localhost', :roles => %w[han solo], :name => 'chewie'}]
220
+ args.migrate = false
221
+ args.stack = "nginx_unicorn"
222
+ args.archive = 'https://github.com/engineyard/engineyard-serverside/archive/master.zip'
223
+ args.serverside_version = EY::Serverside::Adapter::ENGINEYARD_SERVERSIDE_VERSION
224
+ end
225
+
226
+ last_command(adapter)
227
+ end
228
+
229
+ it "invokes exactly the right command" do
230
+ command.should == [
231
+ "engineyard-serverside",
232
+ "_#{EY::Serverside::Adapter::ENGINEYARD_SERVERSIDE_VERSION}_",
233
+ "deploy",
234
+ "--account-name ey",
235
+ "--app rackapp",
236
+ "--archive https://github.com/engineyard/engineyard-serverside/archive/master.zip",
237
+ "--environment-name rackapp_production",
238
+ "--framework-env production",
239
+ "--instance-names localhost:chewie",
240
+ "--instance-roles localhost:han,solo",
241
+ "--instances localhost",
242
+ "--no-migrate",
243
+ "--stack nginx_unicorn"
244
+ ].join(' ')
245
+ end
246
+
247
+ end
248
+
75
249
  context "with no migrate argument" do
76
250
  let(:command) do
77
251
  adapter = described_class.new do |arguments|
@@ -83,7 +257,7 @@ describe EY::Serverside::Adapter::Deploy do
83
257
  arguments.instances = [{:hostname => 'localhost', :roles => %w[han solo], :name => 'chewie'}]
84
258
  arguments.migrate = false
85
259
  arguments.ref = 'master'
86
- arguments.repo = 'git@github.com:engineyard/engineyard-serverside.git'
260
+ arguments.git = 'git@github.com:engineyard/engineyard-serverside.git'
87
261
  arguments.stack = "nginx_unicorn"
88
262
  end
89
263
  last_command(adapter)
@@ -103,12 +277,12 @@ describe EY::Serverside::Adapter::Deploy do
103
277
  "--config '{\"a\":1}'",
104
278
  "--environment-name rackapp_production",
105
279
  "--framework-env production",
280
+ "--git git@github.com:engineyard/engineyard-serverside.git",
106
281
  "--instance-names localhost:chewie",
107
282
  "--instance-roles localhost:han,solo",
108
283
  "--instances localhost",
109
284
  "--no-migrate",
110
285
  "--ref master",
111
- "--repo git@github.com:engineyard/engineyard-serverside.git",
112
286
  "--stack nginx_unicorn",
113
287
  ].join(' ')
114
288
  end
@@ -11,12 +11,15 @@ describe EY::Serverside::Adapter::DisableMaintenance do
11
11
  it_should_behave_like "it accepts serverside_version"
12
12
 
13
13
  it_should_require :app
14
- it_should_require :environment_name
15
- it_should_require :account_name
14
+ it_should_require :environment_name, %w[2.0.0 2.1.0 2.2.0 2.3.0]
15
+ it_should_require :account_name, %w[2.0.0 2.1.0 2.2.0 2.3.0]
16
16
  it_should_require :instances
17
17
 
18
- it_should_ignore_requirement_for_version :environment_name, '1.6.4'
19
- it_should_ignore_requirement_for_version :account_name, '1.6.4'
18
+ it_should_ignore_requirement :environment_name, '1.6.4'
19
+ it_should_ignore_requirement :account_name, '1.6.4'
20
+
21
+ it_should_exclude_from_command :environment_name, %w[1.6.4]
22
+ it_should_exclude_from_command :account_name, %w[1.6.4]
20
23
 
21
24
  context "with valid arguments" do
22
25
  let(:command) do
@@ -11,12 +11,15 @@ describe EY::Serverside::Adapter::EnableMaintenance do
11
11
  it_should_behave_like "it accepts serverside_version"
12
12
 
13
13
  it_should_require :app
14
- it_should_require :environment_name
15
- it_should_require :account_name
14
+ it_should_require :environment_name, %w[2.0.0 2.1.0 2.2.0 2.3.0]
15
+ it_should_require :account_name, %w[2.0.0 2.1.0 2.2.0 2.3.0]
16
16
  it_should_require :instances
17
17
 
18
- it_should_ignore_requirement_for_version :environment_name, '1.6.4'
19
- it_should_ignore_requirement_for_version :account_name, '1.6.4'
18
+ it_should_ignore_requirement :environment_name, '1.6.4'
19
+ it_should_ignore_requirement :account_name, '1.6.4'
20
+
21
+ it_should_exclude_from_command :environment_name, %w[1.6.4]
22
+ it_should_exclude_from_command :account_name, %w[1.6.4]
20
23
 
21
24
  context "with valid arguments" do
22
25
 
@@ -13,14 +13,17 @@ describe EY::Serverside::Adapter::Integrate do
13
13
  it_should_behave_like "it accepts serverside_version"
14
14
 
15
15
  it_should_require :app
16
- it_should_require :environment_name
17
- it_should_require :account_name
16
+ it_should_require :environment_name, %w[2.0.0 2.1.0 2.2.0 2.3.0]
17
+ it_should_require :account_name, %w[2.0.0 2.1.0 2.2.0 2.3.0]
18
18
  it_should_require :stack
19
19
  it_should_require :instances
20
20
  it_should_require :framework_env
21
21
 
22
- it_should_ignore_requirement_for_version :environment_name, '1.6.4'
23
- it_should_ignore_requirement_for_version :account_name, '1.6.4'
22
+ it_should_ignore_requirement :environment_name, '1.6.4'
23
+ it_should_ignore_requirement :account_name, '1.6.4'
24
+
25
+ it_should_exclude_from_command :environment_name, %w[1.6.4]
26
+ it_should_exclude_from_command :account_name, %w[1.6.4]
24
27
 
25
28
  context "with valid arguments" do
26
29
  let(:command) do
@@ -12,13 +12,16 @@ describe EY::Serverside::Adapter::Restart do
12
12
  it_should_behave_like "it accepts serverside_version"
13
13
 
14
14
  it_should_require :app
15
- it_should_require :environment_name
16
- it_should_require :account_name
15
+ it_should_require :environment_name, %w[2.0.0 2.1.0 2.2.0 2.3.0]
16
+ it_should_require :account_name, %w[2.0.0 2.1.0 2.2.0 2.3.0]
17
17
  it_should_require :instances
18
18
  it_should_require :stack
19
19
 
20
- it_should_ignore_requirement_for_version :environment_name, '1.6.4'
21
- it_should_ignore_requirement_for_version :account_name, '1.6.4'
20
+ it_should_ignore_requirement :environment_name, '1.6.4'
21
+ it_should_ignore_requirement :account_name, '1.6.4'
22
+
23
+ it_should_exclude_from_command :environment_name, %w[1.6.4]
24
+ it_should_exclude_from_command :account_name, %w[1.6.4]
22
25
 
23
26
  context "with valid arguments" do
24
27
  let(:command) do
@@ -13,14 +13,17 @@ describe EY::Serverside::Adapter::Rollback do
13
13
  it_should_behave_like "it accepts serverside_version"
14
14
 
15
15
  it_should_require :app
16
- it_should_require :environment_name
17
- it_should_require :account_name
16
+ it_should_require :environment_name, %w[2.0.0 2.1.0 2.2.0 2.3.0]
17
+ it_should_require :account_name, %w[2.0.0 2.1.0 2.2.0 2.3.0]
18
18
  it_should_require :framework_env
19
19
  it_should_require :instances
20
20
  it_should_require :stack
21
21
 
22
- it_should_ignore_requirement_for_version :environment_name, '1.6.4'
23
- it_should_ignore_requirement_for_version :account_name, '1.6.4'
22
+ it_should_ignore_requirement :environment_name, '1.6.4'
23
+ it_should_ignore_requirement :account_name, '1.6.4'
24
+
25
+ it_should_exclude_from_command :environment_name, %w[1.6.4]
26
+ it_should_exclude_from_command :account_name, %w[1.6.4]
24
27
 
25
28
  context "with valid arguments" do
26
29
  let(:command) do
@@ -8,12 +8,13 @@ module ArgumentsHelpers
8
8
  def valid_options
9
9
  {
10
10
  :app => 'rackapp',
11
- :environment_name => 'rackapp_production',
12
11
  :account_name => 'ey',
12
+ #:archive => 'https://github.com/engineyard/engineyard-serverside/archive/master.zip',
13
+ :environment_name => 'rackapp_production',
13
14
  :framework_env => 'production',
15
+ :git => 'git@github.com:engineyard/engineyard-serverside.git',
14
16
  :instances => [{:hostname => 'localhost', :roles => %w[han solo], :name => 'chewie'}],
15
17
  :ref => 'master',
16
- :repo => 'git@github.com:engineyard/engineyard-serverside.git',
17
18
  :stack => 'nginx_unicorn',
18
19
  }
19
20
  end
@@ -46,32 +47,51 @@ module ArgumentsHelpers
46
47
  end
47
48
 
48
49
  module RequiredFieldHelpers
49
- def it_should_require(field)
50
+ def it_should_require(field, versions=[:all])
50
51
  context "field #{field}" do
51
- it "is just fine when #{field} is there" do
52
- lambda { described_class.new(:arguments => valid_arguments) }.should_not raise_error
53
- end
54
-
55
- it "raises an error if #{field} is missing" do
56
- lambda { described_class.new(:arguments => arguments_without(field)) }.should raise_error(ArgumentError)
52
+ versions.each do |version|
53
+ on_versions = version == :all ? "on all versions" : "on version ~> #{version}"
54
+ context on_versions do
55
+ it "is fine when #{field} is there" do
56
+ arguments = valid_arguments
57
+ arguments.serverside_version = version unless version == :all
58
+ expect { described_class.new(:arguments => arguments) }.to_not raise_error
59
+ end
60
+
61
+ it "raises an error if #{field} is missing" do
62
+ arguments = arguments_without(field)
63
+ arguments.serverside_version = version unless version == :all
64
+ expect { described_class.new(:arguments => arguments) }.to raise_error(ArgumentError)
65
+ end
66
+ end
57
67
  end
58
68
  end
59
69
  end
60
70
 
61
- def it_should_ignore_requirement_for_version(field, version)
62
- context "field #{field} on version #{version}" do
63
- it "is does not require #{field}" do
64
- arguments = arguments_without(field)
65
- arguments.serverside_version = version
66
- lambda { described_class.new(:arguments => arguments) }.should_not raise_error
71
+ def it_should_ignore_requirement(field, version)
72
+ context "field #{field}" do
73
+ context "on version ~> #{version}" do
74
+ it "is not required" do
75
+ arguments = arguments_without(field)
76
+ arguments.serverside_version = version
77
+ lambda { described_class.new(:arguments => arguments) }.should_not raise_error
78
+ end
67
79
  end
80
+ end
81
+ end
68
82
 
69
- it "it does not include #{field} in the command, even if it is set" do
70
- arguments = valid_arguments
71
- arguments.serverside_version = version
72
- action = described_class.new(:arguments => arguments)
73
- commands = all_commands(action)
74
- commands.last.should_not include(EY::Serverside::Adapter::Option.new(field, :string).to_switch)
83
+ def it_should_exclude_from_command(field, versions)
84
+ context "field #{field}" do
85
+ versions.each do |version|
86
+ context "on version ~> #{version}" do
87
+ it "is not included #{field} in the command" do
88
+ arguments = valid_arguments
89
+ arguments.serverside_version = version
90
+ action = described_class.new(:arguments => arguments)
91
+ commands = all_commands(action)
92
+ commands.last.should_not include(EY::Serverside::Adapter::Option.new(field, :string).to_switch)
93
+ end
94
+ end
75
95
  end
76
96
  end
77
97
  end
@@ -127,7 +147,7 @@ RSpec.configure do |config|
127
147
  :stack => '--stack',
128
148
  :framework_env => '--framework-env',
129
149
  :ref => '--ref',
130
- :repo => '--repo',
150
+ :git => '--git',
131
151
  :migrate => '--migrate',
132
152
  }.each do |arg, switch|
133
153
  shared_examples_for "it accepts #{arg}" do
@@ -158,6 +178,15 @@ RSpec.configure do |config|
158
178
  end
159
179
  end
160
180
 
181
+ shared_examples_for "it accepts archive" do
182
+ it "puts the --archive arg in the command line" do
183
+ arguments = arguments_without(:git)
184
+ arguments.archive = 'word'
185
+ adapter = described_class.new(:arguments => arguments)
186
+ last_command(adapter).should =~ /--archive word/
187
+ end
188
+ end
189
+
161
190
  shared_examples_for "it accepts serverside_version" do
162
191
  it "puts the _VERSION_ command part in the command line" do
163
192
  adapter = described_class.new(:arguments => arguments_with(:serverside_version => '1.2.3'))
metadata CHANGED
@@ -1,8 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: engineyard-serverside-adapter
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.7
5
- prerelease:
4
+ version: 2.1.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Martin Emde
@@ -10,12 +9,11 @@ authors:
10
9
  autorequire:
11
10
  bindir: bin
12
11
  cert_chain: []
13
- date: 2013-04-19 00:00:00.000000000 Z
12
+ date: 2013-08-03 00:00:00.000000000 Z
14
13
  dependencies:
15
14
  - !ruby/object:Gem::Dependency
16
15
  name: escape
17
16
  requirement: !ruby/object:Gem::Requirement
18
- none: false
19
17
  requirements:
20
18
  - - ~>
21
19
  - !ruby/object:Gem::Version
@@ -23,7 +21,6 @@ dependencies:
23
21
  type: :runtime
24
22
  prerelease: false
25
23
  version_requirements: !ruby/object:Gem::Requirement
26
- none: false
27
24
  requirements:
28
25
  - - ~>
29
26
  - !ruby/object:Gem::Version
@@ -31,7 +28,6 @@ dependencies:
31
28
  - !ruby/object:Gem::Dependency
32
29
  name: multi_json
33
30
  requirement: !ruby/object:Gem::Requirement
34
- none: false
35
31
  requirements:
36
32
  - - ~>
37
33
  - !ruby/object:Gem::Version
@@ -39,7 +35,6 @@ dependencies:
39
35
  type: :runtime
40
36
  prerelease: false
41
37
  version_requirements: !ruby/object:Gem::Requirement
42
- none: false
43
38
  requirements:
44
39
  - - ~>
45
40
  - !ruby/object:Gem::Version
@@ -47,7 +42,6 @@ dependencies:
47
42
  - !ruby/object:Gem::Dependency
48
43
  name: rspec
49
44
  requirement: !ruby/object:Gem::Requirement
50
- none: false
51
45
  requirements:
52
46
  - - ~>
53
47
  - !ruby/object:Gem::Version
@@ -55,7 +49,6 @@ dependencies:
55
49
  type: :development
56
50
  prerelease: false
57
51
  version_requirements: !ruby/object:Gem::Requirement
58
- none: false
59
52
  requirements:
60
53
  - - ~>
61
54
  - !ruby/object:Gem::Version
@@ -63,7 +56,6 @@ dependencies:
63
56
  - !ruby/object:Gem::Dependency
64
57
  name: rake
65
58
  requirement: !ruby/object:Gem::Requirement
66
- none: false
67
59
  requirements:
68
60
  - - ! '>='
69
61
  - !ruby/object:Gem::Version
@@ -71,7 +63,6 @@ dependencies:
71
63
  type: :development
72
64
  prerelease: false
73
65
  version_requirements: !ruby/object:Gem::Requirement
74
- none: false
75
66
  requirements:
76
67
  - - ! '>='
77
68
  - !ruby/object:Gem::Version
@@ -115,30 +106,27 @@ files:
115
106
  - spec/rollback_spec.rb
116
107
  - spec/spec_helper.rb
117
108
  homepage: http://github.com/engineyard/engineyard-serverside-adapter
118
- licenses: []
109
+ licenses:
110
+ - MIT
111
+ metadata: {}
119
112
  post_install_message:
120
113
  rdoc_options: []
121
114
  require_paths:
122
115
  - lib
123
116
  required_ruby_version: !ruby/object:Gem::Requirement
124
- none: false
125
117
  requirements:
126
118
  - - ! '>='
127
119
  - !ruby/object:Gem::Version
128
120
  version: '0'
129
- segments:
130
- - 0
131
- hash: -3196036238943305077
132
121
  required_rubygems_version: !ruby/object:Gem::Requirement
133
- none: false
134
122
  requirements:
135
123
  - - ! '>='
136
124
  - !ruby/object:Gem::Version
137
125
  version: 1.3.6
138
126
  requirements: []
139
127
  rubyforge_project: engineyard-serverside-adapter
140
- rubygems_version: 1.8.25
128
+ rubygems_version: 2.0.6
141
129
  signing_key:
142
- specification_version: 3
130
+ specification_version: 4
143
131
  summary: Adapter for speaking to engineyard-serverside
144
132
  test_files: []