vmc_knife 0.0.8 → 0.0.9

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/README.md CHANGED
@@ -11,4 +11,163 @@ Run the deployment file via a web-interface.
11
11
  prepare a vmc deployment file.
12
12
  vmc_knife vmc_deployment_file.json
13
13
 
14
+ ## Installation
15
+ ssh into a Cloudfoundry VM
16
+ load the cloudfoundry profile and install the gem:
14
17
 
18
+ source /home/ubuntu/.cloudfoundry_deployment_local
19
+ gem install vmc_knife
20
+
21
+ Or to install from source:
22
+
23
+ git clone https://github.com/hmalphettes/vmc-knife.git
24
+ cd vmc-knife
25
+ gem build vmc_knife.gemspec
26
+ gem install vmc_knife
27
+
28
+ ## Example:
29
+ Create a recipe with the mongodb app example and the sinatra example app.
30
+
31
+ Make a new file example_recipe.json
32
+
33
+ Enter:
34
+
35
+ {
36
+ "sub_domain": "vcap.me",
37
+ "target": "api.vcap.me",
38
+ "email": "vcap@vcap.me",
39
+ "password": "vcap",
40
+ "recipes": [
41
+ {
42
+ "name": "example_recipe",
43
+ "data_services": {
44
+ "mongo1": {
45
+ "name": "a_mongo",
46
+ "vendor": "mongodb"
47
+ }
48
+ },
49
+ "applications": {
50
+ "example_mongo": {
51
+ "name": "mongo_db_demo",
52
+ "uris": [
53
+ "mongodb-on-cf-demo.#{this['sub_domain']}"
54
+ ],
55
+ "staging": {
56
+ "stack": "ruby19",
57
+ "model": "rails3"
58
+ },
59
+ "resources": {
60
+ "memory": 256
61
+ },
62
+ "services": [
63
+ "#{this['recipes'][0]['data_services']['mongo1']['name']}"
64
+ ],
65
+ "env": [
66
+ "DERIVED_VALUE_EXAMPLE=http://#{this['recipes'][0]['applications']['example_mongo']['uris'][0]}"
67
+ ],
68
+ "repository": {
69
+ "url": "https://github.com/mccrory/cloud-foundry-mongodb-demo.git",
70
+ "branch":"master"
71
+ }
72
+ }
73
+ }
74
+ }
75
+ ]
76
+ }
77
+
78
+ Navigate to the folder where the recipe is located.
79
+ And use vmc_knife:
80
+
81
+ vmc_knife login
82
+ vmc_knife configure-apps
83
+ vmc_knife upload-apps
84
+ vmc_knife start-apps
85
+
86
+ The console will look like this:
87
+
88
+ ubuntu@ubuntu:~/tmp$ vmc_knife configure-apps
89
+ Applications selected mongo_db_demo
90
+ Data-services selected a_mongo
91
+ {
92
+ "applications": {
93
+ "mongo_db_demo": {
94
+ "name": "Create mongo_db_demo",
95
+ "services": {
96
+ "add": [
97
+ "a_mongo"
98
+ ]
99
+ },
100
+ "env": {
101
+ "add": [
102
+ "DERIVED_VALUE_EXAMPLE=http://mongodb-on-cf-demo.vcap.me"
103
+ ]
104
+ },
105
+ "uris": {
106
+ "add": [
107
+ "mongodb-on-cf-demo.vcap.me"
108
+ ]
109
+ },
110
+ "memory": " => 256"
111
+ }
112
+ }
113
+ }
114
+ Creating mongo_db_demo with {:name=>"mongo_db_demo", "resources"=>{"memory"=>256}, "staging"=>{"model"=>"rails3", "stack"=>"ruby19"}, "uris"=>["mongodb-on-cf-demo.vcap.me"], "services"=>["a_mongo"], "env"=>["DERIVED_VALUE_EXAMPLE=http://mongodb-on-cf-demo.vcap.me"]}
115
+
116
+ ubuntu@ubuntu:~/tmp$ vmc_knife upload-apps
117
+ Applications selected mongo_db_demo
118
+ Data-services selected a_mongo
119
+ Dir.entries(/home/ubuntu/vmc_knife_downloads/mongo_db_demo).size 2
120
+ remote: Counting objects: 85, done.
121
+ remote: Compressing objects: 100% (65/65), done.
122
+ remote: Total 85 (delta 4), reused 84 (delta 4)
123
+ Unpacking objects: 100% (85/85), done.
124
+ fatal: Not a git repository (or any of the parent directories): .git
125
+ Uploading Application mongo_db_demo from /home/ubuntu/vmc_knife_downloads/mongo_db_demo:
126
+ Copying the files
127
+ Done copying the files
128
+ Checking for available resources: About to compute the fingerprints
129
+ Finished computing the fingerprints
130
+ Invoking check_resources with the fingerprints
131
+ OK
132
+ Processing resources: OK
133
+ Packing application: OK
134
+ Uploading (255K): client.upload_app about to start
135
+ Uploading (255K): OK
136
+ Done client.upload_app
137
+ Push Status: OK
138
+
139
+
140
+
141
+ ### Updating an app:
142
+
143
+ For example edit the memory parameter of the app. Then call:
144
+
145
+ vmc_knife configure-apps
146
+ vmc_knife restart-apps example_mongo
147
+
148
+ Note that vmc_knife's start/stop/restart only sends the command to vcap's cloud_controller.
149
+ It does not try to poll it to see if the command was successful.
150
+
151
+ Delete data-services and apps in the recipe:
152
+
153
+ vmc_knife delete-all
154
+
155
+
156
+ ### Accessing the data-services:
157
+ Assuming that vmc_knife is able to locate the cloud_controller.yml and mongo binary:
158
+
159
+ vmc_knife data-shell mongo1
160
+
161
+ will drop the user to the mongo shell:
162
+
163
+ ubuntu@ubuntu:~/tmp$ vmc_knife data-shell mongo1
164
+ Applications selected mongo_db_demo
165
+ Data-services selected a_mongo
166
+ Executing /home/ubuntu/cloudfoundry/.deployments/intalio_devbox/deploy/mongodb/bin/mongo -u 6e409825-31f6-4a47-8eef-11f49e763a9a -p 153c52d6-26ab-467b-9c1d-bc1b071a5c86 192.168.0.138:25001/db
167
+ MongoDB shell version: 1.8.1
168
+ connecting to: 192.168.0.138:25001/db
169
+ >
170
+
171
+ With postgresql export and import are supported.
172
+
173
+ Todo: take advantage of the new vmc-tunnel.
@@ -168,6 +168,14 @@ class VMC::Cli::KnifeRunner < VMC::Cli::Runner
168
168
  else
169
169
  set_cmd(:knifeapps, :data_drop, @args.size) # too many
