Class: ChefCLI::PolicyfileServices::Install
Instance Attribute Summary collapse
Instance Method Summary
collapse
Methods included from Helpers
#err, #git_bin_dir, #git_windows_bin_dir, #msg, #omnibus_bin_dir, #omnibus_embedded_bin_dir, #omnibus_env, #omnibus_expand_path, #omnibus_install?, #omnibus_root, #package_home, #stderr, #stdout, #system_command, #usr_bin_path, #usr_bin_prefix
#cache_path, #policyfile_expanded_path, #policyfile_filename, #policyfile_lock_expanded_path, #relative_paths_root
Constructor Details
#initialize(policyfile: nil, ui: nil, root_dir: nil, overwrite: false, config: nil) ⇒ Install
Returns a new instance of Install.
40
41
42
43
44
45
46
47
48
49
50
51
|
# File 'lib/chef-cli/policyfile_services/install.rb', line 40
def initialize(policyfile: nil, ui: nil, root_dir: nil, overwrite: false, config: nil)
@ui = ui
@overwrite = overwrite
@chef_config = config
@policyfile_rel_path = policyfile || "Policyfile.rb"
policyfile_full_path = File.expand_path(@policyfile_rel_path, root_dir)
@storage_config = Policyfile::StorageConfig.new.use_policyfile(policyfile_full_path)
@policyfile_content = nil
@policyfile_compiler = nil
end
|
Instance Attribute Details
#chef_config ⇒ Object
Returns the value of attribute chef_config.
38
39
40
|
# File 'lib/chef-cli/policyfile_services/install.rb', line 38
def chef_config
@chef_config
end
|
#overwrite ⇒ Object
Returns the value of attribute overwrite.
37
38
39
|
# File 'lib/chef-cli/policyfile_services/install.rb', line 37
def overwrite
@overwrite
end
|
#storage_config ⇒ Object
Returns the value of attribute storage_config.
36
37
38
|
# File 'lib/chef-cli/policyfile_services/install.rb', line 36
def storage_config
@storage_config
end
|
#ui ⇒ Object
Returns the value of attribute ui.
35
36
37
|
# File 'lib/chef-cli/policyfile_services/install.rb', line 35
def ui
@ui
end
|
Instance Method Details
#expanded_run_list ⇒ Object
79
80
81
|
# File 'lib/chef-cli/policyfile_services/install.rb', line 79
def expanded_run_list
policyfile_compiler.expanded_run_list.to_s
end
|
#generate_lock_and_install ⇒ Object
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
|
# File 'lib/chef-cli/policyfile_services/install.rb', line 96
def generate_lock_and_install
policyfile_compiler.error!
ui.msg "Building policy #{policyfile_compiler.name}"
ui.msg "Expanded run list: " + expanded_run_list + "\n"
ui.msg "Caching Cookbooks..."
policyfile_compiler.install
lock_data = policyfile_compiler.lock.to_lock
with_file(policyfile_lock_expanded_path) do |f|
f.print(FFI_Yajl::Encoder.encode(lock_data, pretty: true ))
end
ui.msg ""
ui.msg "Lockfile written to #{policyfile_lock_expanded_path}"
ui.msg "Policy revision id: #{lock_data["revision_id"]}"
rescue => error
raise PolicyfileInstallError.new("Failed to generate Policyfile.lock", error)
end
|
#install_from_lock ⇒ Object
159
160
161
162
163
164
165
|
# File 'lib/chef-cli/policyfile_services/install.rb', line 159
def install_from_lock
ui.msg "Installing cookbooks from lock"
policyfile_lock.install_cookbooks
rescue => error
raise PolicyfileInstallError.new("Failed to install cookbooks from lockfile", error)
end
|
#installing_from_lock? ⇒ Boolean
167
168
169
|
# File 'lib/chef-cli/policyfile_services/install.rb', line 167
def installing_from_lock?
!@overwrite && File.exist?(policyfile_lock_expanded_path)
end
|
#policyfile_compiler ⇒ Object
75
76
77
|
# File 'lib/chef-cli/policyfile_services/install.rb', line 75
def policyfile_compiler
@policyfile_compiler ||= ChefCLI::PolicyfileCompiler.evaluate(policyfile_content, policyfile_expanded_path, ui:, chef_config:)
end
|
#policyfile_content ⇒ Object
71
72
73
|
# File 'lib/chef-cli/policyfile_services/install.rb', line 71
def policyfile_content
@policyfile_content ||= IO.read(policyfile_expanded_path)
end
|
#policyfile_lock ⇒ Object
87
88
89
90
91
92
93
94
|
# File 'lib/chef-cli/policyfile_services/install.rb', line 87
def policyfile_lock
return nil if policyfile_lock_content.nil?
@policyfile_lock ||= begin
lock_data = FFI_Yajl::Parser.new.parse(policyfile_lock_content)
PolicyfileLock.new(storage_config, ui:).build_from_lock_data(lock_data)
end
end
|
#policyfile_lock_content ⇒ Object
83
84
85
|
# File 'lib/chef-cli/policyfile_services/install.rb', line 83
def policyfile_lock_content
@policyfile_lock_content ||= IO.read(policyfile_lock_expanded_path) if File.exist?(policyfile_lock_expanded_path)
end
|
#prepare_constraints_for_policies ⇒ Object
151
152
153
154
155
156
157
|
# File 'lib/chef-cli/policyfile_services/install.rb', line 151
def prepare_constraints_for_policies
Policyfile::LockApplier
.new(policyfile_lock, policyfile_compiler)
.with_unlocked_policies(:all)
.apply!
end
|
#prepare_constraints_for_update(to_update) ⇒ Object
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
|
# File 'lib/chef-cli/policyfile_services/install.rb', line 132
def prepare_constraints_for_update(to_update)
ui.msg "Will relax constraints on:"
to_update.each do |ck|
ui.msg " - #{ck}"
end
policyfile_lock.cookbook_locks.each do |ck_name, location_spec|
next if to_update.include?(ck_name)
policyfile_compiler.dsl.cookbook_location_specs[ck_name] = Policyfile::CookbookLocationSpecification.new(
ck_name,
Semverse::Constraint.new("=#{location_spec.version}"),
location_spec.source_options,
location_spec.storage_config
)
end
end
|
#run(cookbooks_to_update = [], exclude_deps = false) ⇒ Object
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
|
# File 'lib/chef-cli/policyfile_services/install.rb', line 53
def run(cookbooks_to_update = [], exclude_deps = false)
if @policyfile_rel_path.end_with?(".lock.json") && !File.exist?(policyfile_lock_expanded_path)
raise PolicyfileNotFound, "Policyfile lock not found at path #{policyfile_lock_expanded_path}"
elsif @policyfile_rel_path.end_with?(".rb") && !File.exist?(policyfile_expanded_path)
raise PolicyfileNotFound, "Policyfile not found at path #{policyfile_expanded_path}"
end
if installing_from_lock?
install_from_lock
elsif cookbooks_to_update.empty? || policyfile_lock.nil? generate_lock_and_install
else
update_lock_and_install(cookbooks_to_update, exclude_deps)
end
end
|
#update_lock_and_install(cookbooks_to_update, exclude_deps) ⇒ Object
120
121
122
123
124
125
126
127
128
129
130
|
# File 'lib/chef-cli/policyfile_services/install.rb', line 120
def update_lock_and_install(cookbooks_to_update, exclude_deps)
ui.msg "Updating #{cookbooks_to_update.join(",")} cookbooks #{exclude_deps ? "(excluding dependencies)" : ""}"
to_update = if exclude_deps
cookbooks_to_update
else
policyfile_lock.solution_dependencies.transitive_deps(cookbooks_to_update)
end
prepare_constraints_for_update(to_update)
prepare_constraints_for_policies
generate_lock_and_install
end
|