vagrant_cloud 1.1.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d6540c7adaf6171dba9ebfc84c6e7318668bf162
4
- data.tar.gz: 0d1670e8ab10effb005977fbad33a093098bf56d
3
+ metadata.gz: e324926c5c32c84fd0c0506035b0dadc552e4f6c
4
+ data.tar.gz: 493f832cc1c117c5634dd674ec0a95100003b552
5
5
  SHA512:
6
- metadata.gz: fdac04b8abf7afda5bd6346aff9d1501adc381fb7e2b92b068e8c8c5fb5b2f4ca6bec3e601ace3f6fd1d7f44852d1f16e51866a0124881eebf40a4a48228d032
7
- data.tar.gz: 586674a4c7a71c102d2a71e9ea2b13f205e65bac47cc95096d0defc891ca18a43001eacd09ebfc168e5ab66894e5db76d14859b66024d533af394d7e692f47ea
6
+ metadata.gz: 435e8819762b21c375438e577a2a315afc356936212eb7a87e80eb6eb8c019827b0dcbf7044f4fd1f5ceff42c3245b5947ed5c8a74146db4b913d9f195d6fbfc
7
+ data.tar.gz: 76e35098ecf224f7df999d235be1f0687e062916c163efd87b9264d473bf95b950e54704ca8e3072988e1c2282dc7f6ce9c8279305095c78a911376e080e3b3f
data/LICENSE CHANGED
@@ -1,6 +1,7 @@
1
1
  The MIT License (MIT)
2
2
 
3
3
  Copyright (c) 2014 Cargo Media
4
+ Copyright (c) 2017 HashiCorp
4
5
 
5
6
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
7
  of this software and associated documentation files (the "Software"), to deal
data/README.md CHANGED
@@ -1,8 +1,8 @@
1
1
  vagrant_cloud
2
2
  =============