170
170
  end
171
+ when 'data-shrink'
172
+ usage('vmc_knife data-shrink [<data-service-name>] [<tables-collection-regexp>]')
173
+ @args.shift # consumes the argument.
174
+ if @args.size <= 3
175
+ set_cmd(:knifeapps, :data_shrink, @args.size)
176
+ else
177
+ set_cmd(:knifeapps, :data_shrink, @args.size) # too many
178
+ end
171
179
  when 'data-import'
172
180
  usage('vmc_knife data-import [<data-service-name>] [<tables-collection-regexp>]')
173
181
  @args.shift # consumes the argument.
@@ -185,7 +193,7 @@ class VMC::Cli::KnifeRunner < VMC::Cli::Runner
185
193
  set_cmd(:knifeapps, :data_export, @args.size) # too many
186
194
  end
187
195
  when 'help'
188
- display "vmc_knife expand-manifest|login|start/stop/restart-apps|upload-apps|configure-all|configure-recipes|configure-apps|configure-services|delete-all|configure-vcap|configure-vcap-mdns|configure-vcap-etc-hosts|data-shell [<manifest_path>]"
196
+ display "vmc_knife expand-manifest|login|start/stop/restart-apps|upload-apps|configure-all|configure-recipes|configure-apps|configure-services|delete-all|configure-vcap|configure-vcap-mdns|configure-vcap-etc-hosts|data-shell|data-export/import/shrink/drop [<manifest_path>]"
189
197
  else
190
198
  super
191
199
  end
@@ -5,8 +5,10 @@ module VMC::KNIFE::Cli
5
5
  #loads the manifest file.
6
6
  #when the path is not specified, look in the current directory.
7
7
  #when the path is a directory, look for the first json file it can find.
8
+ #if it still find nothing then use the default which is the value of the environment variable VMC_KNIFE_DEFAULT_RECIPE
8
9
  #the json file actually loaded is set as the attribute @manifest_path
9
10
  def load_manifest(manifest_file_path=nil)
11
+ was_nil = true if manifest_file_path.nil?
10
12
  manifest_file_path = Dir.pwd if manifest_file_path.nil?
11
13
  if File.directory? manifest_file_path
12
14
  #look for the first .json file if possible that is not an expanded.json
@@ -17,7 +19,12 @@ module VMC::KNIFE::Cli
17
19
  end
18
20
  return VMC::KNIFE::JSON_EXPANDER.expand_json @manifest_path
19
21
  end
20
- raise "Unable to find a *.json file in #{manifest_file_path}"
22
+ if was_nil && !ENV['VMC_KNIFE_DEFAULT_RECIPE'].nil?
23
+ raise "Can't load the default recipe VMC_KNIFE_DEFAULT_RECIPE=#{ENV['VMC_KNIFE_DEFAULT_RECIPE']}" unless File.exists? ENV['VMC_KNIFE_DEFAULT_RECIPE']
24
+ load_manifest ENV['VMC_KNIFE_DEFAULT_RECIPE']
25
+ else
26
+ raise "Unable to find a *.json file in #{manifest_file_path}"
27
+ end
21
28
  else
22
29
  @manifest_path = manifest_file_path
23
30
  return VMC::KNIFE::JSON_EXPANDER.expand_json @manifest_path
@@ -171,10 +178,12 @@ module VMC::Cli::Command
171
178
  include VMC::KNIFE::Cli
172
179
 
173
180
  def configure_applications(app_names_regexp=nil,manifest_file_path=nil)
174
- configure(nil,nil,app_names_regexp,manifest_file_path)
181
+ configure(nil,nil,app_names_regexp,manifest_file_path,
182
+ {:apps_only=>true})
175
183
  end
176
184
  def configure_services(services_names_regexp=nil,manifest_file_path=nil)
177
- configure(nil,nil,services_names_regexp,manifest_file_path)
185
+ configure(nil,nil,services_names_regexp,manifest_file_path,
186
+ {:data_only=>true})
178
187
  end
179
188
  def configure_recipes(recipe_names_regexp=nil,manifest_file_path=nil)
180
189
  configure(recipe_names_regexp,nil,nil,manifest_file_path)
@@ -199,40 +208,51 @@ module VMC::Cli::Command
199
208
  end
200
209
 
201
210
  def upload_applications(app_names_regexp=nil,manifest_file_path=nil)
202
- recipe_configuror(:upload,nil,app_names_regexp,nil,manifest_file_path)
211
+ recipe_configuror(:upload,nil,app_names_regexp,nil,manifest_file_path,
212
+ {:apps_only=>true})
203
213
  end
204
214
  def start_applications(app_names_regexp=nil,manifest_file_path=nil)
205
- recipe_configuror(:start,nil,app_names_regexp,nil,manifest_file_path)
215
+ recipe_configuror(:start,nil,app_names_regexp,nil,manifest_file_path,
216
+ {:apps_only=>true})
206
217
  end
207
218
  def stop_applications(app_names_regexp=nil,manifest_file_path=nil)
208
- recipe_configuror(:stop,nil,app_names_regexp,nil,manifest_file_path)
219
+ recipe_configuror(:stop,nil,app_names_regexp,nil,manifest_file_path,
220
+ {:apps_only=>true})
209
221
  end
210
222
  def restart_applications(app_names_regexp=nil,manifest_file_path=nil)
211
- recipe_configuror(:restart,nil,app_names_regexp,nil,manifest_file_path)
223
+ recipe_configuror(:restart,nil,app_names_regexp,nil,manifest_file_path,
224
+ {:apps_only=>true})
212
225
  end
213
226
  def delete_all(app_names_regexp=nil,manifest_file_path=nil)
214
227
  recipe_configuror(:delete,nil,app_names_regexp,nil,manifest_file_path)
215
228
  end
216
229
  def data_shell(data_names_regexp=nil,manifest_file_path=nil)
217
- recipe_configuror(:shell,nil,nil,data_names_regexp,manifest_file_path)
230
+ recipe_configuror(:shell,nil,nil,data_names_regexp,manifest_file_path,
231
+ {:data_only=>true})
218
232
  end
219
233
  def data_credentials(data_names_regexp=nil,manifest_file_path=nil)
220
- recipe_configuror(:credentials,nil,nil,data_names_regexp,manifest_file_path)
234
+ recipe_configuror(:credentials,nil,nil,data_names_regexp,manifest_file_path,
235
+ {:data_only=>true})
221
236
  end
222
237
  def data_apply_privileges(data_names_regexp=nil,manifest_file_path=nil)
223
- recipe_configuror(:apply_privileges,nil,nil,data_names_regexp,manifest_file_path)
238
+ recipe_configuror(:apply_privileges,nil,nil,data_names_regexp,manifest_file_path,
239
+ {:data_only=>true})
224
240
  end
