cloudstack-cli 1.0.0.rc1 → 1.0.0.rc2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +0 -3
- data/Gemfile +5 -1
- data/Gemfile.lock +9 -8
- data/cloudstack-cli.gemspec +1 -1
- data/lib/cloudstack-cli/base.rb +17 -3
- data/lib/cloudstack-cli/cli.rb +29 -106
- data/lib/cloudstack-cli/commands/environment.rb +13 -9
- data/lib/cloudstack-cli/commands/infrastructure_stack.rb +27 -0
- data/lib/cloudstack-cli/commands/{ssh_key_pairs.rb → ssh_key_pair.rb} +0 -0
- data/lib/cloudstack-cli/option_resolver.rb +9 -2
- data/lib/cloudstack-cli/version.rb +1 -1
- data/test/infrastructure_stack.yaml +36 -0
- metadata +8 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fb18633b9ea89df8bc15123d54b7cad8c90a434a
|
4
|
+
data.tar.gz: ebebedd48f0edb2272944ffd8d8f903a441279be
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3f744fdfe0acd813349be7a8da81c20b1d3a981c2ce6d4c63add9a3c27a4d11d927d05536d4ee06ce83af987005586dc63f398cf3730c34697c9e952fc7d3ac3
|
7
|
+
data.tar.gz: 87185f60b63cb39b2781bcbf8d69bdf784db0b26edf4114f0a2d936b5e986f166b2fb7bab2ee718fa3ffd8771137e9851626ced918b0eef59c100d89b63d52fa
|
data/.gitignore
CHANGED
data/Gemfile
CHANGED
@@ -1,6 +1,10 @@
|
|
1
1
|
source 'https://rubygems.org'
|
2
2
|
|
3
|
-
|
3
|
+
group :development do
|
4
|
+
gem 'cloudstack_client',
|
5
|
+
path: '../cloudstack_client/',
|
6
|
+
branch: 'master'
|
7
|
+
end
|
4
8
|
|
5
9
|
# Specify your gem's dependencies in cloudstack-cli.gemspec
|
6
10
|
gemspec
|
data/Gemfile.lock
CHANGED
@@ -1,20 +1,21 @@
|
|
1
|
-
GIT
|
2
|
-
remote: git@github.com:niwo/cloudstack_client.git
|
3
|
-
revision: b388af01e7403f65fc1ad5cd4c905a1f005afea3
|
4
|
-
specs:
|
5
|
-
cloudstack_client (1.0.0.rc1)
|
6
|
-
|
7
1
|
PATH
|
8
2
|
remote: .
|
9
3
|
specs:
|
10
|
-
cloudstack-cli (1.0.0.
|
11
|
-
cloudstack_client (~> 1.0.
|
4
|
+
cloudstack-cli (1.0.0.rc2)
|
5
|
+
cloudstack_client (~> 1.0.2)
|
12
6
|
thor (~> 0.19.1)
|
13
7
|
|
8
|
+
PATH
|
9
|
+
remote: ../cloudstack_client/
|
10
|
+
specs:
|
11
|
+
cloudstack_client (1.0.2)
|
12
|
+
msgpack (~> 0.5.11)
|
13
|
+
|
14
14
|
GEM
|
15
15
|
remote: https://rubygems.org/
|
16
16
|
specs:
|
17
17
|
json (1.8.2)
|
18
|
+
msgpack (0.5.11)
|
18
19
|
rake (10.4.2)
|
19
20
|
rdoc (4.2.0)
|
20
21
|
json (~> 1.4)
|
data/cloudstack-cli.gemspec
CHANGED
data/lib/cloudstack-cli/base.rb
CHANGED
@@ -10,11 +10,25 @@ module CloudstackCli
|
|
10
10
|
|
11
11
|
attr_reader :config
|
12
12
|
|
13
|
+
# rescue error globally
|
14
|
+
def self.start(given_args=ARGV, config={})
|
15
|
+
super
|
16
|
+
rescue => e
|
17
|
+
error_class = e.class.name.split('::')
|
18
|
+
if error_class.size == 2 && error_class.first == "CloudstackClient"
|
19
|
+
puts "\e[31mERROR\e[0m: #{error_class.last} - #{e.message}"
|
20
|
+
puts e.backtrace if ARGV.include? "--debug"
|
21
|
+
else
|
22
|
+
raise
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
13
26
|
# catch control-c and exit
|
14
|
-
trap("SIGINT")
|
15
|
-
puts
|
27
|
+
trap("SIGINT") do
|
28
|
+
puts
|
29
|
+
puts "bye.."
|
16
30
|
exit!
|
17
|
-
|
31
|
+
end
|
18
32
|
|
19
33
|
# exit with return code 1 in case of a error
|
20
34
|
def self.exit_on_failure?
|
data/lib/cloudstack-cli/cli.rb
CHANGED
@@ -23,7 +23,6 @@ module CloudstackCli
|
|
23
23
|
say "cloudstack-cli version #{CloudstackCli::VERSION}"
|
24
24
|
say " (cloudstack_client version #{CloudstackClient::VERSION})"
|
25
25
|
end
|
26
|
-
map %w(-v --version) => :version
|
27
26
|
|
28
27
|
desc "setup", "Initial configuration of Cloudstack connection settings"
|
29
28
|
def setup(env = options[:environment])
|
@@ -46,128 +45,52 @@ module CloudstackCli
|
|
46
45
|
end
|
47
46
|
|
48
47
|
desc "command COMMAND [arg1=val1 arg2=val2...]", "Run a custom api command"
|
49
|
-
option :format, default: '
|
48
|
+
option :format, default: 'yaml',
|
50
49
|
enum: %w(json yaml), desc: "output format"
|
51
50
|
option :pretty_print, default: true, type: :boolean,
|
52
51
|
desc: "pretty print json output"
|
53
52
|
def command(command, *args)
|
54
|
-
params = {'command' => command}
|
53
|
+
params = { 'command' => command }
|
55
54
|
args.each do |arg|
|
56
55
|
arg = arg.split('=')
|
57
56
|
params[arg[0]] = arg[1]
|
58
57
|
end
|
58
|
+
|
59
|
+
unless client.api.commands.has_key? command
|
60
|
+
say "ERROR: ", :red
|
61
|
+
say "Unknown API command '#{command}'."
|
62
|
+
exit!
|
63
|
+
end
|
64
|
+
|
65
|
+
unless client.api.all_required_params?(command, params)
|
66
|
+
raise CloudstackClient::ParameterError, client.api.missing_params_msg(command)
|
67
|
+
end
|
68
|
+
|
59
69
|
data = client.send_request(params)
|
60
|
-
|
61
|
-
options[:pretty_print] ? JSON.pretty_generate(data) : data.to_json
|
70
|
+
if options[:format] == 'json'
|
71
|
+
puts options[:pretty_print] ? JSON.pretty_generate(data) : data.to_json
|
62
72
|
else
|
63
|
-
data.to_yaml
|
73
|
+
puts data.to_yaml
|
64
74
|
end
|
65
|
-
puts output
|
66
|
-
end
|
67
|
-
|
68
|
-
# require subcommands
|
69
|
-
Dir[File.dirname(__FILE__) + '/commands/*.rb'].each do |command|
|
70
|
-
require command
|
71
75
|
end
|
72
76
|
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
desc "zone SUBCOMMAND ...ARGS", "Manage zones"
|
78
|
-
subcommand :zone, Zone
|
77
|
+
# Require and describe subcommands
|
78
|
+
Dir[File.dirname(__FILE__) + '/commands/*.rb'].each do |command_path|
|
79
|
+
require command_path
|
79
80
|
|
80
|
-
|
81
|
-
|
81
|
+
command = File.basename(command_path, ".rb")
|
82
|
+
class_names = command.split('_').collect(&:capitalize)
|
82
83
|
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
desc "project SUBCOMMAND ...ARGS", "Manage servers"
|
90
|
-
subcommand :project, Project
|
84
|
+
desc "#{command} SUBCOMMAND ...ARGS",
|
85
|
+
"#{class_names.join(' ')} commands"
|
86
|
+
subcommand command,
|
87
|
+
Object.const_get(class_names.join)
|
88
|
+
end
|
91
89
|
|
92
|
-
|
93
|
-
|
90
|
+
# Additional command maps (aliases)
|
91
|
+
map %w(-v --version) => :version
|
92
|
+
map 'env' => :environment
|
94
93
|
map 'vm' => :virtual_machine
|
95
94
|
map 'server' => :virtual_machine
|
96
|
-
|
97
|
-
desc "compute_offer SUBCOMMAND ...ARGS", "Manage offerings"
|
98
|
-
subcommand :compute_offer, ComputeOffer
|
99
|
-
|
100
|
-
desc "disk_offer SUBCOMMAND ...ARGS", "Manage disk offerings"
|
101
|
-
subcommand :disk_offering, DiskOffer
|
102
|
-
|
103
|
-
desc "network SUBCOMMAND ...ARGS", "Manage networks"
|
104
|
-
subcommand :network, Network
|
105
|
-
map 'networks' => 'network'
|
106
|
-
|
107
|
-
desc "physical_network SUBCOMMAND ...ARGS", "Manage physical networks"
|
108
|
-
subcommand :physical_network, PhysicalNetwork
|
109
|
-
|
110
|
-
desc "load_balancer SUBCOMMAND ...ARGS", "Manage load balancing rules"
|
111
|
-
subcommand :load_balancer, LoadBalancer
|
112
|
-
|
113
|
-
desc "template SUBCOMMAND ...ARGS", "Manage templates"
|
114
|
-
subcommand :template, Template
|
115
|
-
|
116
|
-
desc "iso SUBCOMMAND ...ARGS", "Manage iso's"
|
117
|
-
subcommand :iso, Iso
|
118
|
-
|
119
|
-
desc "router SUBCOMMAND ...ARGS", "Manage virtual routers"
|
120
|
-
subcommand :router, Router
|
121
|
-
|
122
|
-
desc "system_vm SUBCOMMAND ...ARGS", "Manage system vms"
|
123
|
-
subcommand :system_vm, SystemVm
|
124
|
-
|
125
|
-
desc "volume SUBCOMMAND ...ARGS", "Manage volumes"
|
126
|
-
subcommand :volume, Volume
|
127
|
-
|
128
|
-
desc "snapshot SUBCOMMAND ...ARGS", "Manage snapshots"
|
129
|
-
subcommand :snapshot, Snapshot
|
130
|
-
|
131
|
-
desc "stack SUBCOMMAND ...ARGS", "Manage stacks"
|
132
|
-
subcommand :stack, Stack
|
133
|
-
|
134
|
-
desc "account SUBCOMMAND ...ARGS", "Manage accounts"
|
135
|
-
subcommand :account, Account
|
136
|
-
|
137
|
-
desc "user SUBCOMMAND ...ARGS", "Manage users"
|
138
|
-
subcommand :user, User
|
139
|
-
|
140
|
-
desc "domain SUBCOMMAND ...ARGS", "Manage domains"
|
141
|
-
subcommand :domain, Domain
|
142
|
-
|
143
|
-
desc "ip_address SUBCOMMAND ...ARGS", "Manage ip addresses"
|
144
|
-
subcommand :ip_address, IpAddress
|
145
|
-
|
146
|
-
desc "capacity SUBCOMMAND ...ARGS", "Lists all the system wide capacities"
|
147
|
-
subcommand :capacity, Capacity
|
148
|
-
|
149
|
-
desc "port_rule SUBCOMMAND ...ARGS", "Manage portforwarding rules"
|
150
|
-
subcommand :port_rule, PortRule
|
151
|
-
|
152
|
-
desc "job SUBCOMMAND ...ARGS", "Display async jobs"
|
153
|
-
subcommand :job, Job
|
154
|
-
|
155
|
-
desc "ssh_key_pair SUBCOMMAND ...ARGS", "Manage ssh key pairs"
|
156
|
-
subcommand :ssh_key_pair, SshKeyPair
|
157
|
-
|
158
|
-
desc "storage_pool SUBCOMMAND ...ARGS", "Manage storage pools"
|
159
|
-
subcommand :storage_pool, StoragePool
|
160
|
-
|
161
|
-
desc "region SUBCOMMAND ...ARGS", "Manage regions"
|
162
|
-
subcommand :region, Region
|
163
|
-
|
164
|
-
desc "affinity_group SUBCOMMAND ...ARGS", "Manage affinity_groups"
|
165
|
-
subcommand :affinity_group, AffinityGroup
|
166
|
-
|
167
|
-
desc "configuration SUBCOMMAND ...ARGS", "List cloudstack configuration values"
|
168
|
-
subcommand :configuration, Configuration
|
169
|
-
|
170
|
-
desc "resource_limit SUBCOMMAND ...ARGS", "Show cloudstack resource limits"
|
171
|
-
subcommand :resource_limit, ResourceLimit
|
172
95
|
end
|
173
96
|
end
|
@@ -22,25 +22,29 @@ class Environment < CloudstackCli::Base
|
|
22
22
|
config = {}
|
23
23
|
unless options[:url]
|
24
24
|
say "Add a new environment...", :green
|
25
|
-
|
25
|
+
if env
|
26
|
+
say "Environment name: #{env}"
|
27
|
+
else
|
28
|
+
env = ask("Environment name:", :magenta)
|
29
|
+
end
|
26
30
|
say "What's the URL of your Cloudstack API?", :yellow
|
27
31
|
say "Example: https://my-cloudstack-service/client/api/", :green
|
28
32
|
config[:url] = ask("URL:", :magenta)
|
29
33
|
end
|
30
|
-
|
34
|
+
|
31
35
|
unless options[:api_key]
|
32
36
|
config[:api_key] = ask("API Key:", :magenta)
|
33
37
|
end
|
34
|
-
|
38
|
+
|
35
39
|
unless options[:secret_key]
|
36
40
|
config[:secret_key] = ask("Secret Key:", :magenta)
|
37
41
|
end
|
38
|
-
|
42
|
+
|
39
43
|
if env
|
40
44
|
config = {env => config}
|
41
45
|
config[:default] = env if options[:default]
|
42
46
|
end
|
43
|
-
|
47
|
+
|
44
48
|
if File.exists? options[:config_file]
|
45
49
|
old_config = parse_config_file
|
46
50
|
if !env || old_config.has_key?(env)
|
@@ -72,10 +76,10 @@ class Environment < CloudstackCli::Base
|
|
72
76
|
if config.keys.select { |key| !key.is_a? Symbol}.size == 0
|
73
77
|
exit unless yes?("Do you really want to delete environment #{env}? [y/N]", :yellow)
|
74
78
|
File.delete(options[:config_file])
|
75
|
-
say "OK.", :green
|
79
|
+
say "OK.", :green
|
76
80
|
exit
|
77
81
|
end
|
78
|
-
elsif config.delete(env)
|
82
|
+
elsif config.delete(env)
|
79
83
|
else
|
80
84
|
say "Environment #{env} does not exist.", :red
|
81
85
|
exit 1
|
@@ -89,7 +93,7 @@ class Environment < CloudstackCli::Base
|
|
89
93
|
desc "default [ENV]", "show or set the default environment"
|
90
94
|
def default(env = nil)
|
91
95
|
config = parse_config_file
|
92
|
-
|
96
|
+
|
93
97
|
unless env
|
94
98
|
default_env = config[:default] || '-'
|
95
99
|
say "The current default environment is \"#{default_env}\""
|
@@ -137,4 +141,4 @@ class Environment < CloudstackCli::Base
|
|
137
141
|
|
138
142
|
end
|
139
143
|
|
140
|
-
end
|
144
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
class InfrastructureStack < CloudstackCli::Base
|
2
|
+
|
3
|
+
desc "create STACKFILE", "create a infrastructure stack"
|
4
|
+
def create(stackfile)
|
5
|
+
puts stack = parse_file(stackfile)
|
6
|
+
say "Create '#{stack["name"]}' infrastructure stack...", :green
|
7
|
+
|
8
|
+
create_domains(stack['domains'])
|
9
|
+
|
10
|
+
say "Finished.", :green
|
11
|
+
end
|
12
|
+
|
13
|
+
desc "destroy STACKFILE", "destroy a infrastructure stack"
|
14
|
+
def destroy(stackfile)
|
15
|
+
|
16
|
+
end
|
17
|
+
|
18
|
+
no_commands do
|
19
|
+
def create_domains(domains)
|
20
|
+
domains.each do |domain|
|
21
|
+
puts domain
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
File without changes
|
@@ -99,7 +99,10 @@ module CloudstackCli
|
|
99
99
|
|
100
100
|
def resolve_iso(options = options)
|
101
101
|
if options[:iso]
|
102
|
-
unless iso = client.list_isos(
|
102
|
+
unless iso = client.list_isos(
|
103
|
+
name: options[:iso],
|
104
|
+
project_id: options[:project_id]
|
105
|
+
).first
|
103
106
|
say "Error: Iso '#{args[:iso]}' is invalid.", :red
|
104
107
|
exit 1
|
105
108
|
end
|
@@ -115,7 +118,11 @@ module CloudstackCli
|
|
115
118
|
|
116
119
|
def resolve_template(options = options)
|
117
120
|
if options[:template]
|
118
|
-
if template = client.list_templates(
|
121
|
+
if template = client.list_templates(
|
122
|
+
name: options[:template],
|
123
|
+
template_filter: "executable",
|
124
|
+
project_id: options[:project_id]
|
125
|
+
).first
|
119
126
|
options[:template_id] = template['id']
|
120
127
|
else
|
121
128
|
say "Error: Template #{options[:template]} not found.", :red
|
@@ -0,0 +1,36 @@
|
|
1
|
+
name: Test Infrastructure Stack
|
2
|
+
description: "Web Application Stack"
|
3
|
+
version: "1.0"
|
4
|
+
domains:
|
5
|
+
- name: Testdomain
|
6
|
+
network_domain: test.io
|
7
|
+
- name: Subdomain
|
8
|
+
network_domain: sub.test.io
|
9
|
+
parent_domain: Testdomain
|
10
|
+
accounts:
|
11
|
+
-
|
12
|
+
-
|
13
|
+
users:
|
14
|
+
-
|
15
|
+
-
|
16
|
+
projects:
|
17
|
+
-
|
18
|
+
-
|
19
|
+
compute_offerings:
|
20
|
+
-
|
21
|
+
-
|
22
|
+
network_offerings:
|
23
|
+
-
|
24
|
+
-
|
25
|
+
networks:
|
26
|
+
-
|
27
|
+
-
|
28
|
+
port_rules:
|
29
|
+
-
|
30
|
+
-
|
31
|
+
load_balancing_rules:
|
32
|
+
-
|
33
|
+
-
|
34
|
+
resource_limits:
|
35
|
+
-
|
36
|
+
-
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cloudstack-cli
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.0.
|
4
|
+
version: 1.0.0.rc2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nik Wolfgramm
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-05-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rdoc
|
@@ -58,14 +58,14 @@ dependencies:
|
|
58
58
|
requirements:
|
59
59
|
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: 1.0.
|
61
|
+
version: 1.0.2
|
62
62
|
type: :runtime
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: 1.0.
|
68
|
+
version: 1.0.2
|
69
69
|
description: cloudstack-cli is a CloudStack API command line client written in Ruby.
|
70
70
|
email:
|
71
71
|
- nik.wolfgramm@gmail.com
|
@@ -98,6 +98,7 @@ files:
|
|
98
98
|
- lib/cloudstack-cli/commands/domain.rb
|
99
99
|
- lib/cloudstack-cli/commands/environment.rb
|
100
100
|
- lib/cloudstack-cli/commands/host.rb
|
101
|
+
- lib/cloudstack-cli/commands/infrastructure_stack.rb
|
101
102
|
- lib/cloudstack-cli/commands/ip_address.rb
|
102
103
|
- lib/cloudstack-cli/commands/iso.rb
|
103
104
|
- lib/cloudstack-cli/commands/job.rb
|
@@ -111,7 +112,7 @@ files:
|
|
111
112
|
- lib/cloudstack-cli/commands/resource_limit.rb
|
112
113
|
- lib/cloudstack-cli/commands/router.rb
|
113
114
|
- lib/cloudstack-cli/commands/snapshot.rb
|
114
|
-
- lib/cloudstack-cli/commands/
|
115
|
+
- lib/cloudstack-cli/commands/ssh_key_pair.rb
|
115
116
|
- lib/cloudstack-cli/commands/stack.rb
|
116
117
|
- lib/cloudstack-cli/commands/storage_pool.rb
|
117
118
|
- lib/cloudstack-cli/commands/system_vm.rb
|
@@ -123,6 +124,7 @@ files:
|
|
123
124
|
- lib/cloudstack-cli/helper.rb
|
124
125
|
- lib/cloudstack-cli/option_resolver.rb
|
125
126
|
- lib/cloudstack-cli/version.rb
|
127
|
+
- test/infrastructure_stack.yaml
|
126
128
|
- test/stack_example.json
|
127
129
|
- test/stack_example.yml
|
128
130
|
homepage: http://github.com/niwo/cloudstack-cli
|
@@ -152,5 +154,6 @@ signing_key:
|
|
152
154
|
specification_version: 4
|
153
155
|
summary: cloudstack-cli CloudStack API client
|
154
156
|
test_files:
|
157
|
+
- test/infrastructure_stack.yaml
|
155
158
|
- test/stack_example.json
|
156
159
|
- test/stack_example.yml
|