3
- Minimalistic ruby client for the [HashiCorp Atlas API](https://vagrantcloud.com/docs) (previously *Vagrant Cloud API*).
3
+ Ruby client for the [Vagrant Cloud API](https://www.vagrantup.com/docs/vagrant-cloud/api.html).
4
4
 
5
- [![Build Status](https://img.shields.io/travis/cargomedia/vagrant_cloud/master.svg)](https://travis-ci.org/cargomedia/vagrant_cloud)
5
+ [![Build Status](https://img.shields.io/travis/hashicorp/vagrant_cloud/master.svg)](https://travis-ci.org/hashicorp/vagrant_cloud)
6
6
  [![Gem Version](https://img.shields.io/gem/v/vagrant_cloud.svg)](https://rubygems.org/gems/vagrant_cloud)
7
7
 
8
8
 
@@ -22,8 +22,12 @@ version.release
22
22
  puts provider.download_url
23
23
  ```
24
24
 
25
+ __NOTE:__ As of version 2.0.0, the CLI has been deprecated in favor of the `vagrant cloud`
26
+ command. More information about how to use the `vagrant cloud` command can be found
27
+ on the [Vagrant documentation](https://www.vagrantup.com/docs/cli/cloud.html).
28
+
25
29
  Example CLI usage:
26
- Create a version and provider within an existing Box, upload a file to be hosted by Vagrant/Atlas, and release the version
30
+ Create a version and provider within an existing Box, upload a file to be hosted by Vagrant Cloud, and release the version
27
31
  ```sh
28
32
  vagrant_cloud create_version --username $USERNAME --token $VAGRANT_CLOUD_TOKEN --box $BOX_NAME --version $BOX_VERSION
29
33
  vagrant_cloud create_provider --username $USERNAME --token $VAGRANT_CLOUD_TOKEN --box $BOX_NAME --version $BOX_VERSION
@@ -56,3 +60,8 @@ Release a new version:
56
60
  1. Bump the version in `vagrant_cloud.gemspec`, merge to master.
57
61
  2. Push a new tag to master.
58
62
  3. Release to RubyGems with `bundle exec rake release`.
63
+
64
+ History
65
+ -------
66
+ This gem has been developed and maintained by [Cargo Media](https://www.cargomedia.ch) since April 2014.
67
+ HashiCorp became the official maintainer in October 2017.
@@ -5,13 +5,83 @@ module VagrantCloud
5
5
 
6
6
  # @param [String] username
7
7
  # @param [String] access_token
8
- def initialize(username, access_token)
8
+ def initialize(username, access_token, custom_server = nil)
9
9
  @username = username
10
10
  @access_token = access_token
11
+ @client = Client.new(access_token, custom_server)
11
12
  end
12
13
 
14
+ #---------------------------
15
+ # Authentication API Helpers
16
+ #---------------------------
17
+
18
+ # @param [String] password
19
+ # @param [String] description
20
+ # @param [String] 2FA code
21
+ # @return [Hash] response body
22
+ def create_token(password, description = nil, code = nil)
23
+ token_data_params = {
24
+ token: { description: description },
25
+ user: { login: @username, password: password },
26
+ two_factor: code
27
+ }.delete_if { |_, v| v.nil? }
28
+
29
+ token_response = @client.request('post', '/authenticate', token_data_params)
30
+ token_response
31
+ end
32
+
33
+ # @param [String] token
34
+ def delete_token(access_token = nil)
35
+ token_response = @client.request('delete', '/authenticate', nil, access_token)
36
+ token_response
37
+ end
38
+
39
+ # Validates a token on the account or a one-off validation token request.
40
+ # Will return nil if token is valid, otherwise will return Hash of response
41
+ # from Vagrant Cloud
42
+ #
43
+ # @param [String] access_token
44
+ # @return [Hash] response body
45
+ def validate_token(access_token = nil)
46
+ token_response = @client.request('get', '/authenticate', nil, access_token)
47
+ token_response
48
+ end
49
+
50
+ # @param [String] delivery_method
51
+ # @param [String] password
52
+ # @return [Hash] response body
53
+ def request_2fa_code(delivery_method, password)
54
+ twofa_code_params = {
55
+ two_factor: { delivery_method: delivery_method },
56
+ user: { login: @username, password: password }
57
+ }
58
+
59
+ code_response = @client.request('post', '/two-factor/request-code', twofa_code_params)
60
+ code_response
61
+ end
62
+
63
+ #---------------------------
64
+ # Organization API Helpers
65
+ #---------------------------
66
+
67
+ # @param [String] - organization
68
+ # @return [Hash]
69
+ def read_organization(org = nil)
70
+ if org
71
+ name = org
72
+ else
73
+ name = @username
74
+ end
75
+
76
+ @client.request('get', "/user/#{name}")
77
+ end
78
+
79
+ #--------------------
80
+ # Old Box API Helpers
81
+ #--------------------
82
+
13
83
  # @param [String] name
14
- # @param [Hash]
84
+ # @param [Hash] data
15
85
  # @return [Box]
16
86
  def get_box(name, data = nil)
17
87
  Box.new(self, name, data)
@@ -24,7 +94,7 @@ module VagrantCloud
24
94
  params = box_params(*args)
25
95
  params[:name] = name
26
96
 
27
- data = request('post', '/boxes', box: params)
97
+ data = @client.request('post', '/boxes', box: params)
28
98
  get_box(name, data)
29
99
  end
30
100
 
@@ -37,7 +107,7 @@ module VagrantCloud
37
107
  begin
38
108
  box = get_box(name)
39
109
  box.data
40
- rescue RestClient::ResourceNotFound => e
110
+ rescue RestClient::ResourceNotFound
41
111
  box = create_box(name, params)
42
112
  # If we've just created the box, we're done.
43
113
  return box
@@ -55,21 +125,32 @@ module VagrantCloud
55
125
  box
56
126
  end
57
127
 
128
+ #--------------------
129
+ # Old Box API Helpers
130
+ #--------------------
131
+
132
+ # REMOVED IN FAVOR OF CLIENT CLASS, but still exists to support any old clients
133
+ #
58
134
  # @param [String] method
59
135
  # @param [String] path
60
136
  # @param [Hash] params
61
137
  # @return [Hash]
62
138
  def request(method, path, params = {})
63
- params[:access_token] = access_token
139
+ headers = {}
140
+
141
+ headers['Authorization'] = "Bearer #{access_token}" if access_token
142
+
64
143
  result = RestClient::Request.execute(
65
144
  method: method,
66
145
  url: url_base + path,
67
146
  payload: params,
147
+ headers: headers,
68
148
  ssl_version: 'TLSv1'
69
149
  )
70
150
  result = JSON.parse(result)
71
151
  errors = result['errors']
72
152
  raise "Vagrant Cloud returned error: #{errors}" if errors
153
+
73
154
  result
74
155
  end
75
156
 
@@ -2,17 +2,100 @@ module VagrantCloud
2
2
  class Box
3
3
  attr_accessor :account
4
4
  attr_accessor :name
5
- attr_accessor :data
6
5
 
7
6
  # @param [String] account
8
7
  # @param [String] name
9
8
  # @param [Hash] data
10
- def initialize(account, name, data = nil)
9
+ # @param [String] description
10
+ # @param [String] short_description
11
+ # @param [String] access_token
12
+ def initialize(account, name = nil, data = nil, short_description = nil, description = nil, access_token = nil, custom_server = nil)
11
13
  @account = account
12
14
  @name = name
13
15
  @data = data
16
+ @description = description
17
+ @short_description = short_description
18
+ @client = Client.new(access_token, custom_server)
19
+ end
20
+
21
+ #--------------------
22
+ # Box API Helpers
23
+ #--------------------
24
+
25
+ # Read this box
26
+ # @return [Hash]
27
+ def data
28
+ @data ||= @client.request('get', box_path)
29
+ end
30
+
31
+ # Update a box
32
+ #
33
+ # @param [Hash] args
34
+ # @param [String] org - organization of the box to read
35
+ # @param [String] box_name - name of the box to read
36
+ # @return [Hash]
37
+ def update(args = {})
38
+ # hash arguments kept for backwards compatibility
39
+ data = @client.request('put', box_path(args[:organization], args[:name]), box: args)
40
+
41
+ # Update was called on *this* object, so update
42
+ # objects data locally
43
+ @data = data if !args[:organization] && !args[:name]
44
+ data
45
+ end
46
+
47
+ # A generic function to read any box on Vagrant Cloud
48
+ # If org and box name is not supplied, it will default to
49
+ # reading the given Box object
50
+ #
51
+ # @param [String] org - organization of the box to read
52
+ # @param [String] box_name - name of the box to read
53
+ # @return [Hash]
54
+ def delete(org = nil, box_name = nil)
55
+ @client.request('delete', box_path(org, box_name))
14
56
  end
15
57
 
58
+ # A generic function to read any box on Vagrant Cloud
59
+ #
60
+ # @param [String] org - organization of the box to read
61
+ # @param [String] box_name - name of the box to read
62
+ # @return [Hash]
63
+ def read(org = nil, box_name = nil)
64
+ @client.request('get', box_path(org, box_name))
65
+ end
66
+
67
+ # @param [String] short_description
68
+ # @param [String] description
69
+ # @param [Bool] is_private
70
+ # @return [Hash]
71
+ def create(short_description = nil, description = nil, org = nil, box_name = nil, is_private = false)
72
+ update_data = !(org && box_name)
73
+
74
+ org ||= account.username
75
+ box_name ||= @name
76
+ short_description ||= @short_description
77
+ description ||= @description
78
+
79
+ params = {
80
+ name: box_name,
81
+ username: org,
82
+ is_private: is_private,
83
+ short_description: short_description,
84
+ description: description
85
+ }.delete_if { |_, v| v.nil? }
86
+
87
+ data = @client.request('post', '/boxes', box: params)
88
+
89
+ # Create was called on *this* object, so update
90
+ # objects data locally
91
+ @data = data if update_data
92
+ data
93
+ end
94
+
95
+ #--------------------
96
+ # Metadata Helpers
97
+ #--------------------
98
+
16
99
  # @return [String]
17
100
  def description
18
101
  data['description_markdown'].to_s
@@ -34,19 +117,9 @@ module VagrantCloud
34
117
  version_list.sort_by { |version| Gem::Version.new(version.number) }
35
118
  end
36
119
 
37
- # @return [Hash]
38
- def data
39
- @data ||= account.request('get', "/box/#{account.username}/#{name}")
40
- end
41
-
42
- # @param [Hash] args
43
- def update(args = {})
44
- @data = account.request('put', "/box/#{account.username}/#{name}", box: args)
45
- end
46
-
47
- def delete
48
- account.request('delete', "/box/#{account.username}/#{name}")
49
- end
120
+ #------------------------
121
+ # Old Version API Helpers
122
+ #------------------------
50
123
 
51
124
  # @param [Integer] number
52
125
  # @param [Hash] data
@@ -61,7 +134,7 @@ module VagrantCloud
61
134
  def create_version(name, description = nil)
62
135
  params = { version: name }
63
136
  params[:description] = description if description
64
- data = account.request('post', "/box/#{account.username}/#{self.name}/versions", version: params)
137
+ data = @client.request('post', "#{box_path}/versions", version: params)
65
138
  get_version(data['number'], data)
66
139
  end
67
140
 
@@ -69,8 +142,8 @@ module VagrantCloud
69
142
  # @param [String] description
70
143
  # @return [Version]
71
144
  def ensure_version(name, description = nil)
72
- version = versions.select { |version| version.version == name }.first
73
- version = create_version(name, description) unless version
145
+ version = versions.select { |v| v.version == name }.first
146
+ version ||= create_version(name, description)
74
147
  if description && (description != version.description)
75
148
  version.update(description)
76
149
  end
@@ -87,6 +160,21 @@ module VagrantCloud
87
160
 
88
161
  private
89
162
 
163
+ # Constructs the box path based on an account and box name.
164
+ # If no params are given, it constructs a path for *this* Box object,
165
+ # but if both params are given it will construct a path for a one-off request
166
+ #
167
+ # @param [String] - username
168
+ # @param [String] - box_name
169
+ # @return [String] - API path to box
170
+ def box_path(username = nil, box_name = nil)
171
+ if username && box_name
172
+ "/box/#{username}/#{box_name}"
173
+ else
174
+ "/box/#{account.username}/#{name}"
175
+ end
176
+ end
177
+
90
178
  # Vagrant Cloud returns keys different from what you set for some params.
91
179
  # Values in this map should be strings.
92
180
  ATTR_MAP = {
@@ -0,0 +1,60 @@
1
+ require 'json'
2
+
3
+ module VagrantCloud
4
+ class Client
5
+ # Base Vagrant Cloud API URL
6
+ URL_BASE = 'https://vagrantcloud.com/api/v1'.freeze
7
+ attr_accessor :access_token
8
+
9
+ # @param [String] access_token - token used to authenticate API requests
10
+ # @param [String] url_base - URL used to make API requests
11
+ def initialize(access_token = nil, url_base = nil)
12
+ if url_base
13
+ @url_base = url_base
14
+ else
15
+ @url_base = URL_BASE
16
+ end
17
+
18
+ @access_token = access_token
19
+ end
20
+
21
+ # @param [String] method
22
+ # @param [String] path
23
+ # @param [Hash] params
24
+ # @param [String] token
25
+ # @return [Hash]
26
+ def request(method, path, params = {}, token = nil)
27
+ headers = {}
28
+
29
+ if token
30
+ headers['Authorization'] = "Bearer #{token}"
31
+ elsif @access_token
32
+ headers['Authorization'] = "Bearer #{@access_token}"
33
+ end
34
+
35
+ headers['Accept'] = 'application/json'
36
+
37
+ request_params = {
38
+ method: method,
39
+ url: @url_base + path,
40
+ headers: headers,
41
+ ssl_version: 'TLSv1'
42
+ }
43
+
44
+ if ['get', 'head', 'delete'].include?(method.downcase)
45
+ headers[:params] = params
46
+ else
47
+ request_params[:payload] = params
48
+ end
49
+
50
+ begin
51
+ result = RestClient::Request.execute(request_params)
52
+
53
+ parsed_result = JSON.parse(result)
54
+ parsed_result
55
+ rescue RestClient::ExceptionWithResponse => e
56
+ raise ClientError.new(e.message, e.http_body, e.http_code)
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,25 @@
1
+ module VagrantCloud
2
+ class ClientError < StandardError
3
+ attr_accessor :error_arr
4
+ attr_accessor :error_code
5
+
6
+ def initialize(msg, http_body, http_code)
7
+ begin
8
+ errors = JSON.parse(http_body)
9
+ vagrant_cloud_msg = errors['errors']
10
+
11
+ if vagrant_cloud_msg.is_a?(Array)
12
+ message = msg + ' - ' + vagrant_cloud_msg.join(', ').to_s
13
+ else
14
+ message = msg + ' - ' + vagrant_cloud_msg
15
+ end
16
+ rescue JSON::ParserError
17
+ message = msg
18
+ end
19
+
20
+ @error_arr = vagrant_cloud_msg
21
+ @error_code = http_code
22
+ super(message)
23
+ end
24
+ end
25
+ end
@@ -2,17 +2,25 @@ module VagrantCloud
2
2
  class Provider
3
3
  attr_accessor :version
4
4
  attr_accessor :name
5
- attr_accessor :data
6
5
 
7
6
  # @param [Version] version
8
7
  # @param [String] name
9
8
  # @param [Hash] data
10
- def initialize(version, name, data = nil)
9
+ # @param [String] access_token
10
+ def initialize(version, name, data = nil, url = nil, username = nil, box_name = nil, access_token = nil, custom_server = nil)
11
11
  @version = version
12
12
  @name = name
13
13
  @data = data
14
+ @username = username
15
+ @box_name = box_name
16
+ @url = url
17
+ @client = Client.new(access_token, custom_server)
14
18
  end
15
19
 
20
+ #--------------------
21
+ # Metadata Helpers
22
+ #--------------------
23
+
16
24
  # @return [String]
17
25
  def url
18
26
  data['original_url'].to_s
@@ -23,29 +31,84 @@ module VagrantCloud
23
31
  data['download_url'].to_s
24
32
  end
25
33
 
34
+ #--------------------
35
+ # Provider API Helpers
36
+ #--------------------
37
+
26
38
  # @return [Hash]
27
39
  def data
28
- @data ||= account.request('get', provider_path)
40
+ @data ||= @client.request('get', provider_path)
41
+ end
42
+
43
+ # Creates a provider for *this* Provider object, or if all params are given,
44
+ # will make a one-off request to create a Provider and return its data
45
+ #
46
+ # @param [String] name
47
+ # @param [String] url
48
+ # @param [String] username
49
+ # @param [String] box_name
50
+ # @param [String] version_number
51
+ def create_provider(name = nil, url = nil, username = nil, box_name = nil, version_number = nil)
52
+ update_data = !(username && version_number && provider_name && box_name)
53
+ name ||= @name
54
+ url ||= @url
55
+ username ||= @username
56
+ box_name ||= @box_name
57
+ version_number ||= @version
58
+
59
+ params = { name: name, url: url }.delete_if { |_, v| v.nil? }
60
+ data = @client.request('post', create_provider_path(username, box_name, version_number), provider: params)
61
+
62
+ @data = data if update_data
63
+ data
29
64
  end
30
65
 
31
66
  # @param [String] url
32
- def update(url)
67
+ # @param [String] username
68
+ # @param [String] box_name
69
+ # @param [String] version_number
70
+ # @param [String] provider_name
71
+ def update(url = nil, username = nil, box_name = nil, version_number = nil, provider_name = nil)
72
+ update_data = !(username && version_number && provider_name && box_name)
73
+ provider_name ||= @name
74
+ url ||= @url
75
+ username ||= @username
76
+ box_name ||= @box_name
77
+ version_number ||= @version
78
+
33
79
  params = { url: url }
34
- @data = account.request('put', provider_path, provider: params)
80
+ data = @client.request('put',
81
+ provider_path(username, box_name, version_number, provider_name),
82
+ provider: params)
83
+
84
+ @data = data if update_data
85
+ data
35
86
  end
36
87
 
37
- def delete
38
- account.request('delete', provider_path)
88
+ # @param [String] username
89
+ # @param [String] box_name
90
+ # @param [String] version_number
91
+ # @param [String] provider_name
92
+ def delete(username = nil, box_name = nil, version_number = nil, provider_name = nil)
93
+ @client.request('delete', provider_path(username, box_name, version_number, provider_name))
39
94
  end
40
95
 
96
+ # @param [String] username
97
+ # @param [String] box_name
98
+ # @param [String] version_number
99
+ # @param [String] provider_name
41
100
  # @return [String]
42
- def upload_url
43
- account.request('get', "#{provider_path}/upload")['upload_path']
101
+ def upload_url(username = nil, box_name = nil, version_number = nil, provider_name = nil)
102
+ @client.request('get', "#{provider_path(username, box_name, version_number, provider_name)}/upload")['upload_path']
44
103
  end
45
104
 
105
+ # @param [String] username
106
+ # @param [String] box_name
107
+ # @param [String] version_number
108
+ # @param [String] provider_name
46
109
  # @param [String] file_path
47
- def upload_file(file_path)
48
- url = upload_url
110
+ def upload_file(file_path, username = nil, box_name = nil, version_number = nil, provider_name = nil)
111
+ url = upload_url(username, box_name, version_number, provider_name)
49
112
  payload = File.open(file_path, 'r')
50
113
  RestClient::Request.execute(
51
114
  method: :put,
@@ -67,8 +130,20 @@ module VagrantCloud
67
130
  box.account
68
131
  end
69
132
 
70
- def provider_path
71
- "/box/#{account.username}/#{box.name}/version/#{version.number}/provider/#{name}"
133
+ def create_provider_path(username = nil, box_name = nil, version_number = nil)
134
+ if username && box_name && version_number
135
+ "/box/#{username}/#{box_name}/version/#{version_number}/providers"
136
+ else
137
+ "/box/#{account.username}/#{box.name}/version/#{version.number}/providers"
138
+ end
139
+ end
140
+
141
+ def provider_path(username = nil, box_name = nil, version_number = nil, provider_name = nil)
142
+ if username && box_name && version_number && name
143
+ "/box/#{username}/#{box_name}/version/#{version_number}/provider/#{provider_name}"
144
+ else
145
+ "/box/#{account.username}/#{box.name}/version/#{version.number}/provider/#{name}"
146
+ end
72
147
  end
73
148
  end
74
149
  end
@@ -0,0 +1,31 @@
1
+ module VagrantCloud
2
+ class Search
3
+ attr_accessor :account
4
+
5
+ def initialize(access_token = nil, custom_server = nil)
6
+ @client = Client.new(access_token, custom_server)
7
+ end
8
+
9
+ # Requests a search based on the given parameters
10
+ #
11
+ # @param [String] query
12
+ # @param [String] provider
13
+ # @param [String] sort
14
+ # @param [String] order
15
+ # @param [String] limit
16
+ # @param [String] page
17
+ # @return [Hash]
18
+ def search(query = nil, provider = nil, sort = nil, order = nil, limit = nil, page = nil)
19
+ params = {
20
+ q: query,
21
+ provider: provider,
22
+ sort: sort,
23
+ order: order,
24
+ limit: limit,
25
+ page: page
26
+ }.delete_if { |_, v| v.nil? }
27
+
28
+ @client.request('get', '/search', params)
29
+ end
30
+ end
31
+ end
@@ -2,17 +2,24 @@ module VagrantCloud
2
2
  class Version
3
3
  attr_accessor :box
4
4
  attr_accessor :number
5
- attr_accessor :data
6
5
 
7
6
  # @param [Box] box
8
7
  # @param [String] number
9
8
  # @param [Hash] data
10
- def initialize(box, number, data = nil)
9
+ # @param [String] description
10
+ # @param [String] access_token
11
+ def initialize(box, number, data = nil, description = nil, access_token = nil, custom_server = nil)
11
12
  @box = box
12
13
  @number = number
13
14
  @data = data
15
+ @description = description
16
+ @client = Client.new(access_token, custom_server)
14
17
  end
15
18
 
19
+ #--------------------
20
+ # Metadata Helpers
21
+ #--------------------
22
+
16
23
  # @return [String]
17
24
  def version
18
25
  data['version'].to_s
@@ -38,29 +45,88 @@ module VagrantCloud
38
45
  version
39
46
  end
40
47
 
48
+ #--------------------
49
+ # Version API Helpers
50
+ #--------------------
51
+
41
52
  # @return [Hash]
42
53
  def data
43
- @data ||= account.request('get', "/box/#{account.username}/#{box.name}/version/#{number}")
54
+ @data ||= @client.request('get', version_path)
55
+ end
56
+
57
+ # @param [String] username
58
+ # @param [String] box_name
59
+ # @param [String] version_number
60
+ # @return [Hash]
61
+ def read(username = nil, box_name = nil, version_number = nil)
62
+ @client.request('get', version_path(username, box_name, version_number))
44
63
  end
45
64
 
65
+ # @param [String] username
66
+ # @param [String] box_name
67
+ # @param [String] version_number
46
68
  # @param [String] description
47
- def update(description)
69
+ def update(description = nil, username = nil, box_name = nil, version_number = nil)
70
+ update_data = !(username && box_name && version_number)
71
+ description ||= @description
48
72
  version = { description: description }
49
- @data = account.request('put', "/box/#{account.username}/#{box.name}/version/#{number}", version: version)
73
+ data = @client.request('put',
74
+ version_path(username, box_name, version_number),
75
+ version: version)
76
+
77
+ @data = data if update_data
78
+ data
50
79
  end
51
80
 
52
- def delete
53
- account.request('delete', "/box/#{account.username}/#{box.name}/version/#{number}")
81
+ # @param [String] username
82
+ # @param [String] box_name
83
+ # @param [String] version_number
84
+ def delete(username = nil, box_name = nil, version_number = nil)
85
+ @client.request('delete', version_path(username, box_name, version_number))
54
86
  end
55
87
 
56
- def release
57
- @data = account.request('put', "/box/#{account.username}/#{box.name}/version/#{number}/release")
88
+ # @param [String] username
89
+ # @param [String] box_name
90
+ # @param [String] version_number
91
+ def release(username = nil, box_name = nil, version_number = nil)
92
+ data = @client.request('put', "#{version_path(username, box_name, version_number)}/release")
93
+
94
+ @data = data if !(username && box_name && version_number)
95
+ data
58
96
  end
59
97
 
60
- def revoke
61
- @data = account.request('put', "/box/#{account.username}/#{box.name}/version/#{number}/revoke")
98
+ # @param [String] username
99
+ # @param [String] box_name
100
+ # @param [String] version_number
101
+ def revoke(username = nil, box_name = nil, version_number = nil)
102
+ update_data = !(username && box_name && version_number)
103
+ data = @client.request('put', "#{version_path(username, box_name, version_number)}/revoke")
104
+
105
+ @data = data if update_data
106
+ data
62
107
  end
63
108
 
109
+ # @param [String] number
110
+ # @param [String] description
111
+ # @param [String] org
112
+ # @param [String] box_name
113
+ # @return [Hash]
114
+ def create_version(number = nil, description = nil, org = nil, box_name = nil)
115
+ update_data = !(org && box_name && description && number)
116
+ number ||= @number
117
+ description ||= @description
118
+
119
+ params = { version: number, description: description }
120
+ data = @client.request('post', create_version_path(org, box_name).to_s, version: params)
121
+
122
+ @data = data if update_data
123
+ data
124
+ end
125
+
126
+ #--------------------
127
+ # Old Provider Helpers
128
+ #--------------------
129
+
64
130
  # @param [String] name
65
131
  # @param [Hash] data
66
132
  # @return [Provider]
@@ -72,8 +138,8 @@ module VagrantCloud
72
138
  # @param [String] url
73
139
  # @return [Provider]
74
140
  def create_provider(name, url = nil)
75
- params = { name: name, url: url }.delete_if { |_k, v| v.nil? }
76
- data = account.request('post', "/box/#{account.username}/#{box.name}/version/#{number}/providers", provider: params)
141
+ params = { name: name, url: url }.delete_if { |_, v| v.nil? }
142
+ data = @client.request('post', "#{version_path}/providers", provider: params)
77
143
  get_provider(name, data)
78
144
  end
79
145
 
@@ -81,8 +147,8 @@ module VagrantCloud
81
147
  # @param [String] url
82
148
  # @return [Provider]
83
149
  def ensure_provider(name, url)
84
- provider = providers.select { |provider| provider.name == name }.first
85
- provider = create_provider(name, url) unless provider
150
+ provider = providers.select { |p| p.name == name }.first
151
+ provider ||= create_provider(name, url)
86
152
  provider.update(url) if url != provider.url
87
153
  provider
88
154
  end
@@ -93,5 +159,30 @@ module VagrantCloud
93
159
  def account
94
160
  box.account
95
161
  end
162
+
163
+ # Path used to generate a new version on a box
164
+ #
165
+ # @param [String] - username
166
+ # @param [String] - box_name
167
+ # @return [String]
168
+ def create_version_path(username = nil, box_name = nil)
169
+ if username && box_name
170
+ "/box/#{username}/#{box_name}/versions"
171
+ else
172
+ "/box/#{account.username}/#{box.name}/versions"
173
+ end
174
+ end
175
+
176
+ # @param [String] - username
177
+ # @param [String] - box_name
178
+ # @param [String] - version_number
179
+ # @return [String]
180
+ def version_path(username = nil, box_name = nil, version_number = nil)
181
+ if username && box_name && version_number
182
+ "/box/#{username}/#{box_name}/version/#{version_number}"
183
+ else
184
+ "/box/#{account.username}/#{box.name}/version/#{number}"
185
+ end
186
+ end
96
187
  end
97
188
  end
data/lib/vagrant_cloud.rb CHANGED
@@ -1,10 +1,11 @@
1
- module VagrantCloud
2
- require 'json'
3
- require 'rest_client'
1
+ require 'json'
2
+ require 'rest_client'
4
3
 
5
- require 'vagrant_cloud/account'
6
- require 'vagrant_cloud/box'
7
- require 'vagrant_cloud/version'
8
- require 'vagrant_cloud/provider'
9
- require 'vagrant_cloud/cli'
10
- end
4
+ require 'vagrant_cloud/errors'
5
+
6
+ require 'vagrant_cloud/account'
7
+ require 'vagrant_cloud/box'
8
+ require 'vagrant_cloud/version'
9
+ require 'vagrant_cloud/provider'
10
+ require 'vagrant_cloud/search'
11
+ require 'vagrant_cloud/client'
metadata CHANGED
@@ -1,43 +1,44 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vagrant_cloud
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
+ - HashiCorp
7
8
  - Cargo Media
8
9
  autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
- date: 2017-10-12 00:00:00.000000000 Z
12
+ date: 2018-10-16 00:00:00.000000000 Z
12
13
  dependencies:
13
14
  - !ruby/object:Gem::Dependency
14
- name: rest-client
15
+ name: json
15
16
  requirement: !ruby/object:Gem::Requirement
16
17
  requirements:
17
18
  - - "~>"
18
19
  - !ruby/object:Gem::Version
19
- version: 2.0.2
20
+ version: 2.1.0
20
21
  type: :runtime
21
22
  prerelease: false
22
23
  version_requirements: !ruby/object:Gem::Requirement
23
24
  requirements:
24
25
  - - "~>"
25
26
  - !ruby/object:Gem::Version
26
- version: 2.0.2
27
+ version: 2.1.0
27
28
  - !ruby/object:Gem::Dependency
28
- name: thor
29
+ name: rest-client
29
30
  requirement: !ruby/object:Gem::Requirement
30
31
  requirements:
31
32
  - - "~>"
32
33
  - !ruby/object:Gem::Version
33
- version: 0.19.4
34
+ version: 2.0.2
34
35
  type: :runtime
35
36
  prerelease: false
36
37
  version_requirements: !ruby/object:Gem::Requirement
37
38
  requirements:
38
39
  - - "~>"
39
40
  - !ruby/object:Gem::Version
40
- version: 0.19.4
41
+ version: 2.0.2
41
42
  - !ruby/object:Gem::Dependency
42
43
  name: rake
43
44
  requirement: !ruby/object:Gem::Requirement
@@ -67,38 +68,36 @@ dependencies:
67
68
  - !ruby/object:Gem::Version
68
69
  version: '3.0'
69
70
  - !ruby/object:Gem::Dependency
70
- name: webmock
71
+ name: rubocop
71
72
  requirement: !ruby/object:Gem::Requirement
72
73
  requirements:
73
74
  - - "~>"
74
75
  - !ruby/object:Gem::Version
75
- version: '3.0'
76
+ version: 0.59.1
76
77
  type: :development
77
78
  prerelease: false
78
79
  version_requirements: !ruby/object:Gem::Requirement
79
80
  requirements:
80
81
  - - "~>"
81
82
  - !ruby/object:Gem::Version
82
- version: '3.0'
83
+ version: 0.59.1
83
84
  - !ruby/object:Gem::Dependency
84
- name: rubocop
85
+ name: webmock
85
86
  requirement: !ruby/object:Gem::Requirement
86
87
  requirements:
87
88
  - - "~>"
88
89
  - !ruby/object:Gem::Version
89
- version: 0.41.2
90
+ version: '3.0'
90
91
  type: :development
91
92
  prerelease: false
92
93
  version_requirements: !ruby/object:Gem::Requirement
93
94
  requirements:
94
95
  - - "~>"
95
96
  - !ruby/object:Gem::Version
96
- version: 0.41.2
97
- description: Minimalistic ruby client for the HashiCorp Atlas API (previously Vagrant
98
- Cloud API)
99
- email: tech@cargomedia.ch
100
- executables:
101
- - vagrant_cloud
97
+ version: '3.0'
98
+ description: Ruby library for the HashiCorp Vagrant Cloud API
99
+ email: vagrant@hashicorp.com
100
+ executables: []
102
101
  extensions: []
103
102
  extra_rdoc_files: []
104
103
  files:
@@ -108,14 +107,20 @@ files:
108
107
  - lib/vagrant_cloud.rb
109
108
  - lib/vagrant_cloud/account.rb
110
109
  - lib/vagrant_cloud/box.rb
111
- - lib/vagrant_cloud/cli.rb
110
+ - lib/vagrant_cloud/client.rb
111
+ - lib/vagrant_cloud/errors.rb
112
112
  - lib/vagrant_cloud/provider.rb
113
+ - lib/vagrant_cloud/search.rb
113
114
  - lib/vagrant_cloud/version.rb
114
- homepage: https://github.com/cargomedia/vagrant_cloud
115
+ homepage: https://github.com/hashicorp/vagrant_cloud
115
116
  licenses:
116
117
  - MIT
117
118
  metadata: {}
118
- post_install_message:
119
+ post_install_message: |-
120
+ NOTICE: As of the 2.0.0 release, the vagrant_cloud gem provides library functionality
121
+ and no longer includes a command line client. For a command line client,
122
+ use the `vagrant cloud` subcommand from Vagrant. Vagrant can be downloaded
123
+ from: https://www.vagrantup.com/downloads.html
119
124
  rdoc_options: []
120
125
  require_paths:
121
126
  - lib
@@ -131,8 +136,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
131
136
  version: '0'
132
137
  requirements: []
133
138
  rubyforge_project:
134
- rubygems_version: 2.6.13
139
+ rubygems_version: 2.5.2.1
135
140
  signing_key:
136
141
  specification_version: 4
137
- summary: HashiCorp Atlas API client
142
+ summary: Vagrant Cloud API Library
138
143
  test_files: []
@@ -1,65 +0,0 @@
1
- require 'thor'
2
-
3
- module VagrantCloud
4
- class Cli < Thor
5
- package_name 'VagrantCloud'
6
-
7
- class_option :username, alias: '-u', required: true, desc: 'Vagrant Cloud username'
8
- class_option :token, alias: '-t', required: true, desc: 'Vagrant Cloud access token'
9
- class_option :box, alias: '-b', required: true, desc: 'name of the box'
10
- class_option :verbose, type: :boolean
11
-
12
- desc 'create_version', 'creates a new version within a given box'
13
- method_option :version, alias: '-v', required: true, desc: 'version within the box'
14
- def create_version
15
- version = current_box.create_version(options[:version])
16
- puts "created #{version.version} of box #{options[:box]}; current status is #{version.status}" if options[:verbose]
17
- version
18
- end
19
-
20
- desc 'release_version', 'release the specified version within a given box'
21
- method_option :version, alias: '-v', required: true, desc: 'version within the box'
22
- def release_version
23
- version = current_version
24
- version.release
25
- puts "Box #{options[:box]} / version: #{version.version}; current status is #{version.status}" if options[:verbose]
26
- true
27
- end
28
-
29
- desc 'create_provider', 'creates a provider within a given box and version'
30
- method_option :version, alias: '-v', required: true, desc: 'version within the box'
31
- method_option :provider, alias: '-p', default: 'virtualbox', desc: 'the provider for the box; default: virtualbox'
32
- method_option :provider_url, alias: '-pu', desc: 'URL to the file for remote hosting; do not include if you intend to upload a file subsequently'
33
- def create_provider
34
- provider = current_version.create_provider(options[:provider], options[:provider_url])
35
- puts "created #{provider.data['name']} provider within version #{provider.version.version}" if options[:verbose]
36
- provider
37
- end
38
-
39
- desc 'upload_file', 'upload a file for Atlas to host to an existing version and provider'
40
- method_option :version, alias: '-v', required: true, desc: 'version within the box'
41
- method_option :provider, alias: '-p', default: 'virtualbox', desc: 'the provider for the box; default: virtualbox'
42
- method_option :provider_file_path, alias: '-pfp', required: true, desc: 'path to file to be uploaded for Atlast hosting'
43
- def upload_file
44
- get_provider(options[:provider]).upload_file(options[:provider_file_path])
45
- end
46
-
47
- private
48
-
49
- def current_account
50
- VagrantCloud::Account.new(options[:username], options[:token])
51
- end
52
-
53
- def current_box
54
- current_account.get_box(options[:box])
55
- end
56
-
57
- def current_version
58
- current_box.get_version(options[:version])
59
- end
60
-
61
- def get_provider(provider_str)
62
- current_version.get_provider(provider_str)
63
- end
64
- end
65
- end