udn 0.3.23.0.pre

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.
Files changed (43) hide show
  1. data/LICENSE +24 -0
  2. data/README.md +113 -0
  3. data/Rakefile +101 -0
  4. data/bin/udn +6 -0
  5. data/caldecott_helper/Gemfile +10 -0
  6. data/caldecott_helper/Gemfile.lock +48 -0
  7. data/caldecott_helper/server.rb +43 -0
  8. data/config/clients.yml +17 -0
  9. data/config/micro/offline.conf +2 -0
  10. data/config/micro/paths.yml +22 -0
  11. data/config/micro/refresh_ip.rb +20 -0
  12. data/lib/cli.rb +47 -0
  13. data/lib/cli/commands/admin.rb +80 -0
  14. data/lib/cli/commands/apps.rb +1129 -0
  15. data/lib/cli/commands/base.rb +228 -0
  16. data/lib/cli/commands/manifest.rb +56 -0
  17. data/lib/cli/commands/micro.rb +115 -0
  18. data/lib/cli/commands/misc.rb +129 -0
  19. data/lib/cli/commands/services.rb +259 -0
  20. data/lib/cli/commands/user.rb +65 -0
  21. data/lib/cli/config.rb +173 -0
  22. data/lib/cli/console_helper.rb +170 -0
  23. data/lib/cli/core_ext.rb +122 -0
  24. data/lib/cli/errors.rb +19 -0
  25. data/lib/cli/frameworks.rb +266 -0
  26. data/lib/cli/manifest_helper.rb +323 -0
  27. data/lib/cli/runner.rb +556 -0
  28. data/lib/cli/services_helper.rb +109 -0
  29. data/lib/cli/tunnel_helper.rb +332 -0
  30. data/lib/cli/usage.rb +124 -0
  31. data/lib/cli/version.rb +7 -0
  32. data/lib/cli/zip_util.rb +77 -0
  33. data/lib/vmc.rb +3 -0
  34. data/lib/vmc/client.rb +562 -0
  35. data/lib/vmc/const.rb +23 -0
  36. data/lib/vmc/micro.rb +56 -0
  37. data/lib/vmc/micro/switcher/base.rb +97 -0
  38. data/lib/vmc/micro/switcher/darwin.rb +19 -0
  39. data/lib/vmc/micro/switcher/dummy.rb +15 -0
  40. data/lib/vmc/micro/switcher/linux.rb +16 -0
  41. data/lib/vmc/micro/switcher/windows.rb +31 -0
  42. data/lib/vmc/micro/vmrun.rb +168 -0
  43. metadata +310 -0