225
241
  def data_import(data_names_regexp=nil,app_name=nil,file_names=nil,manifest_file_path=nil)
226
242
  recipe_configuror(:import,nil,nil,data_names_regexp,manifest_file_path,
227
- {:file_names=>file_names, :app_name=>app_name})
243
+ {:file_names=>file_names, :app_name=>app_name, :data_only=>true})
228
244
  end
229
245
  def data_export(data_names_regexp=nil,app_name=nil,file_names=nil,manifest_file_path=nil)
230
246
  recipe_configuror(:export,nil,nil,data_names_regexp,manifest_file_path,
231
- {:file_names=>file_names, :app_name=>app_name})
247
+ {:file_names=>file_names, :app_name=>app_name, :data_only=>true})
232
248
  end
233
249
  def data_drop(data_names_regexp=nil,collection_or_table_names=nil,manifest_file_path=nil)
234
250
  recipe_configuror(:drop,nil,nil,data_names_regexp,manifest_file_path,
235
- {:collection_or_table_names=>collection_or_table_names})
251
+ {:collection_or_table_names=>collection_or_table_names, :data_only=>true})
252
+ end
253
+ def data_shrink(data_names_regexp=nil,collection_or_table_names=nil,manifest_file_path=nil)
254
+ recipe_configuror(:shrink,nil,nil,data_names_regexp,manifest_file_path,
255
+ {:collection_or_table_names=>collection_or_table_names, :data_only=>true})
236
256
  end
237
257
 
238
258
  def recipe_configuror(method_sym_name,recipes_regexp=nil,app_names_regexp=nil,service_names_regexp=nil,manifest_file_path=nil,opts=nil)
@@ -2,6 +2,8 @@ require 'yaml'
2
2
  require "interact"
3
3
  require 'tempfile'
4
4
  require 'tmpdir'
5
+ require 'pathname'
6
+ require 'erb'
5
7
 
6
8
  module VMC
7
9
  module KNIFE
@@ -10,16 +12,21 @@ module VMC
10
12
  PSQL_RAW_RES_ARGS="-P format=unaligned -P footer=off -P tuples_only=on"
11
13
 
12
14
  # Reads the cloud_controller config file for the connection parameters to ccdb.
13
- def self.get_ccdb_credentials(ccdb_yml_path="#{ENV['HOME']}/cloudfoundry/config/cloud_controller.yml", db_type='production')
15
+ def self.get_ccdb_credentials(ccdb_yml_path="#{ENV['CLOUD_FOUNDRY_CONFIG_PATH']}/cloud_controller.yml", db_type='production')
14
16
  cc_conf = File.open( ccdb_yml_path ) do |yf| YAML::load( yf ) end
15
17
  db = cc_conf['database_environment'][db_type]
16
18
  db
17
19
  end
18
20
 
19
- def self.get_postgresql_node_credentials(postgresql_node_yml_path="#{ENV['HOME']}/cloudfoundry/config/postgresql_node.yml")
21
+ def self.get_postgresql_node_credentials(postgresql_node_yml_path="#{ENV['CLOUD_FOUNDRY_CONFIG_PATH']}/postgresql_node.yml")
20
22
  db = File.open( postgresql_node_yml_path ) do |yf| YAML::load( yf ) end
21
23
  db['postgresql']
22
24
  end
25
+
26
+ def self.get_mongodb_node_config(mongodb_node_yml_path="#{ENV['CLOUD_FOUNDRY_CONFIG_PATH']}/mongodb_node.yml")
27
+ db = File.open( mongodb_node_yml_path ) do |yf| YAML::load( yf ) end
28
+ db
29
+ end
23
30
 
24
31
  def self.get_app_id(app_name)
25
32
  db=get_ccdb_credentials()
@@ -96,21 +103,31 @@ module VMC
96
103
  end
97
104
 
98
105
  # command_files or command.
99
- def self.data_service_console(credentials_hash, commands_file="",as_admin=false)
106
+ def self.data_service_console(credentials_hash, commands_file="",as_admin=false,exec_name=nil)
100
107
  if credentials_hash['db'] #so far it has always been equal to 'db'
101
108
  # It is a mongo service
102
109
  #/home/ubuntu/cloudfoundry/.deployments/intalio_devbox/deploy/mongodb/bin/mongo 127.0.0.1:25003/db
103
110
  #-u c417f26c-6f49-4dd5-a208-216107279c7a -p 8ab08355-6509-48d5-974f-27c853b842f5
104
111
  # Todo: compute the mongoshell path (?)
105
- mongo_shell=find_mongo_exec()
106
- cmd = "#{mongo_shell} -u #{credentials_hash['username']} -p #{credentials_hash['password']} #{credentials_hash['hostname']}:#{credentials_hash['port']}/#{credentials_hash['db']}"
112
+ exec_name ||= 'mongo'
113
+ mongo_shell=get_mongo_exec(exec_name)
114
+ if exec_name == 'mongo'
115
+ db_arg = "/#{credentials_hash['db']}"
116
+ elsif exec_name == 'mongodump'
117
+ db_arg = "" # dump all the databases including 'admin' which contains the users.
118
+ else
119
+ db_arg = "--db #{credentials_hash['db']}"
120
+ end
121
+ cmd = "#{mongo_shell} -u #{credentials_hash['username']} -p #{credentials_hash['password']} #{credentials_hash['hostname']}:#{credentials_hash['port']}#{db_arg}"
107
122
  puts "Executing #{cmd}"
108
123
  if commands_file
109
- if File.exists? commands_file
110
- # not supported yet.
111
- commands_file = "--eval \"#{`cat commands_file`}"
112
- else
113
- commands_file = "--eval \"#{commands_file}\""
124
+ if mongo_shell == 'mongo'
125
+ if File.exists? commands_file
126
+ # not supported yet.
127
+ commands_file = "--eval \"#{`cat commands_file`}"
128
+ else
129
+ commands_file = "--eval \"#{commands_file}\""
130
+ end
114
131
  end
115
132
  `#{cmd} #{commands_file}`
116
133
  else
@@ -133,16 +150,24 @@ module VMC
133
150
  end
134
151
  end
135
152
 
136
- def self.find_mongo_exec()
137
- mongo=`which mongo`
138
- return mongo unless mongo.nil? || mongo.empty?
139
- mongo_files = Dir.glob("#{ENV['HOME']}/cloudfoundry/.deployments/*/deploy/mongodb/bin/mongo")
140
- mongo_files.first unless mongo_files.empty?
153
+ def self.get_mongo_exec(exec_name=nil)
154
+ exec_name||='mongo'
155
+ mongo_bin_folder=File.dirname(get_mongodb_node_config()['mongod_path'])
156
+ File.join(mongo_bin_folder,exec_name)
157
+ end
158
+
159
+ # Returns the path to the mongodb db files. /var/vcap/services/mongodb/
160
+ def self.get_mongodb_base_dir(mongodb_node_yml_path=nil)
161
+ mongodb_node_yml_path||="#{ENV['CLOUD_FOUNDRY_CONFIG_PATH']}/mongodb_node.yml"
162
+ db = File.open( mongodb_node_yml_path ) do |yf| YAML::load( yf ) end
163
+ base_dir = db['base_dir']
141
164
  end
