Module: Gogetit::Util

Included in:
Etcd::Etcd, CLI, Config, GogetLXD, GogetLibvirt
Defined in:
lib/gogetit/util.rb

Instance Method Summary collapse

Instance Method Details

#check_ip_available(addresses, maas, logger) ⇒ Object



126
127
128
129
130
131
132
133
134
135
136
137
# File 'lib/gogetit/util.rb', line 126

def check_ip_available(addresses, maas, logger)
  logger.info("Calling <#{__method__.to_s}>")
  # to do a ping test
  addresses.each do |ip|
    abort("#{ip} is already being used.") if ping_available?(ip, logger)
  end
  # to check with MAAS
  ifaces = maas.ip_reserved?(addresses)
  abort("one of #{addresses.join(', ')} is already being used.") \
    unless ifaces
  return ifaces
end

#get_gateway(version) ⇒ Object



72
73
74
75
76
77
78
79
80
81
# File 'lib/gogetit/util.rb', line 72

def get_gateway(version)
  IO.popen("ip -#{version.to_s} route").read.each_line do |route|
    if route.include? 'default'
      route.split[2]
    else
      'There is no get_gateway!'
      nil
    end
  end
end

#knife_bootstrap(name, type, config, logger) ⇒ Object



7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# File 'lib/gogetit/util.rb', line 7

def knife_bootstrap(name, type, config, logger)
  logger.info("Calling <#{__method__.to_s}>")
  if find_executable 'knife'
    if system('knife ssl check')
      install_cmd = "curl \
      -l #{config[:chef][:bootstrap][:install_script][type.to_sym]} \
      | sudo bash -s --"
      knife_cmd = "knife bootstrap -y #{name} \
      --node-name #{name} \
      --ssh-user ubuntu \
      --sudo \
      --bootstrap-install-command \"#{install_cmd}\"".gsub(/ * /, ' ')
      puts 'Bootstrapping..'
      puts knife_cmd
      system(knife_cmd)
    end
  end
end

#knife_remove(name, logger) ⇒ Object



47
48
49
50
51
52
53
54
55
56
57
# File 'lib/gogetit/util.rb', line 47

def knife_remove(name, logger)
  logger.info("Calling <#{__method__.to_s}>")
  if find_executable 'knife'
    if system('knife ssl check')
      puts "Deleting node #{name}.."
      system("knife node delete -y #{name}")
      puts "Deleting client #{name}.."
      system("knife client delete -y #{name}")
    end
  end
end

#ping_available?(host, logger) ⇒ Boolean

Returns:

  • (Boolean)


111
112
113
114
115
116
# File 'lib/gogetit/util.rb', line 111

def ping_available?(host, logger)
  # host can be both IP and FQDN.
  logger.info("Calling <#{__method__.to_s}> for #{host}")
  `ping -c 1 -W 1 #{host}`
  $?.exitstatus == 0
end

#recognize_envObject



59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/gogetit/util.rb', line 59

def recognize_env
  thedir = 'lib/env'
  gateway = get_gateway(4)
  Dir.foreach(thedir) do |item|
    if item.match(/\.json$/)
      env_data = JSON.parse(File.read(thedir+'/'+item))
      if gateway =~ Regexp.new(env_data['regexp_pattern'])
        return env_data['name']
      end
    end
  end
end

#ssh_available?(fqdn, user) ⇒ Boolean

Returns:

  • (Boolean)


118
119
120
121
122
123
124
# File 'lib/gogetit/util.rb', line 118

def ssh_available?(fqdn, user)
  begin
    Net::SSH.start(fqdn, user).class
  rescue Exception => e
    puts e
  end
end

#symbolize_keys(thing) ⇒ Object



84
85
86
87
88
89
90
91
92
93
94
# File 'lib/gogetit/util.rb', line 84

def symbolize_keys(thing)
  case thing
  when Array
    thing.map{|v| symbolize_keys(v)}
  when Hash
    inj = thing.inject({}) {|h, (k,v)| h[k] = symbolize_keys(v); h}
    inj.symbolize_keys
  else
    thing
  end
end

#update_vault(config, logger) ⇒ Object



26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/gogetit/util.rb', line 26

def update_vault(config, logger)
  logger.info("Calling <#{__method__.to_s}>")
  # It assumes the data_bags directory is under the root directory of Chef Repo
  data_bags_dir = "#{config[:chef][:chef_repo_root]}/data_bags"
  (Dir.entries("#{data_bags_dir}") - ['.', '..']).each do |bag|
    (Dir.entries("#{data_bags_dir}/#{bag}").select do |f|
        /^((?!keys).)*\.json/.match(f)
      end
    ).each do |item|
      puts 'Refreshing vaults..'
      refresh_cmd = "knife vault refresh #{bag} #{item.gsub('.json', '')} --clean-unknown-clients"
      puts refresh_cmd
      system(refresh_cmd)
    end
    puts 'Updating data bags..'
    update_cmd = "knife data bag from file #{bag} #{data_bags_dir}/#{bag}"
    puts update_cmd
    system(update_cmd)
  end
end

#wait_until_available(fqdn, logger) ⇒ Object



96
97
98
99
100
101
102
103
104
105
106
107
108
109
# File 'lib/gogetit/util.rb', line 96

def wait_until_available(fqdn, logger)
  logger.info("Calling <#{__method__.to_s}>")
  until ping_available?(fqdn, logger)
    logger.info("Calling <#{__method__.to_s}> for ping to be ready..")
    sleep 3
  end
  logger.info("#{fqdn} is now available to ping..")

  until ssh_available?(fqdn, 'ubuntu')
    logger.info("Calling <#{__method__.to_s}> for ssh to be ready..")
    sleep 3
  end
  logger.info("#{fqdn} is now available to ssh..")
end