class Nucleon::Action::Node::Identity

Public Class Methods

describe() click to toggle source
Calls superclass method
   # File lib/nucleon/action/node/identity.rb
10 def self.describe
11   super(:node, :identity, 700)
12 end

Public Instance Methods

arguments() click to toggle source
   # File lib/nucleon/action/node/identity.rb
35 def arguments
36   [ :name, :identity_nodes ]
37 end
configure() click to toggle source
Calls superclass method
   # File lib/nucleon/action/node/identity.rb
17 def configure
18   super do
19     codes :identity_required, :identity_upload_failure
20 
21     register_str :name, nil
22     register_project :identity
23     register_nodes :identity_nodes
24 
25     register_bool :delete, false
26   end
27 end
execute() click to toggle source
Calls superclass method
    # File lib/nucleon/action/node/identity.rb
 42 def execute
 43   super do |local_node|
 44     ensure_network do
 45       if settings[:identity]
 46         # Get identity builder
 47         builder = network.identity_builder({ settings[:name] => settings[:identity] })
 48       else
 49         # Search for identity
 50         builder            = network.identity_builder
 51         identity_directory = File.join(builder.build_directory, settings[:name])
 52 
 53         if File.directory?(identity_directory)
 54           identity_nucleon_file = File.join(identity_directory, '.nucleon')
 55 
 56           if File.exists?(identity_nucleon_file)
 57             json_data           = Util::Disk.read(identity_nucleon_file)
 58             project_info        = symbol_map(Util::Data.parse_json(json_data))
 59             settings[:identity] = "#{project_info[:provider]}:::#{project_info[:edit]}[#{project_info[:revision]}]"
 60           end
 61         end
 62 
 63         if settings[:identity]
 64           # Get identity builder
 65           info('using_identity', { :identity => settings[:identity], :directory => identity_directory })
 66           builder = network.identity_builder({ settings[:name] => settings[:identity] })
 67         else
 68           warn('identity_required')
 69           myself.status = code.identity_required
 70         end
 71       end
 72 
 73       # Build identity into local network project
 74       if myself.status == code.success && ( settings[:delete] || builder.build(local_node) )
 75         identity_directory = File.join(builder.build_directory, settings[:name])
 76 
 77         # Loop over all nodes to assign identity to (or delete)
 78         success = network.batch(settings[:identity_nodes], settings[:node_provider], settings[:parallel]) do |node|
 79           if settings[:delete]
 80             info('start_delete', { :provider => node.plugin_provider, :name => node.plugin_name })
 81           else
 82             info('start_add', { :provider => node.plugin_provider, :name => node.plugin_name })
 83           end
 84 
 85           # Lookup remote network path
 86           success                        = true
 87           remote_network_directory       = node.lookup(:corl_network)
 88           remote_config_directory        = File.join(remote_network_directory, network.config_directory.sub(/#{network.directory}#{File::SEPARATOR}/, ''))
 89           remote_identity_base_directory = File.join(remote_network_directory, builder.build_directory.sub(/#{network.directory}#{File::SEPARATOR}/, ''))
 90           remote_identity_directory      = File.join(remote_identity_base_directory, settings[:name])
 91 
 92           # Ensure proper remote directories are ready for identity
 93           result  = node.cli.mkdir('-p', remote_identity_base_directory)
 94           success = false unless result.status == code.success
 95 
 96           success = node.cli.chmod('-R', 'go-rwx', remote_config_directory) if success
 97 
 98           if success
 99             result  = node.cli.rm('-Rf', remote_identity_directory)
100             success = false unless result.status == code.success
101 
102             # Send identity through SCP to remote machine
103             if success && !settings[:delete]
104               if node.user == 'root'
105                 success = node.send_files(identity_directory, remote_identity_directory, nil, '0700')
106               else
107                 tmp_identity_directory = File.join('/', 'home', node.user, 'identity')
108 
109                 success = node.send_files(identity_directory, tmp_identity_directory, nil, '0700') if success
110 
111                 success = node.cli.mv(tmp_identity_directory, remote_identity_directory) if success
112                 success = node.cli.chown('-R', 'root:root', remote_identity_directory) if success
113                 success = node.cli.chmod('-R', 'go-rwx', remote_identity_directory) if success
114               end
115             end
116           end
117           success
118         end
119 
120         if success && settings[:delete]
121           # Remove local identity last
122           info('local_delete', { :directory => identity_directory })
123           FileUtils.rm_rf(identity_directory)
124         end
125       end
126       myself.status = code.batch_error unless success
127     end
128   end
129 end
ignore() click to toggle source
   # File lib/nucleon/action/node/identity.rb
31 def ignore
32   [ :nodes ]
33 end