142
165
 
143
166
  def self.as_regexp(arg)
144
167
  if arg != nil && arg.kind_of?(String) && !arg.strip.empty?
145
168
  Regexp.new(arg)
169
+ elsif arg.kind_of?(Regexp)
170
+ arg
146
171
  end
147
172
  end
148
173
 
@@ -183,6 +208,12 @@ module VMC
183
208
  data_service.drop(collection_or_table_names)
184
209
  end
185
210
  end
211
+ def shrink()
212
+ collection_or_table_names = @opts[:collection_or_table_names] if @opts
213
+ @data_services.each do |data_service|
214
+ data_service.shrink(collection_or_table_names)
215
+ end
216
+ end
186
217
 
187
218
  end
188
219
 
@@ -212,73 +243,103 @@ module VMC
212
243
  raise "Unable to locate the database file to import." if files.empty?
213
244
  file = files.first
214
245
  end
215
- is_tmp = false
216
- current_wd = Dir.pwd
217
- begin
246
+
247
+
248
+ tmp_download_filename="_download_.zip"
249
+ data_download_dir="#{ENV['HOME']}/vmc_knife_downloads/data_#{@wrapped['name']}"
250
+ current_wd=Dir.pwd
251
+ FileUtils.mkdir_p data_download_dir
252
+ Dir.chdir(data_download_dir) do
218
253
  if file =~ /^https?:\/\// || file =~ /^ftp:\/\//
219
- url = file
220
- is_tmp = true
221
- if file =~ /[^\/]*$/
222
- basename = $0
223
- end
224
- tempfile = Tempfile.new("import_db_#{basename}")
225
- wget_args = @application_json['repository']['wget_args']
226
- if wget_args.nil?
227
- wget_args_str = ""
228
- elsif wget_args.kind_of? Array
229
- wget_args_str = wget_args.join(' ')
230
- elsif wget_args.kind_of? String
231
- wget_args_str = wget_args
254
+ basename = Pathname.new(URI.parse(file).path).basename.to_s
255
+ else
256
+ file=File.expand_path(file,current_wd)
257
+ basename = File.basename(file).to_s
258
+ end
259
+ if Dir.entries(Dir.pwd).size == 2
260
+ if file =~ /^https?:\/\// || file =~ /^ftp:\/\//
261
+ wget_args = @wrapped['director']['wget_args']
262
+ if wget_args.nil?
263
+ wget_args_str = ""
264
+ elsif wget_args.kind_of? Array
265
+ wget_args_str = wget_args.join(' ')
266
+ elsif wget_args.kind_of? String
267
+ wget_args_str = wget_args
268
+ end
269
+ `wget #{wget_args_str} --output-document=#{basename} #{file}`
270
+ if $? != 0
271
+ `rm #{data_download_dir}/#{basename}`
272
+ raise "Unable to successfully download #{file}"
273
+ end
274
+ else
275
+ `cp #{file} #{basename}`
232
276
  end
233
- `wget #{wget_args_str} --output-document=#{tempfile.path} #{url}`
234
- file = tempfile.path
235
277
  end
236
278
  #unzip if necessary (in progress)
237
-
238
- if /\.tgz$/ =~ file || /\.tar\.gz$/ =~ file
239
- tmp_dir = Dir.mktmpdir
240
- Dir.chdir(tmp_dir.path)
241
- `tar zxvf #{file.path}`
242
- elsif /\.tar$/ =~ file
243
- tmp_dir = Dir.mktmpdir
244
- Dir.chdir(tmp_dir.path)
245
- `tar xvf #{file}`
246
- elsif /\.zip$/ =~ file
247
- tmp_dir = Dir.mktmpdir
248
- Dir.chdir(tmp_dir.path)
249
- `unzip #{file}`
279
+ is_unzipped=true
280
+ p "unzip #{basename}"
281
+ if /\.tgz$/ =~ basename || /\.tar\.gz$/ =~ basename
282
+ `tar zxvf #{basename}`
283
+ elsif /\.tar$/ =~ basename
284
+ `tar xvf #{basename}`
285
+ elsif /\.zip$/ =~ basename
286
+ `unzip #{basename}`
287
+ else
288
+ is_unzipped=false
250
289
  end
251
- if tmp_dir
252
- `rm #{file}`
290
+
291
+ if is_unzipped
292
+ #`rm #{basename}`
253
293
  files = Dir.glob("*.sql") if is_postgresql
254
294
  files = Dir.glob("*.bson") if is_mongodb
255
295
  files ||= Dir.glob("*")
256
296
  raise "Can't find the db-dump file." if files.empty?
257
297
  file = files.first
298
+ else
299
+ file = basename
258
300
  end
259
-
301
+
260
302
  if is_postgresql
303
+ p "chmod o+w #{file}"
261
304
  `chmod o+w #{file}`
262
- #TODO:
305
+ creds=credentials(app_name)
263
306
  if /\.sql$/ =~ file
264
307
  other_params="--file #{file} --quiet"
265
- cmd = VMC::KNIFE.pg_connect_cmd(credentials(app_name), 'psql',as_admin=false, other_params)
308
+ cmd = VMC::KNIFE.pg_connect_cmd(creds, 'psql',as_admin=false, other_params)
266
309
  #`psql --dbname #{dbname} --file #{file} --clean --quiet --username #{rolename}`
267
310
  else
268
311
  other_params="--clean --no-acl --no-privileges --no-owner #{file}"
269
- cmd = VMC::KNIFE.pg_connect_cmd(credentials(app_name), 'pg_restore',false, other_params)
312
+ cmd = VMC::KNIFE.pg_connect_cmd(creds, 'pg_restore',false, other_params)
270
313
  #`pg_restore --dbname=#{dbname} --username=#{username} --no-acl --no-privileges --no-owner #{file}`
271
314
  end
272
315
  puts cmd
273
316
  puts `#{cmd}`
274
317
  `chmod o-w #{file}`
