knife-joyent 0.2.2 → 0.3.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.
data/CHANGES.md ADDED
@@ -0,0 +1,8 @@
1
+ knife-joyent Changelog
2
+ ===
3
+
4
+ ## 0.3.0
5
+
6
+ - GH-49 Network api support
7
+ - GH-37 Request signing using ssh-agent
8
+ - GH-30 Server list performance fix
data/Gemfile CHANGED
@@ -1,3 +1,5 @@
1
1
  source "http://rubygems.org"
2
2
 
3
+ # gem "fog", :github => "fog/fog", :branch => "master"
4
+
3
5
  gemspec
data/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  Knife Joyent
2
2
  ===
3
3
 
4
- This is a [Knife](http://wiki.opscode.com/display/chef/Knife) plugin for Joyent CloudAPI. This plugin gives knife
4
+ This is a [Knife](http://wiki.opscode.com/display/chef/Knife) plug-in for Joyent CloudAPI. This plug-in gives knife
5
5
  the ability to create, bootstrap, and manage servers on the [Joyent Public Cloud](http://www.joyentcloud.com/) as well as Cloud providers powered by Joyent's [SmartDataCenter](http://www.joyent.com/products/smartdatacenter/) product offering.
6
6
 
7
7
  For more information on Joyent CloudAPI, see: [CloudAPI Documentation](http://api.joyentcloud.com/docs)
@@ -25,6 +25,7 @@ Currently available commands:
25
25
  knife joyent key add -f <keyfile> -k <name>
26
26
  knife joyent key delete <name>
27
27
  knife joyent key list
28
+ knife joyent network list
28
29
  knife joyent server create (options)
29
30
  knife joyent server delete <server_id>
30
31
  knife joyent server list <options>
@@ -63,20 +64,30 @@ The following options can be specified in your knife configuration file
63
64
 
64
65
  You can authenticate against CloudAPI using either:
65
66
 
66
- a username and password
67
+ an ssh key (recommended)
67
68
 
68
69
  knife[:joyent_username] = "Your Joyent CloudAPI username"
69
- knife[:joyent_password] = "Your Joyent CloudAPI password"
70
+ knife[:joyent_keyname] = "Name of key stored on Joyent"
71
+ knife[:joyent_keyfile] = "/path/to/your/private/key"
70
72
 
71
- or, your ssh key
73
+ # Optional / not-recommended -- defaults to using ssh-agent
74
+ knife[:joyent_keyphrase] = "mypassphrase"
75
+
76
+ or username and password
72
77
 
73
78
  knife[:joyent_username] = "Your Joyent CloudAPI username"
74
- knife[:joyent_keyname] = "Name of key stored on Joyent"
75
- knife[:joyent_keyfile] = "/path/to/your/private/key"
79
+ knife[:joyent_password] = "Your Joyent CloudAPI password"
80
+
81
+ When authenticating with your ssh key (which we highly recommend), knife-joyent will
82
+ attempt to use ssh-agent to sign the request using the key configured with
83
+ ``knife[:joyent_keyname]``. If no ssh-agent is present or if the specified identity
84
+ isn't found in the agent, you may be prompted for a pass-phrase. If you do not want
85
+ to use an ``ssh-agent``, you may optionally configure ``knife[:joyent_passphrase]``
86
+ to automatically unlock the key for authentication.
76
87
 
77
- #### Optional
88
+ #### Optional Configuration
78
89
 
79
- **joyent_api_url**
90
+ **``joyent_api_url``**
80
91
 
81
92
  Specify a custom API endpoint, this is required if you want to specify
82
93
  where you want to provision your machines, or if you are using knife with a
@@ -85,7 +96,7 @@ provider powered by [SmartDataCenter](http://www.joyent.com/products/smartdatace
85
96
  # Defaults to https://us-west-1.api.joyentcloud.com/
86
97
  knife[:joyent_api_url] = "https://us-sw-1.api.joyentcloud.com/"
87
98
 
88
- **joyent_metadata**
99
+ **``joyent_metadata``**
89
100
 
90
101
  Metadata to apply to each provisioned machine via the Metadata API. This should take
91
102
  the form of a hash with a single level of nesting. See the
@@ -95,7 +106,16 @@ the form of a hash with a single level of nesting. See the
95
106
  "some_data" => "value"
96
107
  }
97
108
 
98
- **provisioner**
109
+ **``joyent_version``**
110
+
111
+ By default, knife-joyent will use the version of the Joyent Cloud API that fog prefers. This
112
+ can be overridden in knife.rb as follows:
113
+
114
+ knife[:joyent_version] = "~7.0"
115
+
116
+ Some command line options to knife-joyent subcommands may depend on the Joyent API version set.
117
+
118
+ **``provisioner``**
99
119
 
100
120
  Machines provisioned will be tagged with key ``provisioner`` containing the value specified.
101
121
  This is useful for tracking source of provisions for accounts where machines are provisioned
@@ -104,7 +124,7 @@ by/from different sources / users.
104
124
  ## Contributors
105
125
 
106
126
  - [Sean Omera](https://github.com/someara) - Opscode
107
- - [Eric Saxby](https://github.com/sax) - ModCloth
127
+ - [Eric Saxby](https://github.com/sax) - Wanelo
108
128
  - [Stephen Lauck](https://github.com/stephenlauck) - ModCloth
109
129
 
110
130
  ## Bootstrap template for smartos
data/knife-joyent.gemspec CHANGED
@@ -16,7 +16,7 @@ Gem::Specification.new do |s|
16
16
  s.files = `git ls-files`.split("\n")
17
17
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
18
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
- s.add_dependency "fog", "~> 1.11"
19
+ s.add_dependency "fog", "~> 1.12.1"
20
20
  s.add_dependency "multi_json", "~> 1.7"
21
21
  s.add_dependency "chef", ">= 0.10.10"
22
22
  s.require_paths = ["lib"]
@@ -35,11 +35,21 @@ class Chef
35
35
  :description => 'path to ssh private key for signature auth',
36
36
  :proc => Proc.new {|key| Chef::Config[:knife][:joyent_keyfile] = key }
37
37
 
38
+ option :joyent_keyphrase,
39
+ :long => '--joyent-keyphrase <passpharse>',
40
+ :description => 'ssh passphrase to use if no ssh-agent is present',
41
+ :proc => Proc.new {|key| Chef::Config[:knife][:joyent_keyphrase] = key }
42
+
38
43
  option :joyent_api_url,
39
44
  :short => "-L JOYENT_API_URL",
40
45
  :long => "--joyent-api-url JOYENT_API_URL",
41
46
  :description => "Joyent API URL",
42
47
  :proc => Proc.new {|key| Chef::Config[:knife][:joyent_api_url] = key }
48
+
49
+ option :joyent_version,
50
+ :long => "--joyent-api-version JOYENT_API_VERSION",
51
+ :description => "Joyent API version",
52
+ :proc => Proc.new {|key| Chef::Config[:knife][:joyent_version] = key }
43
53
  end
44
54
  end
45
55
 
@@ -51,7 +61,10 @@ class Chef
51
61
  :joyent_password => Chef::Config[:knife][:joyent_password],
52
62
  :joyent_keyname => Chef::Config[:knife][:joyent_keyname],
53
63
  :joyent_keyfile => Chef::Config[:knife][:joyent_keyfile],
54
- :joyent_url => Chef::Config[:knife][:joyent_api_url]
64
+
65
+ :joyent_url => Chef::Config[:knife][:joyent_api_url],
66
+ :joyent_version => Chef::Config[:knife][:joyent_version]
67
+
55
68
  )
56
69
  end
57
70
  end
@@ -0,0 +1,28 @@
1
+ require 'chef/knife/joyent_base'
2
+
3
+ class Chef
4
+ class Knife
5
+ class JoyentNetworkList < Knife
6
+ include Knife::JoyentBase
7
+
8
+ banner "knife joyent network list"
9
+
10
+ def run
11
+ networks = [
12
+ ui.color('ID', :bold),
13
+ ui.color('Name', :bold),
14
+ ui.color(''),
15
+ ]
16
+
17
+ self.connection.networks.each do |network|
18
+ networks << network.id
19
+ networks << network.name
20
+ networks << (network.public ? 'public' : 'private')
21
+ end
22
+
23
+ puts ui.list(networks, :uneven_columns_across, 3)
24
+ exit 0
25
+ end
26
+ end
27
+ end
28
+ end
@@ -51,6 +51,13 @@ class Chef
51
51
  :proc => lambda { |o| JSON.parse(o) },
52
52
  :default => {}
53
53
 
54
+ option :networks,
55
+ :short => "-w NETWORKS",
56
+ :long => "--networks NETWORKS",
57
+ :description => "Comma separated list of networks to attach (currently requires API version >= 7.0 in knife.rb)",
58
+ :proc => lambda { |n| n.split(/[\s,]+/)},
59
+ :default => nil
60
+
54
61
  option :private_network,
55
62
  :long => "--private-network",
56
63
  :description => "Use the private IP for bootstrapping rather than the public IP",
@@ -129,15 +136,11 @@ class Chef
129
136
 
130
137
  validate_server_name
131
138
 
132
- node_name = config[:chef_node_name] || config[:server_name]
139
+ @node_name = config[:chef_node_name] || config[:server_name]
133
140
 
134
- puts ui.color("Creating machine #{node_name}", :cyan)
141
+ puts ui.color("Creating machine #{@node_name}", :cyan)
135
142
 
136
- server = connection.servers.create({
137
- :name => node_name,
138
- :dataset => config[:dataset],
139
- :package => config[:package]
140
- }.merge(joyent_metadata))
143
+ server = connection.servers.create(server_creation_options)
141
144
 
142
145
  puts ui.color("Waiting for Server to be Provisioned", :magenta)
143
146
  server.wait_for { print "."; ready? }
@@ -164,7 +167,7 @@ class Chef
164
167
  tags << k
165
168
  tags << v
166
169
  end
167
- puts ui.color("Updated tags for #{node_name}", :cyan)
170
+ puts ui.color("Updated tags for #{@node_name}", :cyan)
168
171
  puts ui.list(tags, :uneven_columns_across, 2)
169
172
  else
170
173
  puts ui.color("No user defined in knife config for provision tagging -- continuing", :magenta)
@@ -176,7 +179,7 @@ class Chef
176
179
  msg_pair("State", server.state)
177
180
  msg_pair("Type", server.type)
178
181
  msg_pair("Dataset", server.dataset)
179
- msg_pair("IP's", server.ips.join(" "))
182
+ msg_pair("IPs", server.ips.join(" "))
180
183
  msg_pair("JSON Attributes",config[:json_attributes]) unless config[:json_attributes].empty?
181
184
 
182
185
  puts ui.color("Waiting for server to fully initialize...", :cyan)
@@ -263,6 +266,16 @@ class Chef
263
266
 
264
267
  private
265
268
 
269
+ def server_creation_options
270
+ o = {
271
+ :name => @node_name,
272
+ :dataset => config[:dataset],
273
+ :package => config[:package]
274
+ }.merge!(joyent_metadata)
275
+ o.merge!(:networks => config[:networks]) if config[:networks]
276
+ o
277
+ end
278
+
266
279
  def validate_server_name
267
280
  # add some validation here ala knife-ec2
268
281
  unless config[:server_name] || config[:chef_node_name]
@@ -25,7 +25,7 @@ class Chef
25
25
  msg("State", server.state)
26
26
  msg("Type", server.type)
27
27
  msg("Dataset", server.dataset)
28
- msg("IP's", server.ips.join(" "))
28
+ msg("IPs", server.ips.join(" "))
29
29
 
30
30
  unless server
31
31
  puts ui.error("Unable to locate server: #{id}")
@@ -1,3 +1,3 @@
1
1
  module KnifeJoyent
2
- VERSION = "0.2.2"
2
+ VERSION = "0.3.0"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: knife-joyent
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 0.3.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-05-23 00:00:00.000000000 Z
12
+ date: 2013-06-18 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: fog
@@ -18,7 +18,7 @@ dependencies:
18
18
  requirements:
19
19
  - - ~>
20
20
  - !ruby/object:Gem::Version
21
- version: '1.11'
21
+ version: 1.12.1
22
22
  type: :runtime
23
23
  prerelease: false
24
24
  version_requirements: !ruby/object:Gem::Requirement
@@ -26,7 +26,7 @@ dependencies:
26
26
  requirements:
27
27
  - - ~>
28
28
  - !ruby/object:Gem::Version
29
- version: '1.11'
29
+ version: 1.12.1
30
30
  - !ruby/object:Gem::Dependency
31
31
  name: multi_json
32
32
  requirement: !ruby/object:Gem::Requirement
@@ -69,6 +69,7 @@ extra_rdoc_files:
69
69
  - LICENSE
70
70
  files:
71
71
  - .gitignore
72
+ - CHANGES.md
72
73
  - Gemfile
73
74
  - LICENSE
74
75
  - README.md
@@ -80,6 +81,7 @@ files:
80
81
  - lib/chef/knife/joyent_key_add.rb
81
82
  - lib/chef/knife/joyent_key_delete.rb
82
83
  - lib/chef/knife/joyent_key_list.rb
84
+ - lib/chef/knife/joyent_network_list.rb
83
85
  - lib/chef/knife/joyent_server_create.rb
84
86
  - lib/chef/knife/joyent_server_delete.rb
85
87
  - lib/chef/knife/joyent_server_list.rb
@@ -122,3 +124,4 @@ signing_key:
122
124
  specification_version: 3
123
125
  summary: Joyent CloudAPI Support for Chef's Knife Command
124
126
  test_files: []
127
+ has_rdoc: true