{"action":"created","issue":{"url":"https://api.github.com/repos/sethvargo/stove/issues/72","labels_url":"https://api.github.com/repos/sethvargo/stove/issues/72/labels{/name}","comments_url":"https://api.github.com/repos/sethvargo/stove/issues/72/comments","events_url":"https://api.github.com/repos/sethvargo/stove/issues/72/events","html_url":"https://github.com/sethvargo/stove/issues/72","id":62739748,"number":72,"title":"Stove cannot publish to behind the firewall Supermarket","user":{"login":"rylarson","id":2703404,"avatar_url":"https://avatars.githubusercontent.com/u/2703404?v=3","gravatar_id":"","url":"https://api.github.com/users/rylarson","html_url":"https://github.com/rylarson","followers_url":"https://api.github.com/users/rylarson/followers","following_url":"https://api.github.com/users/rylarson/following{/other_user}","gists_url":"https://api.github.com/users/rylarson/gists{/gist_id}","starred_url":"https://api.github.com/users/rylarson/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rylarson/subscriptions","organizations_url":"https://api.github.com/users/rylarson/orgs","repos_url":"https://api.github.com/users/rylarson/repos","events_url":"https://api.github.com/users/rylarson/events{/privacy}","received_events_url":"https://api.github.com/users/rylarson/received_events","type":"User","site_admin":false},"labels":[{"url":"https://api.github.com/repos/sethvargo/stove/labels/Bug","name":"Bug","color":"F01A00"}],"state":"open","locked":false,"assignee":null,"milestone":null,"comments":18,"created_at":"2015-03-18T16:49:23Z","updated_at":"2015-04-09T10:13:42Z","closed_at":null,"body":"I use stove to publish the cygwin cookbook to the community site, and it works fine. But when I try to publish the same cookbook to my behind the firewall community site, I get the following error (with personal info redacted):\r\n\r\n```\r\n$ stove --endpoint https://supermarket.example.com/api/v1 --username user --key /Users/user/user.pem --no-git --log-level=debug\r\nW: No config file found at `/Users/user/.stove'!\r\n                      Stove::Cli | ===> Options: {:endpoint=>\"https://supermarket.example.com/api/v1\", :username=>\"user\", :key=>\"/Users/user/user.pem\", :remote=>\"origin\", :branch=>\"master\", :sign=>false, :log_level=>\"debug\", :path=>\"/Users/user/working/chef-cygwin\", :no_git=>true}\r\n                      Stove::Cli | ===> ARGV: []\r\n                   Stove::Runner | ===> Skipping plugin `:git'\r\n                   Stove::Runner | ===> Running plugin `:community'\r\n                Stove::Validator | ===> Running validations for `community.username'\r\n                Stove::Validator |      Validation username passed!\r\n                Stove::Validator | ===> Running validations for `community.key'\r\n                Stove::Validator |      Validation key passed!\r\n        Stove::Plugin::Community | ===> Publishing the release to the Chef community site\r\n             ChefAPI::Connection | ===> POST cookbooks...\r\n             ChefAPI::Connection |      Chef flavor: :open_source\r\n             ChefAPI::Connection | ===> Building URI...\r\n             ChefAPI::Connection |      Detected URI is relative\r\n             ChefAPI::Connection |      Appending cookbooks to https://supermarket.example.com/api/v1\r\n             ChefAPI::Connection | ===> Adding request headers...\r\n             ChefAPI::Connection |      Accept: application/json\r\n             ChefAPI::Connection |      Content-Type: application/json\r\n             ChefAPI::Connection |      Connection: keep-alive\r\n             ChefAPI::Connection |      Keep-Alive: 30\r\n             ChefAPI::Connection |      User-Agent: ChefAPI Ruby Gem 0.5.0\r\n             ChefAPI::Connection |      X-Chef-Version: 11.4.0\r\n             ChefAPI::Connection | ===> Detected multipart body\r\n             ChefAPI::Connection |      Content-Type: multipart/form-data; boundary=------ChefAPIMultipartBoundary\r\n             ChefAPI::Connection |      Content-Length: 2809\r\n             ChefAPI::Connection | ===> Adding signed header authentication...\r\n         ChefAPI::Authentication | ===> Parsing private key...\r\n         ChefAPI::Authentication |      Detected private key is the path to a file\r\n             ChefAPI::Connection |      X-Ops-Sign: algorithm=sha1;version=1.0;\r\n             ChefAPI::Connection |      X-Ops-Userid: user\r\n             ChefAPI::Connection |      X-Ops-Timestamp: 2015-03-18T16:01:34Z\r\n             ChefAPI::Connection |      X-Ops-Content-Hash: XXXXXXXXXXXXXXXXXXXXXXXXXXX=\r\n             ChefAPI::Connection |      X-Ops-Authorization-1: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\r\n             ChefAPI::Connection |      X-Ops-Authorization-2: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\r\n             ChefAPI::Connection |      X-Ops-Authorization-3: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\r\n             ChefAPI::Connection |      X-Ops-Authorization-4: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\r\n             ChefAPI::Connection |      X-Ops-Authorization-5: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\r\n             ChefAPI::Connection |      X-Ops-Authorization-6: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\r\n             ChefAPI::Connection | **** Disabling SSL verification...\r\n             ChefAPI::Connection | **** Neither ChefAPI nor the maintainers are responsible for damanges incurred as a result of disabling SSL verification. Please use this with extreme caution, or consider specifying a custom certificate using `config.ssl_pem_file'.\r\n             ChefAPI::Connection |      Raw response:\r\n             ChefAPI::Connection |      {\"error_code\":\"INVALID_DATA\",\"error_messages\":[\"The metadata is formatted incorrectly.\",\"Multipart POST part 'tarball' must contain a non-empty README.\"]}\r\n             ChefAPI::Connection | ===> Parsing response as error...\r\n             ChefAPI::Connection |      Detected error response as JSON\r\n             ChefAPI::Connection |      Parsing error response as JSON\r\n                      Stove::Cli | >>>> Stove experienced an error!\r\n                      Stove::Cli | >>>> ChefAPI::Error::HTTPBadRequest\r\n                      Stove::Cli | >>>> The Chef Server did not understand the request because it was malformed.\r\n\r\n    {\"error_code\"=>\"INVALID_DATA\", \"error_messages\"=>[\"The metadata is formatted incorrectly.\", \"Multipart POST part 'tarball' must contain a non-empty README.\"]}\r\n\r\n                      Stove::Cli | >>>> /Users/user/.rvm/gems/ruby-2.0.0-p451/gems/chef-api-0.5.0/lib/chef-api/connection.rb:411:in `error'\r\n/Users/user/.rvm/gems/ruby-2.0.0-p451/gems/chef-api-0.5.0/lib/chef-api/connection.rb:282:in `block in request'\r\n/Users/user/.rvm/rubies/ruby-2.0.0-p451/lib/ruby/2.0.0/net/http.rb:852:in `start'\r\n/Users/user/.rvm/gems/ruby-2.0.0-p451/gems/chef-api-0.5.0/lib/chef-api/connection.rb:268:in `request'\r\n/Users/user/.rvm/gems/ruby-2.0.0-p451/gems/chef-api-0.5.0/lib/chef-api/connection.rb:122:in `post'\r\n/Users/user/.rvm/gems/ruby-2.0.0-p451/gems/stove-3.2.6/lib/stove/community.rb:54:in `upload'\r\n/Users/user/.rvm/gems/ruby-2.0.0-p451/gems/stove-3.2.6/lib/stove/mixins/instanceable.rb:20:in `method_missing'\r\n/Users/user/.rvm/gems/ruby-2.0.0-p451/gems/stove-3.2.6/lib/stove/plugins/community.rb:15:in `block in <class:Community>'\r\n/Users/user/.rvm/gems/ruby-2.0.0-p451/gems/stove-3.2.6/lib/stove/plugins/base.rb:12:in `instance_eval'\r\n/Users/user/.rvm/gems/ruby-2.0.0-p451/gems/stove-3.2.6/lib/stove/plugins/base.rb:12:in `block in run'\r\n/Users/user/.rvm/gems/ruby-2.0.0-p451/gems/stove-3.2.6/lib/stove/plugins/base.rb:44:in `call'\r\n/Users/user/.rvm/gems/ruby-2.0.0-p451/gems/stove-3.2.6/lib/stove/plugins/base.rb:44:in `block in run_actions'\r\n/Users/user/.rvm/gems/ruby-2.0.0-p451/gems/stove-3.2.6/lib/stove/plugins/base.rb:43:in `each'\r\n/Users/user/.rvm/gems/ruby-2.0.0-p451/gems/stove-3.2.6/lib/stove/plugins/base.rb:43:in `run_actions'\r\n/Users/user/.rvm/gems/ruby-2.0.0-p451/gems/stove-3.2.6/lib/stove/plugins/base.rb:33:in `run'\r\n/Users/user/.rvm/gems/ruby-2.0.0-p451/gems/stove-3.2.6/lib/stove/runner.rb:26:in `run_plugin'\r\n/Users/user/.rvm/gems/ruby-2.0.0-p451/gems/stove-3.2.6/lib/stove/runner.rb:15:in `run'\r\n/Users/user/.rvm/gems/ruby-2.0.0-p451/gems/stove-3.2.6/lib/stove/cli.rb:71:in `execute!'\r\n/Users/user/.rvm/gems/ruby-2.0.0-p451/gems/stove-3.2.6/bin/stove:4:in `<top (required)>'\r\n/Users/user/.rvm/gems/ruby-2.0.0-p451/bin/stove:23:in `load'\r\n/Users/user/.rvm/gems/ruby-2.0.0-p451/bin/stove:23:in `<main>'\r\n/Users/user/.rvm/gems/ruby-2.0.0-p451/bin/ruby_executable_hooks:15:in `eval'\r\n/Users/user/.rvm/gems/ruby-2.0.0-p451/bin/ruby_executable_hooks:15:in `<main>'\r\n```\r\n\r\nHowever, when I use knife-supermarket, I can upload just fine:\r\n\r\n```\r\n$ knife supermarket share -m https://supermarket.example.com cygwin -o cookbooks/ -k /Users/user/user.pem -u user -V\r\nINFO: Using configuration from /Users/user/chef-repo/knife.rb\r\nINFO: Unable to access cache at /var/chef. Switching cache to /Users/user/.chef\r\nINFO: Validating ruby files\r\nINFO: Validating templates\r\nINFO: Syntax OK\r\nGenerating metadata for cygwin from /var/folders/27/6sg87fpd6cq4jy8_510gpxl08wv5x0/T/chef-cygwin-build20150318-28396-bnknz6/cygwin/metadata.rb\r\nMaking tarball cygwin.tgz\r\nUpload complete!\r\n```\r\n\r\nThe cookbook source is here: https://github.com/rylarson/chef-cygwin and you can see that the README file is anything but empty.\r\n\r\nThe behind the firewall supermarket is 1.6.0 installed via the chef yum repository on RHEL 6.6 x64\r\n\r\nI have access to the servers private key and I can do a wireshark dump of the traffic if you would like."},"comment":{"url":"https://api.github.com/repos/sethvargo/stove/issues/comments/91182929","html_url":"https://github.com/sethvargo/stove/issues/72#issuecomment-91182929","issue_url":"https://api.github.com/repos/sethvargo/stove/issues/72","id":91182929,"user":{"login":"martinb3","id":103033,"avatar_url":"https://avatars.githubusercontent.com/u/103033?v=3","gravatar_id":"","url":"https://api.github.com/users/martinb3","html_url":"https://github.com/martinb3","followers_url":"https://api.github.com/users/martinb3/followers","following_url":"https://api.github.com/users/martinb3/following{/other_user}","gists_url":"https://api.github.com/users/martinb3/gists{/gist_id}","starred_url":"https://api.github.com/users/martinb3/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/martinb3/subscriptions","organizations_url":"https://api.github.com/users/martinb3/orgs","repos_url":"https://api.github.com/users/martinb3/repos","events_url":"https://api.github.com/users/martinb3/events{/privacy}","received_events_url":"https://api.github.com/users/martinb3/received_events","type":"User","site_admin":false},"created_at":"2015-04-09T10:13:42Z","updated_at":"2015-04-09T10:13:42Z","body":"I'd just prefer to have the Chef-related APIs validate the uploaded tarball before anything else happens, as that seems to be the hardest part to check locally. Maybe we need some sort of way to validate the tarball, then push the tag, then upload the tarball."}}