318
+ elsif is_mongodb
319
+
320
+ # see if we go through the filesystem to shrink or
321
+ # if we are only interested in the data itself.
322
+ base_dir=VMC::KNIFE.get_mongodb_base_dir()
323
+ instance_name=creds['name']
324
+ dbpath=File.join(base_dir, instance_name, 'data')
325
+ mongod_lock=File.join(dbpath,'mongo.lock')
326
+
327
+ if File.exists?(mongod_lock) && File.size(mongod_lock)>0
328
+ # the mongodb instance is currently working. connect to it and do the work.
329
+ # in that case import the 'db' alone. don't do the 'admin'
330
+ VMC::KNIFE.data_service_console(creds, File.dirname(file),false,'mongorestore')
331
+ else
332
+ # the mongodb instance is not currently working
333
+ # go directly on the filesystem
334
+ `rm -rf #{dbpath}`
335
+ `mkdir -p #{dbpath}`
336
+ #sudo mongorestore --dbpath /var/lib/mongodb
337
+ mongorestore_exec=VMC::KNIFE.get_mongo_exec('mongorestore')
338
+ `#{mongorestore_exec} --dbpath #{dbpath} #{File.dirname(File.dirname(file))}`
339
+ end
275
340
  else
276
- raise "Unsupported type of data-service. Postgresql is the only supported service at the moment."
341
+ raise "Unsupported type of data-service. Postgresql and mongodb are the only supported services at the moment."
277
342
  end
278
- ensure
279
- file.unlink if is_tmp # deletes the temp file
280
- tmp_dir.unlink if tmp_dir # deletes the temp directory
281
- Dir.chdir(current_wd)
282
343
  end
283
344
  end
284
345
 
@@ -286,19 +347,55 @@ module VMC
286
347
  if is_postgresql
287
348
  if file.nil?
288
349
  extension = @wrapped['director']['file_extension'] if @wrapped['director']
289
- extension = is_mongodb() ? "bson" : "sql"
350
+ extension ||= "sql"
290
351
  file = "#{name()}.#{extension}"
291
352
  end
292
353
  `touch #{file}`
293
354
  `chmod o+w #{file}`
294
355
  puts "Exports the database #{credentials(app_name)['name']} in #{file}"
295
-
296
- #sudo -u postgres env PGPASSWORD=$PGPASSWORD dbname=$DBNAME DUMPFILE=$DUMPFILE pg_dump --format=p --file=$DUMPFILE --no-owner --clean --blobs --no-acl --oid --no-tablespaces $DBNAME
356
+ #sudo -u postgres env PGPASSWORD=intalio DBNAME=intalio DUMPFILE=intalio_dump.sql pg_dump --format=p --file=$DUMPFILE --no-owner --clean --blobs --no-acl --oid --no-tablespaces $DBNAME
357
+ #sudo -u postgres env PGPASSWORD=$PGPASSWORD DUMPFILE=$DUMPFILE pg_dump --format=p --file=$DUMPFILE --no-owner --clean --blobs --no-acl --oid --no-tablespaces $DBNAME
297
358
 
298
359
  cmd = VMC::KNIFE.pg_connect_cmd(credentials(app_name), 'pg_dump', false, "--format=p --file=#{file} --no-owner --clean --oids --blobs --no-acl --no-privileges --no-tablespaces")
299
360
  puts cmd
300
361
  puts `#{cmd}`
301
362
  `chmod o-w #{file}`
363
+ elsif is_mongodb
364
+ if file.nil?
365
+ extension = @wrapped['director']['file_extension'] if @wrapped['director']
366
+ extension ||= "bson.tar.gz"
367
+ file = "#{name()}.#{extension}"
368
+ end
369
+ creds=credentials(app_name)
370
+ puts "Exports the database #{creds['name']} in #{file}"
371
+ #mongodump --host localhost:27017
372
+ mongodump_exec=VMC::KNIFE.get_mongo_exec('mongodump')
373
+ # see if we go through the filesystem or through the network:
374
+ base_dir=VMC::KNIFE.get_mongodb_base_dir()
375
+ instance_name=creds['name']
376
+ dbpath=File.join(base_dir, instance_name, 'data')
377
+ mongod_lock=File.join(dbpath,'mongo.lock')
378
+ if File.exists?(mongod_lock) && File.size(mongod_lock)>0
379
+ cmd = "#{mongodump_exec} -u #{credentials_hash['username']} -p #{credentials_hash['password']} --host #{credentials_hash['hostname']}:#{credentials_hash['port']}"
380
+ else
381
+ cmd = "#{mongodump_exec} --dbpath #{dbpath}"
382
+ end
383
+ puts cmd
384
+ puts `#{cmd}`
385
+
386
+ # this produces a dump folder in the working directory.
387
+ # let's zip it:
388
+ if /\.zip$/ =~ extension
389
+ # just zip
390
+ `zip -r #{file} dump/`
391
+ elsif /\.tar$/ =~ extension
392
+ # just tar
393
+ `tar cvf #{file} dump/`
394
+ else
395
+ # tar-gzip by default
396
+ `tar czvf #{file} dump/`
397
+ end
398
+ `rm -rf dump`
302
399
  end
303
400
  end
304
401
 
@@ -309,7 +406,11 @@ module VMC
309
406
  def is_mongodb()
310
407
  credentials()['db'] != nil
311
408
  end
312
-
409
+
410
+ # Make sure that all users who can connect to the DB can also access
411
+ # the tables.
412
+ # This workarounds the privilege issue reported here:
413
+ #
313
414
  def apply_privileges()
314
415
  if is_postgresql()
315
416
  cmd_acl="GRANT CREATE ON SCHEMA PUBLIC TO PUBLIC;\
@@ -320,6 +421,32 @@ module VMC
320
421
  end
321
422
  end
322
423
 
424
+ # shrink the size of the databses on the file system.
425
+ # Specifically act on the mongodb instances when they are stopped.
426
+ def shrink(collection_or_table_names=nil)
427
+ return unless is_mongodb
428
+ creds=credentials()
429
+ base_dir=VMC::KNIFE.get_mongodb_base_dir()
430
+ instance_name=creds['name']
431
+ dbpath=File.join(base_dir, instance_name, 'data')
432
+ mongod_lock=File.join(dbpath,'mongo.lock')
433
+ raise "Can't shrink #{name}; the mongodb is currently running" if File.exists?(mongod_lock) && File.size(mongod_lock)>0
434
+ mongodump_exec=VMC::KNIFE.get_mongo_exec('mongodump')
435
+ raise "Can't find mongodump" unless File.exist? mongodump_exec
436
+ mongorestore_exec=VMC::KNIFE.get_mongo_exec('mongorestore')
437
+ raise "Can't find mongorestore" unless File.exist? mongorestore_exec
438
+ cmd = "#{mongodump_exec} --dbpath #{dbpath}"
439
+ puts "#{cmd}"
440
+ puts `#{cmd}`
441
+
442
+ `rm -rf #{dbpath}`
443
+ `mkdir #{dbpath}`
444
+ cmd = "#{mongorestore_exec} --dbpath #{dbpath} dump/"
445
+ puts "#{cmd}"
446
+ puts `#{cmd}`
447
+ `rm -rf dump`
448
+ end
449
+
323
450
  def drop(collection_or_table_names=nil)
324
451
  if is_postgresql
325
452
  sel_tables = "SELECT table_name FROM information_schema.tables WHERE table_schema='public'"
@@ -351,8 +478,35 @@ module VMC
351
478
  puts cmd
352
479
  puts `#{cmd}`
353
480
  elsif is_mongodb
481
+ # generate the command file from the erb template.
482
+ filter = ".*"
483
+ filterIsNegated = "false";
484
+ skipSystem = "true";
485
+ if collection_or_table_names
486
+ if collection_or_table_names.start_with?('!')
487
+ filterIsNegated = "true";
488
+ filter = collection_or_table_names[1..-1]
489
+ else
490
+ filter = collection_or_table_names
491
+ end
492
+ end
493
+ # this command is applied to each collection.
494
+ # the name of the variable is 'collection' as can bee seen in the erb file.
495
+ cmd="collection.drop();"
496
+
497
+ file = Tempfile.new('dropcollections')
498
+ begin
499
+ File.open(file.path, 'w') do |f2|
500
+ template = ERB.new File.new("#{VMCKNIFE::ROOT_REL}/vmc_knife/mongo/mongo_cmd.js.erb").read, nil, "%"
501
+ f2.puts template.result(binding)
502
+ end
503
+ puts shell(file.path)
504
+ ensure
505
+ file.unlink # deletes the temp file
506
+ end
507
+
354
508
  #TODO: iterate over the collections and drop them according to the filter.
355
- raise "TODO: Unsupported operation 'drop' for the data-service #{name()}"
509
+ #raise "TODO: Unsupported operation 'drop' for the data-service #{name()}"
356
510
  else
357
511
  puts "Unsupported operation 'drop' for the data-service #{name()}"
358
512
  end
@@ -10,7 +10,8 @@ module VMC
10
10
  def self.ip_auto(interface='eth0')
11
11
  res=`ifconfig | sed -n '/#{interface}/{n;p;}' | grep 'inet addr:' | grep -v '127.0.0.1' | cut -d: -f2 | awk '{ print $1}' | head -1`
12
12
  if interface == 'eth0' && (res.nil? || res.strip.empty?)
13
- res = VcapUtilities.ip_auto "wlan0"
13
+ res = ip_auto "wlan0"
14
+ res = res[0] if res
14
15
  if res.strip.empty?
15
16
  #nevermind fetch the first IP you can find that is not 127.0.0.1
16
17
  res=`ifconfig | grep 'inet addr:' | grep -v '127.0.0.1' | cut -d: -f2 | awk '{ print $1}' | head -1`
@@ -20,10 +21,10 @@ module VMC
20
21
  unless res.empty?
21
22
  # gets the Mask
22
23
  line=`ifconfig | grep 'inet addr:#{res}' | awk '{ print $1}' | head -1`
23
- puts "parsing ip and mask in line #{line}"
24
+ # puts "parsing ip and mask in line #{line}"
24
25
  mask=`ifconfig | grep 'inet addr:#{res}' | grep -v '127.0.0.1' | cut -d: -f4 | awk '{ print $1}' | head -1`
25
26
  mask.strip!
26
- puts "got ip #{res} and mask #{mask}"
27
+ # puts "got ip #{res} and mask #{mask}"
27
28
  return [ res, mask ]
28
29
  end
29
30
  end
@@ -50,16 +51,16 @@ module VMC
50
51
  # Makes up to 10 passes evaluating ruby in the values that contain #{}.
51
52
  def self.expand_json(file_path)
52
53
  raise "The file #{file_path} does not exist" unless File.exists? file_path
53
- data = JSON.parse File.open(file_path).read
54
+ data = File.open(file_path, "r") do |infile| JSON.parse infile.read end
54
55
  #puts "got data #{data.to_json}"
55
56
  passes = 0
56
- while passes < 100
57
+ while passes < 150
57
58
  #puts "pass #{passes}"
58
59
  break unless expand_data(data,data)
59
60
  passes += 1
60
61
  end
61
- puts data.to_json unless passes < 100
62
- raise "More than 100 passes evaluating the ruby template in the json file" unless passes < 100
62
+ puts data.to_json unless passes < 150
63
+ raise "More than 100 passes evaluating the ruby template in the json file current state #{JSON.pretty_generate data}" unless passes < 100
63
64
  #puts "got data #{data.to_json}"
64
65
 
65
66
  data
@@ -90,22 +91,52 @@ module VMC
90
91
  end
91
92
  elsif current.kind_of? Array
92
93
  index = 0
94
+ current_evalled = Array.new
95
+ do_flatten=false
93
96
  current.each do | v |
94
97
  if v.kind_of? String
95
98
  if /\#{.+}/ =~ v
96
99
  at_least_one_eval = true
97
100
  begin
98
- evalled = eval_v(v,data,current)
99
- current[index] = evalled unless evalled.nil?
101
+ evalled_ret = eval_v(v,data,current)
102
+ if evalled_ret.kind_of? Array
103
+ # we choose to support our use cases to flatten the arrays.
104
+ # never mind the lists of list for now.
105
+ do_flatten = true
106
+ evalled_ret.each do |nitem|
107
+ current_evalled[index] = nitem
108
+ index+=1
109
+ end
110
+ elsif evalled_ret.nil? # skip the nil for the next pass
111
+ current_evalled[index] = v
112
+ else
113
+ current_evalled[index] = evalled_ret
114
+ end
100
115
  rescue => e
101
- raise "Error thrown evaluating #{v}: #{e.inspect}"
116
+ raise "Error thrown evaluating #{v}; current state #{JSON.pretty_generate data}: #{e.inspect}"
102
117
  end
118
+ else
119
+ current_evalled[index] = v
103
120
  end
104
- else
105
- at_least_one_eval ||= expand_data(data,v)
121
+ # else
122
+ # at_least_one_eval ||= expand_data(data,v)
106
123
  end
107
124
  index+=1
108
125
  end
126
+
127
+ # we don't support list of lists if there is a doubt when running the eval.
128
+ if at_least_one_eval
129
+ current_evalled.flatten! if do_flatten
130
+ current.clear
131
+ current.concat current_evalled
132
+ end
133
+
134
+ current.each do | v |
135
+ unless v.kind_of? String
136
+ at_least_one_eval ||= expand_data(data,v)
137
+ end
138
+ end
139
+
109
140
  end
110
141
  at_least_one_eval
111
142
  end
@@ -113,16 +144,26 @@ module VMC
113
144
  # internal eval a reference.
114
145
  # the reference is always wrapped in a json string.
115
146
  # however if it is purely a ruby script ("#{ruby here}" ) we unwrap it
