Class: ContaboClient
- Inherits:
-
Object
- Object
- ContaboClient
- Defined in:
- lib/contabo-client.rb
Instance Method Summary collapse
- #access_token ⇒ Object
- #cancel_instance(instance_id:) ⇒ Object
- #create_instance(image_id:, product_id:, region: 'EU', ssh_rsa:, root_password:, display_name:, user_data: '') ⇒ Object
- #create_secret(password, type = 'password') ⇒ Object
- #get_access_token ⇒ Object
- #get_instances(page: 1, size: 10, order_by: nil, search: nil) ⇒ Object
-
#initialize(client_id:, client_secret:, api_user:, api_password:) ⇒ ContaboClient
constructor
A new instance of ContaboClient.
- #reinstall_instance(instance_id:, image_id:, root_password:, cloud_init: nil, user_data: '') ⇒ Object
- #retrieve_images(page: 1, size: 10) ⇒ Object
Constructor Details
#initialize(client_id:, client_secret:, api_user:, api_password:) ⇒ ContaboClient
Returns a new instance of ContaboClient.
7 8 9 10 11 12 13 14 |
# File 'lib/contabo-client.rb', line 7 def initialize(client_id:, client_secret:, api_user:, api_password:) @client_id = client_id @client_secret = client_secret @api_user = api_user @api_password = api_password @auth_url = 'https://auth.contabo.com/auth/realms/contabo/protocol/openid-connect/token' @api_url = 'https://api.contabo.com/v1/compute/instances' end |
Instance Method Details
#access_token ⇒ Object
142 143 144 |
# File 'lib/contabo-client.rb', line 142 def access_token @access_token ||= get_access_token end |
#cancel_instance(instance_id:) ⇒ Object
146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 |
# File 'lib/contabo-client.rb', line 146 def cancel_instance(instance_id:) uri = URI("#{@api_url}/#{instance_id}/cancel") request = Net::HTTP::Post.new(uri) request['Authorization'] = "Bearer #{access_token}" request['x-request-id'] = SecureRandom.uuid response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http| http.request(request) end JSON.parse(response.body) rescue StandardError => e puts "Error canceling instance: #{e.message}" nil end |
#create_instance(image_id:, product_id:, region: 'EU', ssh_rsa:, root_password:, display_name:, user_data: '') ⇒ Object
88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 |
# File 'lib/contabo-client.rb', line 88 def create_instance(image_id:, product_id:, region: 'EU', ssh_rsa:, root_password:, display_name:, user_data: '') uri = URI(@api_url) request = Net::HTTP::Post.new(uri) request['Authorization'] = "Bearer #{access_token}" request['Content-Type'] = 'application/json' request['x-request-id'] = SecureRandom.uuid root_password_secret_id = create_secret(root_password) root_ssh_secret_id = create_secret(ssh_rsa, 'ssh') body = { imageId: image_id, productId: product_id, region: region, sshKeys: [root_ssh_secret_id], rootPassword: root_password_secret_id, defaultUser: "root", displayName: display_name, userData: user_data }.compact request.body = body.to_json response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http| http.request(request) end JSON.parse(response.body) end |
#create_secret(password, type = 'password') ⇒ Object
28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
# File 'lib/contabo-client.rb', line 28 def create_secret(password, type = 'password') uri = URI('https://api.contabo.com/v1/secrets') request = Net::HTTP::Post.new(uri) request['Authorization'] = "Bearer #{access_token}" request['Content-Type'] = 'application/json' request['x-request-id'] = SecureRandom.uuid body = { name: "Ruby's Contabo Client #{SecureRandom.uuid}", value: password, type: type } request.body = body.to_json response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http| http.request(request) end data = JSON.parse(response.body)['data'].first raise "Failed to create secret. Error: #{response.body}" if data.nil? data['secretId'] end |
#get_access_token ⇒ Object
16 17 18 19 20 21 22 23 24 25 26 |
# File 'lib/contabo-client.rb', line 16 def get_access_token uri = URI(@auth_url) response = Net::HTTP.post_form(uri, { 'client_id' => @client_id, 'client_secret' => @client_secret, 'username' => @api_user, 'password' => @api_password, 'grant_type' => 'password' }) JSON.parse(response.body)['access_token'] end |
#get_instances(page: 1, size: 10, order_by: nil, search: nil) ⇒ Object
69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 |
# File 'lib/contabo-client.rb', line 69 def get_instances(page: 1, size: 10, order_by: nil, search: nil) uri = URI(@api_url) params = { page: page, size: size } params[:orderBy] = order_by if order_by params[:search] = search if search uri.query = URI.encode_www_form(params) request = Net::HTTP::Get.new(uri) request['Authorization'] = "Bearer #{access_token}" request['x-request-id'] = SecureRandom.uuid request['x-request-id'] = SecureRandom.uuid response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http| http.request(request) end JSON.parse(response.body) end |
#reinstall_instance(instance_id:, image_id:, root_password:, cloud_init: nil, user_data: '') ⇒ Object
118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 |
# File 'lib/contabo-client.rb', line 118 def reinstall_instance(instance_id:, image_id:, root_password:, cloud_init: nil, user_data: '') uri = URI("https://api.contabo.com/v1/compute/instances/#{instance_id}") request = Net::HTTP::Put.new(uri) request['Authorization'] = "Bearer #{access_token}" request['Content-Type'] = 'application/json' request['x-request-id'] = SecureRandom.uuid root_password_secret_id = create_secret(root_password) body = { imageId: image_id, rootPassword: root_password_secret_id, defaultUser: "root", userData: user_data }.compact request.body = body.to_json response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http| http.request(request) end JSON.parse(response.body) end |
#retrieve_images(page: 1, size: 10) ⇒ Object
53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
# File 'lib/contabo-client.rb', line 53 def retrieve_images(page: 1, size: 10) uri = URI('https://api.contabo.com/v1/compute/images') params = { page: page, size: size } uri.query = URI.encode_www_form(params) request = Net::HTTP::Get.new(uri) request['Authorization'] = "Bearer #{access_token}" request['x-request-id'] = SecureRandom.uuid response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http| http.request(request) end JSON.parse(response.body) end |