Class: Judo::Group

Inherits:
Object
  • Object
show all
Defined in:
lib/judo/group.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(base, name, version) ⇒ Group

Returns a new instance of Group.



5
6
7
8
9
# File 'lib/judo/group.rb', line 5

def initialize(base, name, version)
  @base = base
  @name = name
  @version = version
end

Instance Attribute Details

#nameObject

Returns the value of attribute name.



3
4
5
# File 'lib/judo/group.rb', line 3

def name
  @name
end

#versionObject

Returns the value of attribute version.



3
4
5
# File 'lib/judo/group.rb', line 3

def version
  @version
end

Instance Method Details

#all_configsObject



152
153
154
# File 'lib/judo/group.rb', line 152

def all_configs
  parent ? parent.all_configs.clone.unshift(raw_config) : [ raw_config ]
end

#attachments(c = config) ⇒ Object



129
130
131
# File 'lib/judo/group.rb', line 129

def attachments(c = config)
  extract(c, {})
end

#build_configObject



15
16
17
# File 'lib/judo/group.rb', line 15

def build_config
  @build_config ||= all_configs.reverse.inject({}) { |sum,conf| sum.merge(conf) }
end

#compileObject



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
# File 'lib/judo/group.rb', line 37

def compile
  tmpdir = "/tmp/kuzushi/#{name}"
  puts "Compiling #{self} version #{version}"
  @version = @version + 1
  FileUtils.rm_rf(tmpdir)
  FileUtils.mkdir_p(tmpdir)
  new_config = build_config
  Dir.chdir(tmpdir) do |d|
    attachments(new_config).each do |to,from|
      FileUtils.mkdir_p(File.dirname(to))
      if from =~ /^http:\/\//
        puts "curl '#{from}'"
        system "curl '#{from}' > #{to}"
        puts "#{to} is #{File.stat(to).size} bytes"
      else
        FileUtils.cp(from,to)
      end
    end
    File.open("config.json", "w") { |f| f.write(new_config.to_json) }
    Dir.chdir("..") do
      system "tar czvf #{tar_file} #{name}"
      puts "Uploading to s3..."
      @base.s3_put(tar_file, File.new(tar_file))
      @base.s3_put(version_config_file, new_config.to_json)
    end
  end
  set_version
end

#configObject



11
12
13
# File 'lib/judo/group.rb', line 11

def config
  @config ||= load_config
end

#config_fileObject



160
161
162
# File 'lib/judo/group.rb', line 160

def config_file
  "#{dir}/config.json"
end

#cp_fileObject



78
79
80
# File 'lib/judo/group.rb', line 78

def cp_file
  FileUtil.mkdir_p(tmpdir)
end

#delete_server(server) ⇒ Object



170
171
172
# File 'lib/judo/group.rb', line 170

def delete_server(server)
  sdb.delete_attributes("judo_config", "groups", name => server.name)
end

#destroyObject



143
144
145
146
147
148
149
150
# File 'lib/judo/group.rb', line 143

def destroy
  servers.each { |s| s.destroy }
  @base.task("Destring #{self}") do
    @base.groups.delete(self)
    @base.sdb.delete_attributes("judo_config", "groups", [ name ])
    @base.sdb.delete_attributes("judo_config", "group_versions", [ name ])
  end
end

#dirObject



156
157
158
# File 'lib/judo/group.rb', line 156

def dir
  "#{@base.repo}/#{name}/"
end

#extract(config, files) ⇒ Object



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
# File 'lib/judo/group.rb', line 94

def extract(config, files)
  config.each do |key,value|
    [value].flatten.each do |v|   ### cover "packages" : ["a","b"], "packages" : "a", "packages":[{ "file" : "foo.pkg"}]
      if v.is_a? Hash
        extract(v, files)
      else
        case key
        when *[ "init", "before", "after" ]
          extract_file(:script, v, files) unless v =~ /^#!/
        when "package"
          files["packages/#{v}_i386.deb"]  = "#{config["source"]}#{v}_i386.deb"
          files["packages/#{v}_amd64.deb"] = "#{config["source"]}#{v}_amd64.deb"
        when "local_packages"
          extract_file(:package, "#{v}_i386.deb", files)
          extract_file(:package, "#{v}_amd64.deb", files)
        when "git"
          ## do nothing - is a remote
        when "template"
          extract_file(:template, v, files)
        when "source"
          extract_file(:file, v, files) unless config["template"] or config["package"]
        when "file"
          ## this is getting messy
          extract_file(:file, File.basename(v), files) unless config["template"] or config["source"] or config["git"]
        end
      end
    end
  end
  files
end

#extract_file(type, name, files) ⇒ Object



82
83
84
85
86
87
88
89
90
91
92
# File 'lib/judo/group.rb', line 82

def extract_file(type, name, files)
  path = "#{dir}/#{type}s/#{name}"
  found = Dir[path]
  if not found.empty?
    found.each { |f| files["#{type}s/#{File.basename(f)}"] = f }
  elsif parent
    parent.extract_file(type, name, files)
  else
    raise "Cannot find file #{name} of type #{type}"
  end
end

#keypair_fileObject



125
126
127
# File 'lib/judo/group.rb', line 125

def keypair_file
  extract_file(:keypair, config["key_name"] + ".pem" , {}).first
end

#load_configObject



27
28
29
30
31
# File 'lib/judo/group.rb', line 27

def load_config
    JSON.load @base.s3_get(version_config_file)
  rescue Aws::AwsError
   raise JudoError, "No config stored: try 'judo commit #{to_s}'"
end

#parentObject

Raises:



137
138
139
140
141
# File 'lib/judo/group.rb', line 137

def parent
  @parent ||= @base.groups.detect { |p| p.name == raw_config["import"] }
  raise JudoError, "Parent group #{raw_config["import"]} must be commited" if raw_config["import"] and @parent.nil?
  @parent
end

#raw_configObject



133
134
135
# File 'lib/judo/group.rb', line 133

def raw_config
  @raw_config ||= read_config
end

#read_configObject



164
165
166
167
168
# File 'lib/judo/group.rb', line 164

def read_config
    JSON.parse(File.read(config_file))
  rescue Errno::ENOENT
    raise JudoError, "No config file #{config_file}"
end

#s3_urlObject



74
75
76
# File 'lib/judo/group.rb', line 74

def s3_url
  @url = @base.s3_url(tar_file)
end

#sdbObject



178
179
180
# File 'lib/judo/group.rb', line 178

def sdb
  @base.sdb
end

#server_namesObject



19
20
21
# File 'lib/judo/group.rb', line 19

def server_names
  @server_names ||= (@base.groups_config[@name] || [])
end

#serversObject



23
24
25
# File 'lib/judo/group.rb', line 23

def servers
  @base.servers.select { |s| server_names.include?(s.name) }
end

#set_versionObject



33
34
35
# File 'lib/judo/group.rb', line 33

def set_version
  @base.sdb.put_attributes("judo_config", "group_versions", { name => version }, :replace)
end

#tar_fileObject



70
71
72
# File 'lib/judo/group.rb', line 70

def tar_file
  "#{name}.#{version}.tar.gz"
end

#to_sObject



174
175
176
# File 'lib/judo/group.rb', line 174

def to_s
  ":#{name}"
end

#version_config_fileObject



66
67
68
# File 'lib/judo/group.rb', line 66

def version_config_file
  "#{name}.#{version}.json"
end

#version_desc(v) ⇒ Object



182
183
184
185
186
187
188
# File 'lib/judo/group.rb', line 182

def version_desc(v)
  if v == version
    "v#{v}"
  else
    "v#{v}/#{version}"
  end
end