Class: ContaboClient

Inherits:
Object
  • Object
show all
Defined in:
lib/contabo-client.rb

Instance Method Summary collapse

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_tokenObject



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_tokenObject



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