class Chef::Knife::EnvironmentCompare
def constraint_list(environments)
def constraint_list(environments) constraints = {} environments.each do |env, url| # rubocop:disable Style/HashEachMethods # Because you cannot modify the default environment I filter it out here. unless env == "_default" envdata = Chef::Environment.load(env) ver = envdata.cookbook_versions constraints[env] = ver end end constraints end
def cookbook_list(constraints)
def cookbook_list(constraints) result = {} constraints.each_value { |cb| result.merge!(cb) } result end
def environment_list
def environment_list environments = [] unless @name_args.nil? || @name_args.empty? @name_args.each { |name| environments << name } else environments = Chef::Environment.list end end
def matrix_output(cookbooks, constraints)
def matrix_output(cookbooks, constraints) rows = [ "" ] environments = [] constraints.each_key { |e| environments << e.to_s } columns = environments.count + 1 environments.each { |env| rows << ui.color(env, :bold) } cookbooks.each_key do |c| total = [] environments.each { |n| total << constraints[n][c] } if total.uniq.count == 1 next if config[:mismatch] color = :white else color = :yellow end rows << ui.color(c, :bold) environments.each do |e| tag = constraints[e][c] || "latest" rows << ui.color(tag, color) end end ui.list(rows, :uneven_columns_across, columns) end
def run
def run # Get the commandline environments or all if none are provided. environments = environment_list # Get a list of all cookbooks that have constraints and their environment. constraints = constraint_list(environments) # Get the total list of cookbooks that have constraints cookbooks = cookbook_list(constraints) # If we cannot find any cookbooks, we can stop here. if cookbooks.nil? || cookbooks.empty? ui.error "Cannot find any environment cookbook constraints" exit 1 end # Get all cookbooks so we can compare them all cookbooks = rest.get("/cookbooks?num_versions=1") if config[:all] # display matrix view of in the requested format. if config[:format] == "summary" matrix = matrix_output(cookbooks, constraints) ui.output(matrix) else ui.output(constraints) end end