lib/chef/knife/cookbook_download.rb in knife-17.10.95 vs lib/chef/knife/cookbook_download.rb in knife-17.10.163

- old
+ new

@@ -1,142 +1,142 @@ -# -# Author:: Adam Jacob (<adam@chef.io>) -# Author:: Christopher Walters (<cw@chef.io>) -# Copyright:: Copyright (c) Chef Software Inc. -# License:: Apache License, Version 2.0 -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -require_relative "../knife" - -class Chef - class Knife - class CookbookDownload < Knife - - attr_reader :version - attr_accessor :cookbook_name - - deps do - require "chef/cookbook_version" unless defined?(Chef::CookbookVersion) - end - - banner "knife cookbook download COOKBOOK [VERSION] (options)" - - option :latest, - short: "-N", - long: "--latest", - description: "The version of the cookbook to download.", - boolean: true - - option :download_directory, - short: "-d DOWNLOAD_DIRECTORY", - long: "--dir DOWNLOAD_DIRECTORY", - description: "The directory to download the cookbook into.", - default: Dir.pwd - - option :force, - short: "-f", - long: "--force", - description: "Force download over the download directory if it exists." - - # TODO: tim/cw: 5-23-2010: need to implement knife-side - # specificity for downloads - need to implement --platform and - # --fqdn here - def run - @cookbook_name, @version = @name_args - - if @cookbook_name.nil? - show_usage - ui.fatal("You must specify a cookbook name") - exit 1 - elsif @version.nil? - @version = determine_version - if @version.nil? - ui.fatal("No such cookbook found") - exit 1 - end - end - - ui.info("Downloading #{@cookbook_name} cookbook version #{@version}") - - cookbook = Chef::CookbookVersion.load(@cookbook_name, @version) - manifest = cookbook.cookbook_manifest - - basedir = File.join(config[:download_directory], "#{@cookbook_name}-#{cookbook.version}") - if File.exist?(basedir) - if config[:force] - Chef::Log.trace("Deleting #{basedir}") - FileUtils.rm_rf(basedir) - else - ui.fatal("Directory #{basedir} exists, use --force to overwrite") - exit - end - end - - manifest.by_parent_directory.each do |segment, files| - ui.info("Downloading #{segment}") - files.each do |segment_file| - dest = File.join(basedir, segment_file["path"].gsub("/", File::SEPARATOR)) - Chef::Log.trace("Downloading #{segment_file["path"]} to #{dest}") - FileUtils.mkdir_p(File.dirname(dest)) - tempfile = rest.streaming_request(segment_file["url"]) - FileUtils.mv(tempfile.path, dest) - end - end - ui.info("Cookbook downloaded to #{basedir}") - end - - def determine_version - if available_versions.nil? - nil - elsif available_versions.size == 1 - @version = available_versions.first - elsif config[:latest] - @version = available_versions.last - else - ask_which_version - end - end - - def available_versions - @available_versions ||= begin - versions = Chef::CookbookVersion.available_versions(@cookbook_name) - unless versions.nil? - versions.map! { |version| Chef::Version.new(version) } - versions.sort! - end - versions - end - @available_versions - end - - def ask_which_version - question = "Which version do you want to download?\n" - valid_responses = {} - available_versions.each_with_index do |version, index| - valid_responses[(index + 1).to_s] = version - question << "#{index + 1}. #{@cookbook_name} #{version}\n" - end - question += "\n" - response = ask_question(question).strip - - unless @version = valid_responses[response] - ui.error("'#{response}' is not a valid value.") - exit(1) - end - @version - end - - end - end -end +# +# Author:: Adam Jacob (<adam@chef.io>) +# Author:: Christopher Walters (<cw@chef.io>) +# Copyright:: Copyright (c) Chef Software Inc. +# License:: Apache License, Version 2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +require_relative "../knife" + +class Chef + class Knife + class CookbookDownload < Knife + + attr_reader :version + attr_accessor :cookbook_name + + deps do + require "chef/cookbook_version" unless defined?(Chef::CookbookVersion) + end + + banner "knife cookbook download COOKBOOK [VERSION] (options)" + + option :latest, + short: "-N", + long: "--latest", + description: "The version of the cookbook to download.", + boolean: true + + option :download_directory, + short: "-d DOWNLOAD_DIRECTORY", + long: "--dir DOWNLOAD_DIRECTORY", + description: "The directory to download the cookbook into.", + default: Dir.pwd + + option :force, + short: "-f", + long: "--force", + description: "Force download over the download directory if it exists." + + # TODO: tim/cw: 5-23-2010: need to implement knife-side + # specificity for downloads - need to implement --platform and + # --fqdn here + def run + @cookbook_name, @version = @name_args + + if @cookbook_name.nil? + show_usage + ui.fatal("You must specify a cookbook name") + exit 1 + elsif @version.nil? + @version = determine_version + if @version.nil? + ui.fatal("No such cookbook found") + exit 1 + end + end + + ui.info("Downloading #{@cookbook_name} cookbook version #{@version}") + + cookbook = Chef::CookbookVersion.load(@cookbook_name, @version) + manifest = cookbook.cookbook_manifest + + basedir = File.join(config[:download_directory], "#{@cookbook_name}-#{cookbook.version}") + if File.exist?(basedir) + if config[:force] + Chef::Log.trace("Deleting #{basedir}") + FileUtils.rm_rf(basedir) + else + ui.fatal("Directory #{basedir} exists, use --force to overwrite") + exit + end + end + + manifest.by_parent_directory.each do |segment, files| + ui.info("Downloading #{segment}") + files.each do |segment_file| + dest = File.join(basedir, segment_file["path"].gsub("/", File::SEPARATOR)) + Chef::Log.trace("Downloading #{segment_file["path"]} to #{dest}") + FileUtils.mkdir_p(File.dirname(dest)) + tempfile = rest.streaming_request(segment_file["url"]) + FileUtils.mv(tempfile.path, dest) + end + end + ui.info("Cookbook downloaded to #{basedir}") + end + + def determine_version + if available_versions.nil? + nil + elsif available_versions.size == 1 + @version = available_versions.first + elsif config[:latest] + @version = available_versions.last + else + ask_which_version + end + end + + def available_versions + @available_versions ||= begin + versions = Chef::CookbookVersion.available_versions(@cookbook_name) + unless versions.nil? + versions.map! { |version| Chef::Version.new(version) } + versions.sort! + end + versions + end + @available_versions + end + + def ask_which_version + question = "Which version do you want to download?\n" + valid_responses = {} + available_versions.each_with_index do |version, index| + valid_responses[(index + 1).to_s] = version + question << "#{index + 1}. #{@cookbook_name} #{version}\n" + end + question += "\n" + response = ask_question(question).strip + + unless @version = valid_responses[response] + ui.error("'#{response}' is not a valid value.") + exit(1) + end + @version + end + + end + end +end