data/lib/vmc/const.rb ADDED
@@ -0,0 +1,23 @@
1
+ module VMC
2
+
3
+ # This is the internal VMC version number, and is not necessarily
4
+ # the same as the RubyGem version (VMC::Cli::VERSION).
5
+ VERSION = '0.3.2'
6
+
7
+ # Targets
8
+ DEFAULT_TARGET = 'https://api.cloudfoundry.com'
9
+ DEFAULT_LOCAL_TARGET = 'http://api.vcap.me'
10
+
11
+ # General Paths
12
+ INFO_PATH = 'info'
13
+ GLOBAL_SERVICES_PATH = ['info', 'services']
14
+ EXTERNAL_SERVICES_PATH = ['external_services']
15
+ GLOBAL_RUNTIMES_PATH = ['info', 'runtimes']
16
+ RESOURCES_PATH = 'resources'
17
+
18
+ # User specific paths
19
+ APPS_PATH = 'apps'
20
+ SERVICES_PATH = 'services'
21
+ USERS_PATH = 'users'
22
+
23
+ end
data/lib/vmc/micro.rb ADDED
@@ -0,0 +1,56 @@
1
+ require 'find'
2
+
3
+ module VMC::Micro
4
+ def config_file(file)
5
+ File.join(File.dirname(__FILE__), '..', '..', 'config', 'micro', file)
6
+ end
7
+
8
+ def escape_path(path)
9
+ path = File.expand_path(path)
10
+ if RUBY_PLATFORM =~ /mingw|mswin32|cygwin/
11
+ if path.include?(' ')
12
+ return '"' + path + '"'
13
+ else
14
+ return path
15
+ end
16
+ else
17
+ return path.gsub(' ', '\ ')
18
+ end
19
+ end
20
+
21
+ def locate_file(file, directory, search_paths)
22
+ search_paths.each do |path|
23
+ expanded_path = File.expand_path(path)
24
+ if File.exists?(expanded_path)
25
+ Find.find(expanded_path) do |current|
26
+ if File.directory?(current) && current.include?(directory)
27
+ full_path = File.join(current, file)
28
+ return self.escape_path(full_path) if File.exists?(full_path)
29
+ end
30
+ end
31
+ end
32
+ end
33
+
34
+ false
35
+ end
36
+
37
+ def run_command(command, args=nil)
38
+ # TODO switch to using posix-spawn instead
39
+ result = %x{#{command} #{args} 2>&1}
40
+ unless $?.exitstatus == 0
41
+ if block_given?
42
+ yield
43
+ else
44
+ raise "failed to execute #{command} #{args}:\n#{result}"
45
+ end
46
+ else
47
+ result.split(/\n/)
48
+ end
49
+ end
50
+
51
+ module_function :config_file
52
+ module_function :escape_path
53
+ module_function :locate_file
54
+ module_function :run_command
55
+
56
+ end
@@ -0,0 +1,97 @@
1
+ require 'interact'
2
+
3
+ module VMC::Micro::Switcher
4
+ class Base
5
+ include Interactive
6
+
7
+ def initialize(config)
8
+ @config = config
9
+
10
+ @vmrun = VMC::Micro::VMrun.new(config)
11
+ unless @vmrun.running?
12
+ if ask("Micro Cloud Foundry VM is not running. Do you want to start it?", :choices => ['y', 'n']) == 'y'
13
+ display "Starting Micro Cloud Foundry VM: ", false
14
+ @vmrun.start
15
+ say "done".green
16
+ else
17
+ err "Micro Cloud Foundry VM needs to be running."
18
+ end
19
+ end
20
+
21
+ err "Micro Cloud Foundry VM initial setup needs to be completed before using 'vmc micro'" unless @vmrun.ready?
22
+ end
23
+
24
+ def offline
25
+ unless @vmrun.offline?
26
+ # save online connection type so we can restore it later
27
+ @config['online_connection_type'] = @vmrun.connection_type
28
+
29
+ if (@config['online_connection_type'] != 'nat')
30
+ if ask("Reconfigure Micro Cloud Foundry VM network to nat mode and reboot?", :choices => ['y', 'n']) == 'y'
31
+ display "Rebooting Micro Cloud Foundry VM: ", false
32
+ @vmrun.connection_type = 'nat'
33
+ @vmrun.reset
34
+ say "done".green
35
+ else
36
+ err "Aborted"
37
+ end
38
+ end
39
+
40
+ display "Setting Micro Cloud Foundry VM to offline mode: ", false
41
+ @vmrun.offline!
42
+ say "done".green
43
+ display "Setting host DNS server: ", false
44
+
45
+ @config['domain'] = @vmrun.domain
46
+ @config['ip'] = @vmrun.ip
47
+ set_nameserver(@config['domain'], @config['ip'])
48
+ say "done".green
49
+ else
50
+ say "Micro Cloud Foundry VM already in offline mode".yellow
51
+ end
52
+ end
53
+
54
+ def online
55
+ if @vmrun.offline?
56
+ current_connection_type = @vmrun.connection_type
57
+ @config['online_connection_type'] ||= current_connection_type
58
+
59
+ if (@config['online_connection_type'] != current_connection_type)
60
+ # TODO handle missing connection type in saved config
61
+ question = "Reconfigure Micro Cloud Foundry VM network to #{@config['online_connection_type']} mode and reboot?"
62
+ if ask(question, :choices => ['y', 'n']) == 'y'
63
+ display "Rebooting Micro Cloud Foundry VM: ", false
64
+ @vmrun.connection_type = @config['online_connection_type']
65
+ @vmrun.reset
66
+ say "done".green
67
+ else
68
+ err "Aborted"
69
+ end
70
+ end
71
+
72
+ display "Unsetting host DNS server: ", false
73
+ # TODO handle missing domain and ip in saved config (look at the VM)
74
+ @config['domain'] ||= @vmrun.domain
75
+ @config['ip'] ||= @vmrun.ip
76
+ unset_nameserver(@config['domain'], @config['ip'])
77
+ say "done".green
78
+
79
+ display "Setting Micro Cloud Foundry VM to online mode: ", false
80
+ @vmrun.online!
81
+ say "done".green
82
+ else
83
+ say "Micro Cloud Foundry already in online mode".yellow
84
+ end
85
+ end
86
+
87
+ def status
88
+ mode = @vmrun.offline? ? 'offline' : 'online'
89
+ say "Micro Cloud Foundry VM currently in #{mode.green} mode"
90
+ # should the VMX path be unescaped?
91
+ say "VMX Path: #{@vmrun.vmx}"
92
+ say "Domain: #{@vmrun.domain.green}"
93
+ say "IP Address: #{@vmrun.ip.green}"
94
+ end
95
+ end
96
+
97
+ end
@@ -0,0 +1,19 @@
1
+ module VMC::Micro::Switcher
2
+
3
+ class Darwin < Base
4
+ def adminrun(command)
5
+ VMC::Micro.run_command("osascript", "-e 'do shell script \"#{command}\" with administrator privileges'")
6
+ end
7
+
8
+ def set_nameserver(domain, ip)
9
+ File.open("/tmp/#{domain}", 'w') { |file| file.write("nameserver #{ip}") }
10
+ adminrun("mkdir -p /etc/resolver;mv /tmp/#{domain} /etc/resolver/")
11
+ end
12
+
13
+ def unset_nameserver(domain, ip)
14
+ err "domain missing" unless domain
15
+ adminrun("rm -f /etc/resolver/#{domain}")
16
+ end
17
+ end
18
+
19
+ end
@@ -0,0 +1,15 @@
1
+ # only used for testing
2
+ module VMC::Micro::Switcher
3
+
4
+ class Dummy < Base
5
+ def adminrun(command)
6
+ end
7
+
8
+ def set_nameserver(domain, ip)
9
+ end
10
+
11
+ def unset_nameserver(domain, ip)
12
+ end
13
+ end
14
+
15
+ end
@@ -0,0 +1,16 @@
1
+ module VMC::Micro::Switcher
2
+
3
+ class Linux < Base
4
+ def set_nameserver(domain, ip)
5
+ VMC::Micro.run_command("sudo", "sed -i'.backup' '1 i nameserver #{ip}' /etc/resolv.conf")
6
+ # lock resolv.conf so Network Manager doesn't clear out the file when offline
7
+ VMC::Micro.run_command("sudo", "chattr +i /etc/resolv.conf")
8
+ end
9
+
10
+ def unset_nameserver(domain, ip)
11
+ VMC::Micro.run_command("sudo", "chattr -i /etc/resolv.conf")
12
+ VMC::Micro.run_command("sudo", "sed -i'.backup' '/#{ip}/d' /etc/resolv.conf")
13
+ end
14
+ end
15
+
16
+ end
@@ -0,0 +1,31 @@
1
+ module VMC::Micro::Switcher
2
+
3
+ class Windows < Base
4
+ def version?
5
+ VMC::Micro.run_command("cmd", "/c ver").to_s.scan(/\d+\.\d+/).first.to_f
6
+ end
7
+
8
+ def adminrun(command, args=nil)
9
+ if version? > 5.2
10
+ require 'win32ole'
11
+ shell = WIN32OLE.new("Shell.Application")
12
+ shell.ShellExecute(command, args, nil, "runas", 0)
13
+ else
14
+ # on older version this will try to run the command, and if you don't have
15
+ # admin privilges it will tell you so and exit
16
+ VMC::Micro.run_command(command, args)
17
+ end
18
+ end
19
+
20
+ # TODO better method to figure out the interface name is to get the NAT ip and find the
21
+ # interface with the correct subnet
22
+ def set_nameserver(domain, ip)
23
+ adminrun("netsh", "interface ip set dns \"VMware Network Adapter VMnet8\" static #{ip}")
24
+ end
25
+
26
+ def unset_nameserver(domain, ip)
27
+ adminrun("netsh", "interface ip set dns \"VMware Network Adapter VMnet8\" static none")
28
+ end
29
+ end
30
+
31
+ end
@@ -0,0 +1,168 @@
1
+ module VMC::Micro
2
+ class VMrun
3
+ attr_reader :vmx, :vmrun
4
+
5
+ def initialize(config)
6
+ @platform = config['platform']
7
+ @user = 'root' # must use root as we muck around with system settings
8
+ @password = config['password']
9
+ @vmrun = config['vmrun']
10
+ @vmx = config['vmx']
11
+
12
+ # TODO honor TMPDIR
13
+ if @platform == :windows
14
+ @temp_dir = ENV['temp']
15
+ else
16
+ @temp_dir = '/tmp'
17
+ end
18
+ end
19
+
20
+ def connection_type
21
+ read_variable('ethernet0.connectionType')
22
+ end
23
+
24
+ def connection_type=(type)
25
+ write_variable("ethernet0.connectionType", type)
26
+ end
27
+
28
+ def nat?
29
+ connection_type == "nat"
30
+ end
31
+
32
+ def bridged?
33
+ connection_type == "bridged"
34
+ end
35
+
36
+ def domain
37
+ # switch to Dir.mktmpdir
38
+ state_config = VMC::Micro.escape_path(File.join(@temp_dir, 'state.yml'))
39
+ run('CopyFileFromGuestToHost', "/var/vcap/bosh/state.yml #{state_config}")
40
+ bosh_config = YAML.load_file(state_config)
41
+ bosh_config['properties']['domain']
42
+ end
43
+
44
+ def ip
45
+ # switch to Dir.mktmpdir
46
+ path = VMC::Micro.escape_path(VMC::Micro.config_file('refresh_ip.rb'))
47
+ ip_file = VMC::Micro.escape_path(File.join(@temp_dir, 'ip.txt'))
48
+ run('CopyFileFromHostToGuest', "#{path} /tmp/refresh_ip.rb")
49
+ run('runProgramInGuest', '/tmp/refresh_ip.rb')
50
+ run('CopyFileFromGuestToHost', "/tmp/ip.txt #{ip_file}")
51
+ File.open(ip_file, 'r') { |file| file.read }
52
+ end
53
+
54
+ def list
55
+ vms = run("list")
56
+ vms.delete_if { |line| line =~ /^Total/ }
57
+ vms.map { |line| VMC::Micro.escape_path(File.expand_path(line)) }
58
+ end
59
+
60
+ def offline?
61
+ command = "-gu #{@user} -gp #{@password} runProgramInGuest"
62
+ args = '/usr/bin/test -e /var/vcap/micro/offline'
63
+ # why not use run_command?
64
+ result = %x{#{@vmrun} #{command} #{@vmx} #{args}}
65
+
66
+ if result.include?('Guest program exited with non-zero exit code: 1')
67
+ return false
68
+ elsif $?.exitstatus == 0
69
+ return true
70
+ else
71
+ raise "failed to execute vmrun:\n#{result}"
72
+ end
73
+ end
74
+
75
+ def offline!
76
+ path = VMC::Micro.escape_path(VMC::Micro.config_file('offline.conf'))
77
+ run('CopyFileFromHostToGuest', "#{path} /etc/dnsmasq.d/offline.conf")
78
+ run('runProgramInGuest', '/usr/bin/touch /var/vcap/micro/offline')
79
+ run('runProgramInGuest',
80
+ "/bin/sed -i -e 's/^[^#]/# &/g' /etc/dnsmasq.d/server || true")
81
+ restart_dnsmasq
82
+ end
83
+
84
+ def online!
85
+ run('runProgramInGuest', '/bin/rm -f /etc/dnsmasq.d/offline.conf')
86
+ run('runProgramInGuest', '/bin/rm -f /var/vcap/micro/offline')
87
+ run('runProgramInGuest',
88
+ "/bin/sed -i -e 's/^# //g' /etc/dnsmasq.d/server || true")
89
+ restart_dnsmasq
90
+ end
91
+
92
+ # check to see if the micro cloud has been configured
93
+ # uses default password to check
94
+ def ready?
95
+ command = "-gu root -gp 'ca$hc0w' runProgramInGuest"
96
+ args = '/usr/bin/test -e /var/vcap/micro/micro.json'
97
+ result = %x{#{@vmrun} #{command} #{@vmx} #{args}}
98
+
99
+ if result.include?('Invalid user name or password for the guest OS') || $?.exitstatus == 0
100
+ return true
101
+ elsif $?.exitstatus == 1
102
+ return false
103
+ else
104
+ raise "failed to execute vmrun:\n#{result}"
105
+ end
106
+ end
107
+
108
+ def read_variable(var)
109
+ # TODO deal with non-ok return
110
+ run("readVariable", "runtimeConfig #{var}").first
111
+ end
112
+
113
+ def write_variable(var, value)
114
+ run('writeVariable', "runtimeConfig #{var} #{value}")
115
+ end
116
+
117
+ def reset
118
+ run('reset', 'soft')
119
+ end
120
+
121
+ def restart_dnsmasq
122
+ # restart command doesn't always work, start and stop seems to be more reliable
123
+ run('runProgramInGuest', '/etc/init.d/dnsmasq stop')
124
+ run('runProgramInGuest', '/etc/init.d/dnsmasq start')
125
+ end
126
+
127
+ def run(command, args=nil)
128
+ if command.include?('Guest')
129
+ command = "-gu #{@user} -gp #{@password} #{command}"
130
+ end
131
+ VMC::Micro.run_command(@vmrun, "#{command} #{@vmx} #{args}")
132
+ end
133
+
134
+ def running?
135
+ vms = list
136
+ if @platform == :windows
137
+ vms.map! { |x| x.downcase }
138
+ vms.include?(@vmx.downcase)
139
+ else
140
+ # Handle vmx being in a symlinked dir.
141
+ real_path = nil
142
+ begin
143
+ real_path = File.realpath(@vmx)
144
+ rescue
145
+ end
146
+ vms.include?(@vmx) || (real_path && vms.include?(real_path))
147
+ end
148
+ end
149
+
150
+ def start
151
+ run('start') unless running?
152
+ end
153
+
154
+ def stop
155
+ run('stop') if running?
156
+ end
157
+
158
+ def self.locate(platform)
159
+ paths = YAML.load_file(VMC::Micro.config_file('paths.yml'))
160
+ vmrun_paths = paths[platform.to_s]['vmrun']
161
+ vmrun_exe = @platform == :windows ? 'vmrun.exe' : 'vmrun'
162
+ vmrun = VMC::Micro.locate_file(vmrun_exe, "VMware", vmrun_paths)
163
+ err "Unable to locate vmrun, please supply --vmrun option" unless vmrun
164
+ vmrun
165
+ end
166
+ end
167
+
168
+ end
metadata ADDED
@@ -0,0 +1,310 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: udn
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.3.23.0.pre
5
+ prerelease: 9
6
+ platform: ruby
7
+ authors:
8
+ - NTT Communications
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-06-11 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: json_pure
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: 1.5.1
22
+ - - <
23
+ - !ruby/object:Gem::Version
24
+ version: 1.7.0
25
+ type: :runtime
26
+ prerelease: false
27
+ version_requirements: !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: 1.5.1
33
+ - - <
34
+ - !ruby/object:Gem::Version
35
+ version: 1.7.0
36
+ - !ruby/object:Gem::Dependency
37
+ name: rubyzip
38
+ requirement: !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ~>
42
+ - !ruby/object:Gem::Version
43
+ version: 0.9.4
44
+ type: :runtime
45
+ prerelease: false
46
+ version_requirements: !ruby/object:Gem::Requirement
47
+ none: false
48
+ requirements:
49
+ - - ~>
50
+ - !ruby/object:Gem::Version
51
+ version: 0.9.4
52
+ - !ruby/object:Gem::Dependency
53
+ name: rest-client
54
+ requirement: !ruby/object:Gem::Requirement
55
+ none: false
56
+ requirements:
57
+ - - ! '>='
58
+ - !ruby/object:Gem::Version
59
+ version: 1.6.1
60
+ - - <
61
+ - !ruby/object:Gem::Version
62
+ version: 1.7.0
63
+ type: :runtime
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ none: false
67
+ requirements:
68
+ - - ! '>='
69
+ - !ruby/object:Gem::Version
70
+ version: 1.6.1
71
+ - - <
72
+ - !ruby/object:Gem::Version
73
+ version: 1.7.0
74
+ - !ruby/object:Gem::Dependency
75
+ name: terminal-table
76
+ requirement: !ruby/object:Gem::Requirement
77
+ none: false
78
+ requirements:
79
+ - - ~>
80
+ - !ruby/object:Gem::Version
81
+ version: 1.4.2
82
+ type: :runtime
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ none: false
86
+ requirements:
87
+ - - ~>
88
+ - !ruby/object:Gem::Version
89
+ version: 1.4.2
90
+ - !ruby/object:Gem::Dependency
91
+ name: interact
92
+ requirement: !ruby/object:Gem::Requirement
93
+ none: false
94
+ requirements:
95
+ - - ~>
96
+ - !ruby/object:Gem::Version
97
+ version: 0.4.0
98
+ type: :runtime
99
+ prerelease: false
100
+ version_requirements: !ruby/object:Gem::Requirement
101
+ none: false
102
+ requirements:
103
+ - - ~>
104
+ - !ruby/object:Gem::Version
105
+ version: 0.4.0
106
+ - !ruby/object:Gem::Dependency
107
+ name: addressable
108
+ requirement: !ruby/object:Gem::Requirement
109
+ none: false
110
+ requirements:
111
+ - - ~>
112
+ - !ruby/object:Gem::Version
113
+ version: 2.2.6
114
+ type: :runtime
115
+ prerelease: false
116
+ version_requirements: !ruby/object:Gem::Requirement
117
+ none: false
118
+ requirements:
119
+ - - ~>
120
+ - !ruby/object:Gem::Version
121
+ version: 2.2.6
122
+ - !ruby/object:Gem::Dependency
123
+ name: uuidtools
124
+ requirement: !ruby/object:Gem::Requirement
125
+ none: false
126
+ requirements:
127
+ - - ~>
128
+ - !ruby/object:Gem::Version
129
+ version: 2.1.0
130
+ type: :runtime
131
+ prerelease: false
132
+ version_requirements: !ruby/object:Gem::Requirement
133
+ none: false
134
+ requirements:
135
+ - - ~>
136
+ - !ruby/object:Gem::Version
137
+ version: 2.1.0
138
+ - !ruby/object:Gem::Dependency
139
+ name: rb-readline
140
+ requirement: !ruby/object:Gem::Requirement
141
+ none: false
142
+ requirements:
143
+ - - ~>
144
+ - !ruby/object:Gem::Version
145
+ version: 0.4.2
146
+ type: :runtime
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ none: false
150
+ requirements:
151
+ - - ~>
152
+ - !ruby/object:Gem::Version
153
+ version: 0.4.2
154
+ - !ruby/object:Gem::Dependency
155
+ name: rake
156
+ requirement: !ruby/object:Gem::Requirement
157
+ none: false
158
+ requirements:
159
+ - - ! '>='
160
+ - !ruby/object:Gem::Version
161
+ version: '0'
162
+ type: :development
163
+ prerelease: false
164
+ version_requirements: !ruby/object:Gem::Requirement
165
+ none: false
166
+ requirements:
167
+ - - ! '>='
168
+ - !ruby/object:Gem::Version
169
+ version: '0'
170
+ - !ruby/object:Gem::Dependency
171
+ name: rspec
172
+ requirement: !ruby/object:Gem::Requirement
173
+ none: false
174
+ requirements:
175
+ - - ~>
176
+ - !ruby/object:Gem::Version
177
+ version: 1.3.0
178
+ type: :development
179
+ prerelease: false
180
+ version_requirements: !ruby/object:Gem::Requirement
181
+ none: false
182
+ requirements:
183
+ - - ~>
184
+ - !ruby/object:Gem::Version
185
+ version: 1.3.0
186
+ - !ruby/object:Gem::Dependency
187
+ name: webmock
188
+ requirement: !ruby/object:Gem::Requirement
189
+ none: false
190
+ requirements:
191
+ - - ~>
192
+ - !ruby/object:Gem::Version
193
+ version: 1.5.0
194
+ type: :development
195
+ prerelease: false
196
+ version_requirements: !ruby/object:Gem::Requirement
197
+ none: false
198
+ requirements:
199
+ - - ~>
200
+ - !ruby/object:Gem::Version
201
+ version: 1.5.0
202
+ - !ruby/object:Gem::Dependency
203
+ name: simplecov
204
+ requirement: !ruby/object:Gem::Requirement
205
+ none: false
206
+ requirements:
207
+ - - ! '>='
208
+ - !ruby/object:Gem::Version
209
+ version: '0'
210
+ type: :development
211
+ prerelease: false
212
+ version_requirements: !ruby/object:Gem::Requirement
213
+ none: false
214
+ requirements:
215
+ - - ! '>='
216
+ - !ruby/object:Gem::Version
217
+ version: '0'
218
+ - !ruby/object:Gem::Dependency
219
+ name: simplecov-rcov
220
+ requirement: !ruby/object:Gem::Requirement
221
+ none: false
222
+ requirements:
223
+ - - ! '>='
224
+ - !ruby/object:Gem::Version
225
+ version: '0'
226
+ type: :development
227
+ prerelease: false
228
+ version_requirements: !ruby/object:Gem::Requirement
229
+ none: false
230
+ requirements:
231
+ - - ! '>='
232
+ - !ruby/object:Gem::Version
233
+ version: '0'
234
+ description: Client library and CLI for Cloudn PaaS
235
+ email: rainbow-paas-core-cl@ntt.com
236
+ executables:
237
+ - udn
238
+ extensions: []
239
+ extra_rdoc_files:
240
+ - README.md
241
+ - LICENSE
242
+ files:
243
+ - LICENSE
244
+ - README.md
245
+ - Rakefile
246
+ - config/clients.yml
247
+ - config/micro/offline.conf
248
+ - config/micro/paths.yml
249
+ - config/micro/refresh_ip.rb
250
+ - lib/cli/commands/admin.rb
251
+ - lib/cli/commands/apps.rb
252
+ - lib/cli/commands/base.rb
253
+ - lib/cli/commands/manifest.rb
254
+ - lib/cli/commands/micro.rb
255
+ - lib/cli/commands/misc.rb
256
+ - lib/cli/commands/services.rb
257
+ - lib/cli/commands/user.rb
258
+ - lib/cli/config.rb
259
+ - lib/cli/console_helper.rb
260
+ - lib/cli/core_ext.rb
261
+ - lib/cli/errors.rb
262
+ - lib/cli/frameworks.rb
263
+ - lib/cli/manifest_helper.rb
264
+ - lib/cli/runner.rb
265
+ - lib/cli/services_helper.rb
266
+ - lib/cli/tunnel_helper.rb
267
+ - lib/cli/usage.rb
268
+ - lib/cli/version.rb
269
+ - lib/cli/zip_util.rb
270
+ - lib/cli.rb
271
+ - lib/vmc/client.rb
272
+ - lib/vmc/const.rb
273
+ - lib/vmc/micro/switcher/base.rb
274
+ - lib/vmc/micro/switcher/darwin.rb
275
+ - lib/vmc/micro/switcher/dummy.rb
276
+ - lib/vmc/micro/switcher/linux.rb
277
+ - lib/vmc/micro/switcher/windows.rb
278
+ - lib/vmc/micro/vmrun.rb
279
+ - lib/vmc/micro.rb
280
+ - lib/vmc.rb
281
+ - caldecott_helper/Gemfile
282
+ - caldecott_helper/Gemfile.lock
283
+ - caldecott_helper/server.rb
284
+ - bin/udn
285
+ homepage: http://www.ntt.com/cloudn/data/paas.html
286
+ licenses: []
287
+ post_install_message:
288
+ rdoc_options: []
289
+ require_paths:
290
+ - lib
291
+ required_ruby_version: !ruby/object:Gem::Requirement
292
+ none: false
293
+ requirements:
294
+ - - ! '>='
295
+ - !ruby/object:Gem::Version
296
+ version: '0'
297
+ required_rubygems_version: !ruby/object:Gem::Requirement
298
+ none: false
299
+ requirements:
300
+ - - ! '>'
301
+ - !ruby/object:Gem::Version
302
+ version: 1.3.1
303
+ requirements: []
304
+ rubyforge_project:
305
+ rubygems_version: 1.8.23
306
+ signing_key:
307
+ specification_version: 3
308
+ summary: Client library and CLI for Cloudn PaaS
309
+ test_files: []
310
+ has_rdoc: