1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
#
# fyi: the `node init` command lives in node_init.rb,
# but all other `node x` commands live here.
#
module LeapCli; module Commands
##
## COMMANDS
##
desc 'Node management'
command [:node, :n] do |node|
node.desc 'Create a new configuration file for a node named NAME.'
node.long_desc ["If specified, the optional argument SEED can be used to seed values in the node configuration file.",
"The format is property_name:value.",
"For example: `leap node add web1 ip_address:1.2.3.4 services:webapp`.",
"To set nested properties, property name can contain '.', like so: `leap node add web1 ssh.port:44`",
"Separate multiple values for a single property with a comma, like so: `leap node add mynode services:webapp,dns`"].join("\n\n")
node.arg_name 'NAME [SEED]' # , :optional => false, :multiple => false
node.command :add do |add|
add.switch :local, :desc => 'Make a local testing node (by assigning the next available local IP address). Local nodes are run as virtual machines on your computer.', :negatable => false
add.switch :vm, :desc => 'Make a remote virtual machine for this node. Requires a valid cloud.json configuration.', :negatable => false
add.action do |global_options,options,args|
if options[:vm]
do_vm_add(global_options, options, args)
else
do_node_add(global_options, options, args)
end
end
end
node.desc 'Renames a node file, and all its related files.'
node.arg_name 'OLD_NAME NEW_NAME'
node.command :mv do |mv|
mv.action do |global_options,options,args|
do_node_move(global_options, options, args)
end
end
node.desc 'Removes all the files related to the node named NAME.'
node.arg_name 'NAME' #:optional => false #, :multiple => false
node.command :rm do |rm|
rm.action do |global_options,options,args|
do_node_rm(global_options, options, args)
end
end
end
##
## PUBLIC HELPERS
##
def get_node_from_args(args, options={})
node_name = args.first
node = manager.node(node_name)
if node.nil? && options[:include_disabled]
node = manager.disabled_node(node_name)
end
assert!(node, "Node '#{node_name}' not found.")
node
end
protected
#
# additionally called by `leap vm add`
#
def do_node_add(global, options, args)
name = args.first
unless global[:force]
assert_files_missing! [:node_config, name]
end
node = Config::Node.new(manager.env)
node['name'] = name
if options[:ip_address]
node['ip_address'] = options[:ip_address]
elsif options[:local]
node['ip_address'] = pick_next_vagrant_ip_address
end
node.seed_from_args(args[1..-1])
node.seed_from_template
node.validate!
node.write_configs
# reapply inheritance, since tags/services might have changed:
node = manager.reload_node!(node)
node.generate_cert
end
private
def do_node_move(global, options, args)
node = get_node_from_args(args, include_disabled: true)
new_name = args.last
Config::Node.validate_name!(new_name, node.vagrant?)
ensure_dir [:node_files_dir, new_name]
Leap::Platform.node_files.each do |path|
rename_file! [path, node.name], [path, new_name]
end
remove_directory! [:node_files_dir, node.name]
rename_node_facts(node.name, new_name)
if node.vm_id?
node['name'] = new_name
bind_server_to_node(node.vm.id, node, options)
end
end
def do_node_rm(global, options, args)
node = get_node_from_args(args, include_disabled: true)
if node.vm?
if !node.vm_id?
log :warning, "The node #{node.name} is missing a 'vm.id' property. "+
"You may have a virtual machine instance that is left "+
"running. Check `leap vm status`"
else
msg = "The node #{node.name} appears to be associated with a virtual machine. " +
"Do you want to also destroy this virtual machine? "
if global[:yes] || agree(msg)
do_vm_rm(global, options, args)
end
end
elsif node.vagrant?
vagrant_command("destroy --force", [node.name])
end
node.remove_files
remove_node_facts(node.name)
end
end; end
|