Skip to content

Commit ae7d38c

Browse files
nazarovdoamvasilyev
authored andcommittedFeb 13, 2025
Add IBM VMs to list_cloud_instances command (refs FRUC-206)
1 parent ac20b9a commit ae7d38c

File tree

2 files changed

+60
-9
lines changed

2 files changed

+60
-9
lines changed
 

‎core/commands/list_cloud_instances_command.rb

+38-9
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
require_relative 'base_command'
99
require_relative '../services/aws_service'
1010
require_relative '../services/gcp_service'
11+
require_relative '../services/ibm_service'
1112
require_relative '../services/configuration_reader'
1213

1314
# Command shows list all active instances on Cloud Providers
@@ -20,7 +21,7 @@ def self.synopsis
2021

2122
def show_help
2223
info = <<-HELP
23-
List cloud instances command shows a list of active machines on GCP and AWS providers and the time they were created.
24+
List cloud instances command shows a list of active machines on GCP, AWS and IBM Cloud providers and the time they were created.
2425
2526
Add the --json flag for the list_cloud_instances command to show the machine readable text.
2627
Add the --hours NUMBER_OF_HOURS flag for displaying the machine older than this hours.
@@ -45,7 +46,7 @@ def execute
4546
def show_list
4647
@hidden_instances = read_hidden_instances
4748
@number_instances = 0
48-
print_lists(generate_aws_list, generate_gcp_list)
49+
print_lists(generate_aws_list, generate_gcp_list, generate_ibm_list)
4950
end
5051

5152
def generate_aws_list
@@ -90,6 +91,21 @@ def generate_gcp_list
9091
Result.ok(all_instances)
9192
end
9293

94+
def generate_ibm_list
95+
return Result.error('IBM Cloud service is not configured') unless @env.ibm_service.configured?
96+
97+
all_instances = @env.ibm_service.instances_list_with_time
98+
return Result.error('No instances were found in IBM Cloud services') if all_instances.empty?
99+
100+
all_instances.each do |instance|
101+
instance[:launch_time] = DateTime.parse(instance[:launch_time]).new_offset(0.0 / 24)
102+
end
103+
all_instances = select_by_time(all_instances) unless @env.hours.nil?
104+
all_instances = time_to_string(all_instances)
105+
@number_instances += all_instances.size
106+
Result.ok(all_instances)
107+
end
108+
93109
def select_by_time(instances)
94110
new_instances = instances
95111
if @env.hours.to_i <= 0
@@ -108,26 +124,32 @@ def time_to_string(instances)
108124
end
109125
end
110126

111-
def print_lists(aws_list, gcp_list)
127+
def print_lists(aws_list, gcp_list, ibm_list)
112128
if @env.json
113-
@ui.out(in_json_format(aws_list, gcp_list))
129+
@ui.out(in_json_format(aws_list, gcp_list, ibm_list))
114130
else
115131
if aws_list.success?
116132
@ui.info('List all active instances on AWS:')
117-
@ui.info("\n" + in_table_format(aws_list.value, false))
133+
@ui.info("\n" + in_table_format(aws_list.value, false, 'aws'))
118134
else
119135
@ui.info(aws_list.error)
120136
end
121137
if gcp_list.success?
122138
@ui.info('List all active instances on GCP:')
123-
@ui.info("\n" + in_table_format(gcp_list.value, true))
139+
@ui.info("\n" + in_table_format(gcp_list.value, true, 'gcp'))
124140
else
125141
@ui.info(gcp_list.error)
126142
end
143+
if ibm_list.success?
144+
@ui.info('List all active instances on IBM Cloud:')
145+
@ui.info("\n" + in_table_format(ibm_list.value, false, 'ibm'))
146+
else
147+
@ui.info(ibm_list.error)
148+
end
127149
end
128150
end
129151

130-
def in_json_format(aws_list, gcp_list)
152+
def in_json_format(aws_list, gcp_list, ibm_list)
131153
aws_list_json = if aws_list.error?
132154
{ aws: aws_list.error }
133155
else
@@ -138,18 +160,25 @@ def in_json_format(aws_list, gcp_list)
138160
else
139161
{ gcp: gcp_list.value }
140162
end
141-
JSON.generate(aws_list_json.merge(gcp_list_json))
163+
ibm_list_json = if ibm_list.error?
164+
{ ibm: ibm_list.error }
165+
else
166+
{ ibm: ibm_list.value }
167+
end
168+
JSON.generate(aws_list_json.merge(gcp_list_json, ibm_list_json))
142169
end
143170

144-
def in_table_format(list, with_user_info)
171+
def in_table_format(list, with_user_info, provider)
145172
return 'List empty' if list.empty?
146173

147174
header = ['Launch time', 'Node name']
175+
header.concat(['PVM Instance ID']) if provider == 'ibm'
148176
header.concat(['Zone' ,'Path', 'User']) if with_user_info
149177
table = TTY::Table.new(header: header)
150178
list.each do |instance|
151179
info = [instance[:launch_time], instance[:node_name]]
152180
info.concat([instance[:zone] ,instance[:path], instance[:username]]) if with_user_info
181+
info.concat([instance[:instance_id]]) if provider == 'ibm'
153182
table << info
154183
end
155184
table.render(:unicode)

‎core/services/ibm_service.rb

+22
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@ def initialize(ibm_config, logger)
2121
@ibm_iam_token = retrieve_iam_token
2222
end
2323

24+
def configured?
25+
@configured
26+
end
27+
2428
def instance_exists?(instance_name)
2529
instance_data = fetch_pvm_instance_data(instance_name)
2630
!instance_data.nil?
@@ -31,6 +35,24 @@ def public_network_exists?(instance_name)
3135
!public_network_data.nil?
3236
end
3337

38+
def instances_list_with_time
39+
return [] unless configured?
40+
41+
list_instances['pvmInstances']
42+
.map { |instance| generate_instance_info(instance) }
43+
.sort_by { |vm| DateTime.parse(vm[:launch_time]) }
44+
.reverse
45+
end
46+
47+
def generate_instance_info(instance)
48+
{
49+
launch_time: instance['creationDate'],
50+
node_name: instance['serverName'],
51+
instance_id: instance['pvmInstanceID']
52+
}
53+
end
54+
55+
3456
def delete_ssh_key(key_pair_name)
3557
uri = URI("https://#{@ibm_region}.power-iaas.cloud.ibm.com/pcloud/v1/tenants/#{@ibm_tenant_id}/sshkeys/#{key_pair_name}")
3658
send_delete_request(uri)

0 commit comments

Comments
 (0)
Please sign in to comment.