116
- # to avoid casting the result into a string.
117
- def self.eval_v(v,data,current)
118
- #puts "evalling #{v}"
147
+ def self.eval_v(v,data,current,recurse=0)
119
148
  if /^\#{([^}]*)}$/ =~ v
120
149
  val = $1
121
150
  else
122
151
  val = '"'+v+'"'
123
152
  end
124
- evalled = eval(val,get_binding(data,current))
125
- #puts "evaluating #{v} => #{evalled} class #{evalled.class.name}"
153
+ module_eval <<-"END"
154
+ def self.eval_block_from_template(this,current)
155
+ #{val}
156
+ end
157
+ END
158
+ evalled = eval_block_from_template(data,current)
159
+ return nil if evalled.nil?
160
+ if evalled.kind_of?(String) && /\#{([^}]*)}/ =~ evalled
161
+ if recurse < 20
162
+ evalled = eval_v(evalled,data,current,recurse+1)
163
+ else
164
+ return nil
165
+ end
166
+ end
126
167
  evalled
127
168
  end
128
169
 
@@ -0,0 +1,24 @@
1
+ // Applies a command to all collections that name matches a particular filter
2
+ var skipSystem = <%= skipSystem %>;
3
+ var filter = /<%= filter %>/;
4
+ var filterIsNegated = <%= filterIsNegated %>;
5
+ var collectionNames = db.getCollectionNames();
6
+ for (var i = 0; i < collectionNames.length; i++ ) {
7
+ var name = collectionNames[i];
8
+ if (!(/^system/).test(name) || !skipSystem) {
9
+ var collection = null;
10
+ if (filter.test(name)) {
11
+ if (!filterIsNegated) {
12
+ collection=db.getCollection(name);
13
+ }
14
+ } else {
15
+ if (filterIsNegated) {
16
+ collection=db.getCollection(name);
17
+ }
18
+ }
19
+ if (collection) {
20
+ print("Applying to " + collection.getName());
21
+ <%= cmd %>
22
+ }
23
+ }
24
+ }
@@ -23,9 +23,6 @@ module VMC
23
23
  def sub_domain()
24
24
  @wrapped['sub_domain']
25
25
  end
26
- def target()
27
- @wrapped['target']
28
- end
29
26
  def user()
30
27
  @wrapped['user']
31
28
  end
@@ -211,8 +208,10 @@ module VMC
211
208
  @applications = @applications + recipe.applications(application_sel)
212
209
  @data_services = @data_services + recipe.data_services(service_sel)
213
210
  end
214
- app_names = @applications.collect {|app| app.name }
215
- service_names = @data_services.collect {|service| service.name }
211
+ app_names = @applications.collect {|app| app.name } unless @opts && @opts[:data_only]
212
+ service_names = @data_services.collect {|service| service.name } unless @opts && @opts[:apps_only]
213
+ app_names ||= Array.new
214
+ service_names ||= Array.new
216
215
  if app_names.empty? && service_names.empty?
217
216
  puts "No applications and data-services were selected."
218
217
  else
@@ -431,10 +430,12 @@ module VMC
431
430
  return unless @application_json['repository']
432
431
  url = @application_json['repository']['url']
433
432
  Dir.chdir(ENV['HOME']) do
434
- FileUtils.mkdir_p "vmc_knife_downloads/#{@application_json['name']}"
435
- Dir.chdir("vmc_knife_downloads/#{@application_json['name']}") do
433
+ tmp_download_filename="_download_.zip"
434
+ app_download_dir="vmc_knife_downloads/#{@application_json['name']}"
435
+ `rm -rf #{app_download_dir}` if File.exist? "#{app_download_dir}/#{tmp_download_filename}"
436
+ FileUtils.mkdir_p app_download_dir
437
+ Dir.chdir(app_download_dir) do
436
438
  if Dir.entries(Dir.pwd).size == 2
437
- puts "Dir.entries(#{Dir.pwd}).size #{Dir.entries(Dir.pwd).size}"
438
439
  #empty directory.
439
440
  if /\.git$/ =~ url
440
441
  `git clone #{url} --depth 1`
@@ -442,28 +443,31 @@ module VMC
442
443
  if branch
443
444
  `git checkout #{branch}`
444
445
  else
445
- branch=master
446
+ branch='master'
446
447
  end
447
448
  `git pull origin #{branch}`
448
449
  else
449
- wget_args = @application_json['repository']['wget_args']
450
- if wget_args.nil?
451
- wget_args_str = ""
452
- elsif wget_args.kind_of? Array
453
- wget_args_str = wget_args.join(' ')
454
- elsif wget_args.kind_of? String
455
- wget_args_str = wget_args
456
- end
457
- `wget #{wget_args_str} --output-document=_download_.zip #{url}`
458
- raise "Unable to download #{url}" unless $? == 0
459
- if /\.tgz$/ =~ url || /\.tar\.gz$/ =~ url
460
- `tar zxvf _download_.zip`
461
- elsif /\.tar$/ =~ url
462
- `tar xvf _download_.zip`
463
- else
464
- `unzip _download_.zip`
450
+ begin
451
+ wget_args = @application_json['repository']['wget_args']
452
+ if wget_args.nil?
453
+ wget_args_str = ""
454
+ elsif wget_args.kind_of? Array
455
+ wget_args_str = wget_args.join(' ')
456
+ elsif wget_args.kind_of? String
457
+ wget_args_str = wget_args
458
+ end
459
+ `wget #{wget_args_str} --output-document=#{tmp_download_filename} #{url}`
460
+ raise "Unable to download #{url}" unless $? == 0
461
+ if /\.tgz$/ =~ url || /\.tar\.gz$/ =~ url
462
+ `tar zxvf #{tmp_download_filename}`
463
+ elsif /\.tar$/ =~ url
464
+ `tar xvf #{tmp_download_filename}`
465
+ else
466
+ `unzip #{tmp_download_filename}`
467
+ end
468
+ ensure
469
+ `rm #{tmp_download_filename}`
465
470
  end
466
- `rm _download_.zip`
467
471
  end
468
472
  end
469
473
  Dir.chdir(@application_json['repository']['sub_dir']) if @application_json['repository']['sub_dir']
@@ -531,23 +535,30 @@ module VMC
531
535
  end
532
536
 
533
537
  def update_name_pending()
534
- if current[:name].nil?
538
+ curr_name=current[:name] || current['name']
539
+ if curr_name.nil?
535
540
  return "Create #{@application_json['name']}"
536
541
  end
537
- if @application_json['name'] != @current[:name]
538
- return "#{@current[:name]} => #{@application_json['name']}"
542
+ if @application_json['name'] != curr_name
543
+ return "#{curr_name} => #{@application_json['name']}"
539
544
  end
