rightscale-cli 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: cff866f57fce9ced5a2dd94da17a19047c963e9f
4
- data.tar.gz: 3649dc2421f581ecf8f2a4ae807a18732014501c
3
+ metadata.gz: a4bb058deb48db44d302717cb5975b254c4d4914
4
+ data.tar.gz: 5e826a2b5d6a6b68823a61dde906f36f47cace1b
5
5
  SHA512:
6
- metadata.gz: ca0028e8910348c4be6c24f8b860908f44646646c67220dcf63478a7252f499ae7517918d44759634c8dbbc127d3883fb99e4ee2e29087f9fbbffe30038a52e8
7
- data.tar.gz: a49994234187dca2298bb12218a4fbccc2c46ea20867719965de0c8440e3fe194555a20ddb1494527558eb35290a69eb173aed779d346dc160937e6b9693a738
6
+ metadata.gz: 2f16f06941398b9ad84b3f06121879c549e67dc532195c411cb34af7ca469b097077089438382edead30d7cddf728325c48b9ce07975a15c4ce2f674eef103e0
7
+ data.tar.gz: 2747385386f8dedd7863e41512e164f8c7684da80fad870a9170c5aa24b3ebf2a7cea9a2344d045381741dd76dafd9e5970f356af709c09d2bfd20f1764b0957
data/README.md CHANGED
@@ -21,7 +21,22 @@ The executable, `rs` will conflict with RS(1) on Mac OS X (http://www.freebsd.or
21
21
  As a result, to avoid overwriting the `/usr/bin/rs` binary, use a different location in your `~/.gemrc` or `/etc/gemrc`, for example:
22
22
 
23
23
  gem: --bindir /usr/local/bin
24
-
24
+
25
+ ## Configuration
26
+
27
+ Setup `~/.rightscale/right_api_client.yml` with your RightScale credentials.
28
+ Ensure the correct shard is for your account is set with `:api_url`.
29
+
30
+ An example file is available, https://github.com/rightscale/right_api_client/blob/master/config/login.yml.example.
31
+
32
+ ## Usage
33
+
34
+ There is one command, `rs`.
35
+
36
+ * For a list of commands, type `rs help`
37
+ * For a list of subcommands, type `rs <namespace> help`, e.g. `rs arrays help`
38
+ * For usage options of a subcommand, type `rs <namespace> help <subcommand>`, e.g. `rs arrays help instances`
39
+
25
40
  ## License and Authors
26
41
 
27
42
  * Author:: Chris Fordham <chris [at] fordham [hyphon] nagy [dot] id [dot] au>
@@ -17,5 +17,5 @@
17
17
  require 'rightscale_cli/version'
18
18
  require 'rightscale_cli/config'
19
19
  require 'rightscale_cli/monkey_patches/client_attributes'
20
- require 'rightscale_cli/logger'
20
+ #require 'rightscale_cli/logger'
21
21
  require 'rightscale_cli/rightscale_cli'
@@ -0,0 +1,5 @@
1
+ class RightScaleCLI
2
+ class Base
3
+
4
+ end
5
+ end
@@ -14,5 +14,40 @@
14
14
  # See the License for the specific language governing permissions and
15
15
  # limitations under the License.
16
16
 
17
- require 'rightscale_cli/config'
18
17
  require 'right_api_client'
18
+ require 'rightscale_cli/config'
19
+ require 'rightscale_cli/logger'
20
+
21
+ class RightScaleCLI
22
+ class Client
23
+ attr_accessor :render
24
+
25
+ def initialize(*args)
26
+ @client = RightApi::Client.new(RightScaleCLI::Config::API)
27
+ @logger = RightScaleCLI::Logger.new()
28
+ end
29
+
30
+ def get(resource)
31
+ result = []
32
+ @client.send(resource).index.each { |record|
33
+ result.push(record.raw)
34
+ }
35
+ return result
36
+ end
37
+
38
+ def create(resource, params)
39
+ resource = @client.send("#{resource}s").create(resource => params)
40
+ @logger.info("Created #{resource.href}.")
41
+ end
42
+
43
+ def destroy(resource, resource_id)
44
+ resource = @client.send("#{resource}s").index({ :id => resource_id })
45
+ resource.destroy
46
+ @logger.info("Deleted #{resource.href}.")
47
+ end
48
+
49
+ def render(data, root_element, options)
50
+ RightScaleCLI::Output.render(data, root_element, options)
51
+ end
52
+ end
53
+ end
@@ -40,7 +40,7 @@ class RightScaleCLI
40
40
  puts response.body
41
41
  end
42
42
 
43
- desc "scrape", "Scrape a dashboard URL by href"
43
+ desc "scrape", "Scrape a dashboard URL by href."
44
44
  def scrape(href)
45
45
  rightscale = RightApi::Client.new(RightScaleCLI::Config::API)
46
46
 
@@ -54,6 +54,22 @@ class RightScaleCLI
54
54
  response = http.request(request)
55
55
  puts response.body
56
56
  end
57
+
58
+ desc "ajax", "Scrape a dashboard URL via AJAX."
59
+ def ajax(href)
60
+ rightscale = RightApi::Client.new(RightScaleCLI::Config::API)
61
+
62
+ uri = URI.parse("#{rightscale.api_url}#{href}")
63
+ http = Net::HTTP.new(uri.host, uri.port)
64
+ http.use_ssl = true
65
+ http.verify_mode = OpenSSL::SSL::VERIFY_NONE
66
+ request = Net::HTTP::Get.new(uri.request_uri)
67
+ request.add_field("Cookie", rightscale.last_request[:request].headers[:cookie])
68
+ request.add_field("X-Requested-With", "XMLHttpRequest")
69
+
70
+ response = http.request(request)
71
+ puts response.body
72
+ end
57
73
 
58
74
  def self.banner(task, namespace = true, subcommand = false)
59
75
  "#{basename} #{task.formatted_usage(self, true, subcommand)}"
@@ -15,20 +15,43 @@
15
15
  # limitations under the License.
16
16
 
17
17
  require 'logger'
18
+ require 'rightscale_cli/config'
18
19
 
19
- unless defined? $log
20
- log_init_msg = 'Initializing Logging using '
21
- if ENV['RIGHT_API_CLIENT_LOG']
22
- if File.exists?(ENV['RIGHT_API_CLIENT_LOG'])
23
- file = File.open(ENV['RIGHT_API_CLIENT_LOG'], File::WRONLY | File::APPEND)
24
- else
25
- file = ENV['RIGHT_API_CLIENT_LOG']
20
+ class RightScaleCLI
21
+ class Logger
22
+ attr_accessor :log
23
+
24
+ def initialize(*args)
25
+ @log_init_msg = 'Initializing Logging using '
26
+
27
+ if ENV['RIGHT_API_CLIENT_LOG']
28
+ if File.exists?(ENV['RIGHT_API_CLIENT_LOG'])
29
+ file = File.open(ENV['RIGHT_API_CLIENT_LOG'], File::WRONLY | File::APPEND)
30
+ else
31
+ file = ENV['RIGHT_API_CLIENT_LOG']
32
+ end
33
+ @log = ::Logger.new(file)
34
+ @log_init_msg += ENV['RIGHT_API_CLIENT_LOG']
35
+ else
36
+ @log = ::Logger.new(STDOUT)
37
+ @log_init_msg += 'STDOUT'
38
+ end
39
+ end
40
+
41
+ def init_message()
42
+ @log.info @log_init_msg
43
+ end
44
+
45
+ def info(msg)
46
+ @log.info msg
47
+ end
48
+
49
+ def debug(msg)
50
+ @log.debug msg
51
+ end
52
+
53
+ def error(msg)
54
+ @log.error msg
26
55
  end
27
- $log = Logger.new(file)
28
- log_init_msg += ENV['RIGHT_API_CLIENT_LOG']
29
- else
30
- $log = Logger.new(STDOUT)
31
- log_init_msg += 'STDOUT'
32
56
  end
33
- $log.info log_init_msg
34
57
  end
@@ -0,0 +1,56 @@
1
+ # Author:: Chris Fordham (<chris@fordham-nagy.id.au>)
2
+ # Copyright:: Copyright (c) 2013 Chris Fordham
3
+ # License:: Apache License, Version 2.0
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+
17
+ require 'thor'
18
+ require 'yaml'
19
+ require 'right_api_client'
20
+ require 'rightscale_cli/client'
21
+ require 'rightscale_cli/logger'
22
+
23
+ class RightScaleCLI
24
+ class MultiCloudImages < Thor
25
+ namespace :mcis
26
+
27
+ def initialize(*args)
28
+ super
29
+ @client = RightScaleCLI::Client.new()
30
+ @logger = RightScaleCLI::Logger.new()
31
+ end
32
+
33
+ # include render options
34
+ eval(IO.read("#{File.dirname(File.expand_path(__FILE__))}/render_options.rb"), binding)
35
+
36
+ desc "list", "Lists all MultiCloud Images."
37
+ def list()
38
+ @logger.info('Retrieving all MultiCloud Images...')
39
+ @client.render(@client.get('multi_cloud_images'), 'multi_cloud_images', options)
40
+ end
41
+
42
+ desc "create", "Creates a MultiCloud Image."
43
+ def create(name, description)
44
+ @client.create('multi_cloud_image', { :name => name, :description => description })
45
+ end
46
+
47
+ desc "destroy", "Deletes a MultiCloud Image."
48
+ def destroy(multi_cloud_image_id)
49
+ @client.destroy('multi_cloud_image', multi_cloud_image_id)
50
+ end
51
+
52
+ def self.banner(task, namespace = true, subcommand = false)
53
+ "#{basename} #{task.formatted_usage(self, true, subcommand)}"
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,63 @@
1
+ # Author:: Chris Fordham (<chris@fordham-nagy.id.au>)
2
+ # Copyright:: Copyright (c) 2013 Chris Fordham
3
+ # License:: Apache License, Version 2.0
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+
17
+ require 'thor'
18
+ require 'right_api_client'
19
+
20
+ class RightScaleCLI
21
+ class Repositories < Thor
22
+ namespace :repositories
23
+
24
+ desc "list", "Lists all (Chef) Repositories."
25
+ def list()
26
+ repositories = []
27
+ RightApi::Client.new(RightScaleCLI::Config::API).repositories.index.each { |repos| repositories.push(repos.raw) }
28
+ RightScaleCLI::Output.render(repositories, 'repositories', options)
29
+ end
30
+
31
+ desc "create", "Creates a (Chef) Repository."
32
+ def create(name, source, source_ref)
33
+ # create profile of the repository to add
34
+ # http://reference.rightscale.com/api1.5/resources/ResourceRepositories.html#create
35
+ repository = {}
36
+ repository['source_type'] = 'git' # only git supported so far
37
+ repository['auto_import'] = true
38
+ repository['source'] = source
39
+
40
+ # not yet supported by CLI
41
+ repository['credentials'] = {}
42
+ repository['credentials']['ssh_key'] = 'text:' # needed due to bad validation
43
+
44
+ repository['name'] = "#{name}"
45
+ repository['commit_reference'] = source_ref
46
+ repository['description'] = "" # todo
47
+
48
+ puts repository if options[:verbose]
49
+
50
+ $log.info "Creating RightScale repository, '#{repository['name']}'."
51
+ repo = RightApi::Client.new(RightScaleCLI::Config::API).repositories.create({ :repository => repository })
52
+ end
53
+
54
+ desc "destroy", "Deletes a (Chef) Repository."
55
+ def destroy(id)
56
+ RightApi::Client.new(RightScaleCLI::Config::API).repositories.index(:id => id).destroy
57
+ end
58
+
59
+ def self.banner(task, namespace = true, subcommand = false)
60
+ "#{basename} #{task.formatted_usage(self, true, subcommand)}"
61
+ end
62
+ end
63
+ end
@@ -15,14 +15,18 @@
15
15
  # limitations under the License.
16
16
 
17
17
  require 'thor'
18
- require 'rightscale_cli/output'
18
+ require 'rightscale_cli/config'
19
+ require 'rightscale_cli/logger'
19
20
  require 'rightscale_cli/clouds'
20
21
  require 'rightscale_cli/dashboard'
21
22
  require 'rightscale_cli/deployments'
22
23
  require 'rightscale_cli/instances'
24
+ require 'rightscale_cli/multi_cloud_images'
25
+ require 'rightscale_cli/repositories'
23
26
  require 'rightscale_cli/servers'
24
27
  require 'rightscale_cli/server_arrays'
25
28
  require 'rightscale_cli/server_templates'
29
+ require 'rightscale_cli/volumes'
26
30
 
27
31
  # http://stackoverflow.com/questions/5663519/namespacing-thor-commands-in-a-standalone-ruby-executable
28
32
 
@@ -39,7 +43,10 @@ class RightScaleCLI
39
43
  register(ServerArrays, 'arrays', 'arrays <command>', 'Manage server arrays.')
40
44
  register(Deployments, 'deployments', 'deployments <command>', 'Manage deployments.')
41
45
  register(Instances, 'instances', 'instances <command>', 'Manage instances.')
46
+ register(MultiCloudImages, 'mcis', 'mcis <command>', 'Manage MultiCloud Images.')
47
+ register(Repositories, 'repositories', 'repositories <command>', 'Manage (Chef) Repositories.')
42
48
  register(Servers, 'servers', 'servers <command>', 'Manage servers.')
43
49
  register(ServerTemplates, 'server_templates', 'server-templates <command>', 'Manage ServerTemplates.')
50
+ register(Volumes, 'volumes', 'volumes <command>', 'Manage volumes.')
44
51
  end
45
52
  end
@@ -15,5 +15,5 @@
15
15
  # limitations under the License.
16
16
 
17
17
  class RightScaleCLI
18
- VERSION = '0.3.0'
18
+ VERSION = '0.4.0'
19
19
  end
@@ -0,0 +1,69 @@
1
+ # Author:: Chris Fordham (<chris@fordham-nagy.id.au>)
2
+ # Copyright:: Copyright (c) 2013 Chris Fordham
3
+ # License:: Apache License, Version 2.0
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+
17
+ require 'thor'
18
+ require 'yaml'
19
+ require 'json'
20
+ require "active_support/core_ext"
21
+ require 'rightscale_cli/logger'
22
+ require 'rightscale_cli/client'
23
+
24
+ class RightScaleCLI
25
+ class Volumes < Thor
26
+ namespace :volumes
27
+
28
+ # include render options
29
+ eval(IO.read("#{File.dirname(File.expand_path(__FILE__))}/render_options.rb"), binding)
30
+
31
+ desc "list", "Lists volumes, optionally with filter by datacenter, description, name, parent volume snapshot or resource UID."
32
+ option :cloud, :desc => "The cloud to query for volumes in.", :type => :string, :required => true
33
+ option :datacenter, :desc => "The href of the Datacenter / Zone the Volume is in.", :type => :string, :required => false
34
+ option :description, :desc => "The description of the Volume to filter on.", :type => :string, :required => false
35
+ option :name, :desc => "The name of the Volume to filter on.", :type => :string, :required => false
36
+ option :parent, :desc => "The href of the snapshot from which the volume was created.", :type => :string, :required => false
37
+ option :resource_uid, :desc => "Resource Unique IDentifier for the Volume to filter on.", :type => :string, :required => false
38
+
39
+ def list()
40
+ volumes = []
41
+ filter = []
42
+
43
+ filter.push("datacenter_href==/api/clouds/#{options[:cloud]}/datacenters/#{options[:datacenter]}") if options[:datacenter]
44
+ filter.push("description==#{options[:description]}") if options[:description]
45
+ filter.push("name==#{options[:name]}") if options[:name]
46
+ filter.push("parent_volume_snapshot_href==#{options[:parent]}") if options[:parent]
47
+ filter.push("resource_uid==#{options[:resource_uid]}") if options[:resource_uid]
48
+
49
+ $log.debug "filter: #{filter}" if options[:debug]
50
+
51
+ RightApi::Client.new(RightScaleCLI::Config::API).clouds(:id => options[:cloud]).show.volumes(:filter => filter).index.each { |volume|
52
+ volumes.push(volume.raw)
53
+ }
54
+
55
+ RightScaleCLI::Output.render(volumes, 'volumes', options)
56
+ end
57
+
58
+ desc "show", "Shows a volume."
59
+ option :cloud, :desc => "The cloud to query for volumes in.", :type => :string, :required => true
60
+ def show(volume_id)
61
+ volume = RightApi::Client.new(RightScaleCLI::Config::API).clouds(:id => options[:cloud]).show.volumes(:id => volume_id).show.raw
62
+ RightScaleCLI::Output.render(volume, 'volume', options)
63
+ end
64
+
65
+ def self.banner(task, namespace = true, subcommand = false)
66
+ "#{basename} #{task.formatted_usage(self, true, subcommand)}"
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,31 @@
1
+ # Author:: Chris Fordham (<chris@fordham-nagy.id.au>)
2
+ # Copyright:: Copyright (c) 2013 Chris Fordham
3
+ # License:: Apache License, Version 2.0
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+
17
+ def yesno
18
+ begin
19
+ system("stty raw -echo")
20
+ str = STDIN.getc
21
+ ensure
22
+ system("stty -raw echo")
23
+ end
24
+ if str.downcase == "y"
25
+ return true
26
+ elsif str.downcase == "n"
27
+ return false
28
+ else
29
+ raise "Invalid response. Please enter y/n."
30
+ end
31
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rightscale-cli
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chris Fordham
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-11-21 00:00:00.000000000 Z
11
+ date: 2014-01-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -105,6 +105,8 @@ files:
105
105
  - lib/rightscale_cli.rb
106
106
  - lib/rightscale_cli/servers.rb
107
107
  - lib/rightscale_cli/rightscale_cli.rb
108
+ - lib/rightscale_cli/repositories.rb
109
+ - lib/rightscale_cli/base.rb
108
110
  - lib/rightscale_cli/monkey_patches/client_attributes.rb
109
111
  - lib/rightscale_cli/output.rb
110
112
  - lib/rightscale_cli/instances.rb
@@ -116,7 +118,9 @@ files:
116
118
  - lib/rightscale_cli/config.rb
117
119
  - lib/rightscale_cli/dashboard.rb
118
120
  - lib/rightscale_cli/server_arrays.rb
121
+ - lib/rightscale_cli/multi_cloud_images.rb
119
122
  - lib/rightscale_cli/render_options.rb
123
+ - lib/rightscale_cli/volumes.rb
120
124
  - lib/rightscale_cli/server_arrays/current_instances.rb
121
125
  - lib/rightscale_cli/server_arrays/links.rb
122
126
  - lib/rightscale_cli/server_arrays/elasticity_params.rb
@@ -124,6 +128,7 @@ files:
124
128
  - lib/rightscale_cli/server_arrays/alerts.rb
125
129
  - lib/rightscale_cli/server_arrays/multi_run_executable.rb
126
130
  - lib/rightscale_cli/logger.rb
131
+ - lib/yesno.rb
127
132
  - README.md
128
133
  - LICENSE
129
134
  homepage: https://github.com/flaccid/rightscale-cli