Class: Chef::Environment

Inherits:
Object
  • Object
show all
Includes:
Mixin::FromFile, Mixin::ParamsValidate
Defined in:
lib/chef/environment.rb

Constant Summary collapse

DEFAULT =
"default"
COMBINED_COOKBOOK_CONSTRAINT =
/(.+)(?:[\s]+)((?:#{Chef::VersionConstraint::OPS.join('|')})(?:[\s]+).+)$/.freeze

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Mixin::FromFile

#class_from_file, #from_file

Methods included from Mixin::ParamsValidate

#lazy, #set_or_return, #validate

Constructor Details

#initialize(chef_server_rest: nil) ⇒ Environment

Returns a new instance of Environment.



40
41
42
43
44
45
46
47
# File 'lib/chef/environment.rb', line 40

def initialize(chef_server_rest: nil)
  @name = ''
  @description = ''
  @default_attributes = Mash.new
  @override_attributes = Mash.new
  @cookbook_versions = Hash.new
  @chef_server_rest = chef_server_rest
end

Instance Attribute Details

#chef_server_restObject

Returns the value of attribute chef_server_rest.



36
37
38
# File 'lib/chef/environment.rb', line 36

def chef_server_rest
  @chef_server_rest
end

Class Method Details

.chef_server_restObject



53
54
55
# File 'lib/chef/environment.rb', line 53

def self.chef_server_rest
  Chef::REST.new(Chef::Config[:chef_server_url])
end

.json_create(o) ⇒ Object



218
219
220
221
222
223
224
225
226
# File 'lib/chef/environment.rb', line 218

def self.json_create(o)
  environment = new
  environment.name(o["name"])
  environment.description(o["description"])
  environment.cookbook_versions(o["cookbook_versions"])
  environment.default_attributes(o["default_attributes"])
  environment.override_attributes(o["override_attributes"])
  environment
end

.list(inflate = false) ⇒ Object



228
229
230
231
232
233
234
235
236
237
238
# File 'lib/chef/environment.rb', line 228

def self.list(inflate=false)
  if inflate
    response = Hash.new
    Chef::Search::Query.new.search(:environment) do |e|
      response[e.name] = e unless e.nil?
    end
    response
  else
    chef_server_rest.get_rest("environments")
  end
end

.load(name) ⇒ Object



240
241
242
243
244
245
246
# File 'lib/chef/environment.rb', line 240

def self.load(name)
  if Chef::Config[:solo]
    load_from_file(name)
  else
    chef_server_rest.get_rest("environments/#{name}")
  end
end

.load_filtered_recipe_list(environment) ⇒ Object



288
289
290
# File 'lib/chef/environment.rb', line 288

def self.load_filtered_recipe_list(environment)
  chef_server_rest.get_rest("environments/#{environment}/recipes")
end

.load_from_file(name) ⇒ Object



248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
# File 'lib/chef/environment.rb', line 248

def self.load_from_file(name)
  unless File.directory?(Chef::Config[:environment_path])
    raise Chef::Exceptions::InvalidEnvironmentPath, "Environment path '#{Chef::Config[:environment_path]}' is invalid"
  end

  js_file = File.join(Chef::Config[:environment_path], "#{name}.json")
  rb_file = File.join(Chef::Config[:environment_path], "#{name}.rb")

  if File.exists?(js_file)
    # from_json returns object.class => json_class in the JSON.
    Chef::JSONCompat.from_json(IO.read(js_file))
  elsif File.exists?(rb_file)
    environment = Chef::Environment.new
    environment.name(name)
    environment.from_file(rb_file)
    environment
  else
    raise Chef::Exceptions::EnvironmentNotFound, "Environment '#{name}' could not be loaded from disk"
  end
end

.validate_cookbook_version(version) ⇒ Object



304
305
306
307
308
309
310
311
312
313
314
315
316
# File 'lib/chef/environment.rb', line 304

def self.validate_cookbook_version(version)
  begin
    if Chef::Config[:solo]
      raise Chef::Exceptions::IllegalVersionConstraint,
            "Environment cookbook version constraints not allowed in chef-solo"
    else
      Chef::VersionConstraint.new version
      true
    end
  rescue ArgumentError
    false
  end
end

.validate_cookbook_versions(cv) ⇒ Object



296
297
298
299
300
301
302
# File 'lib/chef/environment.rb', line 296

def self.validate_cookbook_versions(cv)
  return false unless cv.kind_of?(Hash)
  cv.each do |cookbook, version|
    return false unless Chef::Environment.validate_cookbook_version(version)
  end
  true
end

Instance Method Details

#add_cookbook_constraint_error(index, cookbook_constraint_spec) ⇒ Object



200
201
202
203
# File 'lib/chef/environment.rb', line 200

def add_cookbook_constraint_error(index, cookbook_constraint_spec)
  invalid_fields[:cookbook_version] ||= {}
  invalid_fields[:cookbook_version][index] = "#{cookbook_constraint_spec} is not a valid cookbook constraint"
end

#cookbook(cookbook, version) ⇒ Object



110
111
112
113
114
115
116
117
118
119
# File 'lib/chef/environment.rb', line 110

def cookbook(cookbook, version)
  validate({
    :version => version
  },{
    :version => {
      :callbacks => { "should be a valid version requirement" => lambda { |v| Chef::Environment.validate_cookbook_version(v) } }
    }
  })
  @cookbook_versions[cookbook] = version
end

#cookbook_versions(arg = nil) ⇒ Object



97
98
99
100
101
102
103
104
105
106
107
108
# File 'lib/chef/environment.rb', line 97

def cookbook_versions(arg=nil)
  set_or_return(
    :cookbook_versions,
    arg,
    {
      :kind_of => Hash,
      :callbacks => {
        "should be a valid set of cookbook version requirements" => lambda { |cv| Chef::Environment.validate_cookbook_versions(cv) }
      }
    }
  )
end

#createObject



283
284
285
286
# File 'lib/chef/environment.rb', line 283

def create
  chef_server_rest.post_rest("environments", self)
  self
end

#default_attributes(arg = nil) ⇒ Object



73
74
75
76
77
78
79
# File 'lib/chef/environment.rb', line 73

def default_attributes(arg=nil)
  set_or_return(
    :default_attributes,
    arg,
    :kind_of => Hash
  )
end

#default_attributes=(attrs) ⇒ Object



81
82
83
# File 'lib/chef/environment.rb', line 81

def default_attributes=(attrs)
  default_attributes(attrs)
end

#description(arg = nil) ⇒ Object



65
66
67
68
69
70
71
# File 'lib/chef/environment.rb', line 65

def description(arg=nil)
  set_or_return(
    :description,
    arg,
    :kind_of => String
  )
end

#destroyObject



269
270
271
# File 'lib/chef/environment.rb', line 269

def destroy
  chef_server_rest.delete_rest("environments/#{@name}")
end

#invalid_fieldsObject



205
206
207
# File 'lib/chef/environment.rb', line 205

def invalid_fields
  @invalid_fields ||= {}
end

#name(arg = nil) ⇒ Object



57
58
59
60
61
62
63
# File 'lib/chef/environment.rb', line 57

def name(arg=nil)
  set_or_return(
    :name,
    arg,
    { :regex => /^[\-[:alnum:]_]+$/, :kind_of => String }
  )
end

#override_attributes(arg = nil) ⇒ Object



85
86
87
88
89
90
91
# File 'lib/chef/environment.rb', line 85

def override_attributes(arg=nil)
  set_or_return(
    :override_attributes,
    arg,
    :kind_of => Hash
  )
end

#override_attributes=(attrs) ⇒ Object



93
94
95
# File 'lib/chef/environment.rb', line 93

def override_attributes=(attrs)
  override_attributes(attrs)
end

#saveObject



273
274
275
276
277
278
279
280
281
# File 'lib/chef/environment.rb', line 273

def save
  begin
    chef_server_rest.put_rest("environments/#{@name}", self)
  rescue Net::HTTPServerException => e
    raise e unless e.response.code == "404"
    chef_server_rest.post_rest("environments", self)
  end
  self
end

#to_hashObject



121
122
123
124
125
126
127
128
129
130
131
132
# File 'lib/chef/environment.rb', line 121

def to_hash
  result = {
    "name" => @name,
    "description" => @description,
    "cookbook_versions" =>  @cookbook_versions,
    "json_class" => self.class.name,
    "chef_type" => "environment",
    "default_attributes" => @default_attributes,
    "override_attributes" => @override_attributes
  }
  result
end

#to_json(*a) ⇒ Object



134
135
136
# File 'lib/chef/environment.rb', line 134

def to_json(*a)
  Chef::JSONCompat.to_json(to_hash, *a)
end

#to_sObject



292
293
294
# File 'lib/chef/environment.rb', line 292

def to_s
  @name
end

#update_attributes_from_params(params) ⇒ Object



146
147
148
149
150
151
152
153
# File 'lib/chef/environment.rb', line 146

def update_attributes_from_params(params)
  unless params[:default_attributes].nil? || params[:default_attributes].size == 0
    default_attributes(Chef::JSONCompat.from_json(params[:default_attributes]))
  end
  unless params[:override_attributes].nil? || params[:override_attributes].size == 0
    override_attributes(Chef::JSONCompat.from_json(params[:override_attributes]))
  end
end

#update_cookbook_constraint_from_param(index, cookbook_constraint_spec) ⇒ Object



185
186
187
188
189
190
191
192
193
194
195
196
197
198
# File 'lib/chef/environment.rb', line 185

def update_cookbook_constraint_from_param(index, cookbook_constraint_spec)
  valid = true
  md = cookbook_constraint_spec.match(COMBINED_COOKBOOK_CONSTRAINT)
  if md.nil? || md[2].nil?
    valid = false
    add_cookbook_constraint_error(index, cookbook_constraint_spec)
  elsif self.class.validate_cookbook_version(md[2])
    cookbook_versions[md[1]] = md[2]
  else
    valid = false
    add_cookbook_constraint_error(index, cookbook_constraint_spec)
  end
  valid
end

#update_from!(o) ⇒ Object



138
139
140
141
142
143
144
# File 'lib/chef/environment.rb', line 138

def update_from!(o)
  description(o.description)
  cookbook_versions(o.cookbook_versions)
  default_attributes(o.default_attributes)
  override_attributes(o.override_attributes)
  self
end

#update_from_params(params) ⇒ Object



155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
# File 'lib/chef/environment.rb', line 155

def update_from_params(params)
  # reset because everything we need will be in the params, this is necessary because certain constraints
  # may have been removed in the params and need to be removed from cookbook_versions as well.
  bkup_cb_versions = cookbook_versions
  cookbook_versions(Hash.new)
  valid = true

  begin
    name(params[:name])
  rescue Chef::Exceptions::ValidationFailed => e
    invalid_fields[:name] = e.message
    valid = false
  end
  description(params[:description])

  unless params[:cookbook_version].nil?
    params[:cookbook_version].each do |index, cookbook_constraint_spec|
      unless (cookbook_constraint_spec.nil? || cookbook_constraint_spec.size == 0)
        valid = valid && update_cookbook_constraint_from_param(index, cookbook_constraint_spec)
      end
    end
  end

  update_attributes_from_params(params)

  valid = validate_required_attrs_present && valid
  cookbook_versions(bkup_cb_versions) unless valid # restore the old cookbook_versions if valid is false
  valid
end

#validate_required_attrs_presentObject



209
210
211
212
213
214
215
216
# File 'lib/chef/environment.rb', line 209

def validate_required_attrs_present
  if name.nil? || name.size == 0
    invalid_fields[:name] ||= "name cannot be empty"
    false
  else
    true
  end
end