540
545
  end
541
546
  def update_memory_pending()
542
- old_mem = current[:resources][:memory] unless current[:resources].nil?
547
+ old_mem = current[:resources][:memory] if current[:resources]
548
+ old_mem ||= current['resources']['memory'] if current['resources']
543
549
  new_mem = @application_json['resources']['memory'] unless @application_json['resources'].nil?
544
550
  if old_mem != new_mem
545
551
  return "#{old_mem} => #{new_mem}"
546
552
  end
547
553
  end
548
554
  def update_staging_pending()
549
- old_model = current[:staging][:model] unless current[:staging].nil?
550
- old_stack = current[:staging][:stack] unless current[:staging].nil?
555
+ if current[:staging] # sym style: real vmc.
556
+ old_model = current[:staging][:model]
557
+ old_stack = current[:staging][:stack]
558
+ elsif current['staging'] # string style: testing.
559
+ old_model = current['staging']['model']
560
+ old_stack = current['staging']['stack']
561
+ end
551
562
  new_model = @application_json['staging']['model'] unless @application_json['staging'].nil?
552
563
  new_stack = @application_json['staging']['stack'] unless @application_json['staging'].nil?
553
564
  if old_model != new_model
@@ -562,17 +573,17 @@ module VMC
562
573
  return { "stack" => stack_change, "model" => model_change }
563
574
  end
564
575
  def update_services_pending()
565
- old_services = current[:services]
576
+ old_services = current[:services] || current['services']
566
577
  new_services = @application_json['services']
567
578
  diff_lists(old_services,new_services)
568
579
  end
569
580
  def update_env_pending()
570
- old_services = current[:env]
581
+ old_services = current[:env] || current['env']
571
582
  new_services = @application_json['env']
572
583
  diff_lists(old_services,new_services)
573
584
  end
574
585
  def update_uris_pending()
575
- old_services = current[:uris]
586
+ old_services = current[:uris] || current['uris']
576
587
  new_services = @application_json['uris']
577
588
  diff_lists(old_services,new_services)
578
589
  end
@@ -729,6 +740,7 @@ module VMC
729
740
  end
730
741
 
731
742
  # This is really a server-side feature.
743
+ # This is deprecated; use the dns_publisher vcap module instead.
732
744
  # Regenerates the urls to publish as aliases.
733
745
  # use vmc apps to read the uris of each app and also the manifest.
734
746
  class VCAPUpdateAvahiAliases
@@ -789,14 +801,18 @@ module VMC
789
801
  end
790
802
  def execute()
791
803
  return unless update_pending()
792
- File.open(@config, "w") do |file|
793
- all_uris().each do |uri|
794
- file.puts uri + "\n"
804
+ # if the dns_publisher module is present let's not do this one.
805
+ # the dns_publisher does a better job at mdns
806
+ unless File.exist? "#{ENV['CLOUD_FOUNDRY_CONFIG_PATH']}/dns_publisher.yml"
807
+ File.open(@config, "w") do |file|
808
+ all_uris().each do |uri|
809
+ file.puts uri + "\n"
810
+ end
795
811
  end
812
+ #configured so that we don't need root privileges on /etc/avahi/aliases:
813
+ #the backticks don't work; system() works:
814
+ system('avahi-publish-aliases') if @do_exec
796
815
  end
797
- #configured so that we don't need root privileges on /etc/avahi/aliases:
798
- #the backticks don't work; system() works:
799
- system('avahi-publish-aliases') if @do_exec
800
816
  end
801
817
  def update_pending()
802
818
  already = already_published_uris()
data/lib/vmc_knife.rb CHANGED
@@ -1,23 +1,23 @@
1
- module VMCKNIFE; end
2
-
3
- ROOT_REL = File.expand_path(File.dirname(__FILE__))
4
- require "#{ROOT_REL}/restclient/restclient_add_timeout.rb"
1
+ module VMCKNIFE
2
+ ROOT_REL = File.expand_path(File.dirname(__FILE__))
3
+ end
4
+ require "#{VMCKNIFE::ROOT_REL}/restclient/restclient_add_timeout.rb"
5
5
 
6
6
 
7
7
  module VMC
8
8
  module Cli
9
9
  module Command
10
- autoload :Knife, "#{ROOT_REL}/vmc_knife/commands/knife_cmds"
11
- autoload :Knifeapps, "#{ROOT_REL}/vmc_knife/commands/knife_cmds"
12
- autoload :Knifemisc, "#{ROOT_REL}/vmc_knife/commands/knife_cmds"
10
+ autoload :Knife, "#{VMCKNIFE::ROOT_REL}/vmc_knife/commands/knife_cmds"
11
+ autoload :Knifeapps, "#{VMCKNIFE::ROOT_REL}/vmc_knife/commands/knife_cmds"
12
+ autoload :Knifemisc, "#{VMCKNIFE::ROOT_REL}/vmc_knife/commands/knife_cmds"
13
13
  end
14
14
  end
15
15
  end
16
16
 
17
17
 
18
- require "#{ROOT_REL}/vmc_knife/json_expander"
19
- require "#{ROOT_REL}/vmc_knife/vmc_helper"
20
- require "#{ROOT_REL}/vmc_knife/vmc_knife"
21
- require "#{ROOT_REL}/vmc_knife/data_services"
18
+ require "#{VMCKNIFE::ROOT_REL}/vmc_knife/json_expander"
19
+ require "#{VMCKNIFE::ROOT_REL}/vmc_knife/vmc_helper"
20
+ require "#{VMCKNIFE::ROOT_REL}/vmc_knife/vmc_knife"
21
+ require "#{VMCKNIFE::ROOT_REL}/vmc_knife/data_services"
22
22
 
23
- require "#{ROOT_REL}/vmc_knife/cli_extensions"
23
+ require "#{VMCKNIFE::ROOT_REL}/vmc_knife/cli_extensions"
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vmc_knife
3
3
  version: !ruby/object:Gem::Version
4
- hash: 15
4
+ hash: 13
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 8
10
- version: 0.0.8
9
+ - 9
10
+ version: 0.0.9
11
11
  platform: ruby
12
12
  authors:
13
13
  - Intalio Pte
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-12-12 00:00:00 Z
18
+ date: 2012-01-11 00:00:00 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  name: vmc
@@ -108,6 +108,7 @@ files:
108
108
  - lib/vmc_knife/commands/knife_cmds.rb
109
109
  - lib/vmc_knife/data_services.rb
110
110
  - lib/vmc_knife/json_expander.rb
111
+ - lib/vmc_knife/mongo/mongo_cmd.js.erb
111
112
  - lib/vmc_knife/version.rb
112
113
  - lib/vmc_knife/vmc_helper.rb
113
114
  - lib/vmc_knife/vmc_knife.rb