knife-ionoscloud 5.0.0.beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitbook.yaml +4 -0
- data/.github/ISSUE_TEMPLATE/bug_report.md +54 -0
- data/.github/ISSUE_TEMPLATE/config.yml +5 -0
- data/.github/ISSUE_TEMPLATE/feature_request.md +51 -0
- data/.github/workflows/ci.yml +38 -0
- data/.github/workflows/publish.yml +58 -0
- data/.gitignore +26 -0
- data/.rubocop.yml +148 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +201 -0
- data/Rakefile +7 -0
- data/docs/README.md +67 -0
- data/docs/changelog.md +1 -0
- data/docs/docs_generator.rb +107 -0
- data/docs/subcommands/backupunit_create.md +38 -0
- data/docs/subcommands/backupunit_delete.md +26 -0
- data/docs/subcommands/backupunit_list.md +26 -0
- data/docs/subcommands/backupunit_ssourl.md +30 -0
- data/docs/subcommands/composite_server_create.md +97 -0
- data/docs/subcommands/contract_list.md +26 -0
- data/docs/subcommands/datacenter_create.md +41 -0
- data/docs/subcommands/datacenter_delete.md +26 -0
- data/docs/subcommands/datacenter_list.md +26 -0
- data/docs/subcommands/firewall_create.md +65 -0
- data/docs/subcommands/firewall_delete.md +38 -0
- data/docs/subcommands/firewall_list.md +38 -0
- data/docs/subcommands/group_create.md +48 -0
- data/docs/subcommands/group_delete.md +26 -0
- data/docs/subcommands/group_get.md +30 -0
- data/docs/subcommands/group_list.md +29 -0
- data/docs/subcommands/group_user_add.md +30 -0
- data/docs/subcommands/group_user_remove.md +30 -0
- data/docs/subcommands/image_list.md +26 -0
- data/docs/subcommands/ipblock_create.md +37 -0
- data/docs/subcommands/ipblock_delete.md +26 -0
- data/docs/subcommands/ipblock_list.md +26 -0
- data/docs/subcommands/ipfailover_add.md +46 -0
- data/docs/subcommands/ipfailover_remove.md +42 -0
- data/docs/subcommands/k8s_create.md +39 -0
- data/docs/subcommands/k8s_delete.md +26 -0
- data/docs/subcommands/k8s_list.md +26 -0
- data/docs/subcommands/kubeconfig_get.md +30 -0
- data/docs/subcommands/label_add.md +45 -0
- data/docs/subcommands/label_list.md +35 -0
- data/docs/subcommands/label_remove.md +37 -0
- data/docs/subcommands/lan_create.md +36 -0
- data/docs/subcommands/lan_delete.md +30 -0
- data/docs/subcommands/lan_list.md +30 -0
- data/docs/subcommands/loadbalancer_create.md +43 -0
- data/docs/subcommands/loadbalancer_delete.md +30 -0
- data/docs/subcommands/loadbalancer_get.md +34 -0
- data/docs/subcommands/loadbalancer_list.md +30 -0
- data/docs/subcommands/loadbalancer_nic_add.md +34 -0
- data/docs/subcommands/loadbalancer_nic_remove.md +34 -0
- data/docs/subcommands/location_list.md +26 -0
- data/docs/subcommands/nic_create.md +51 -0
- data/docs/subcommands/nic_delete.md +34 -0
- data/docs/subcommands/nic_list.md +34 -0
- data/docs/subcommands/node_delete.md +34 -0
- data/docs/subcommands/node_list.md +34 -0
- data/docs/subcommands/node_replace.md +36 -0
- data/docs/subcommands/nodepool_create.md +87 -0
- data/docs/subcommands/nodepool_delete.md +30 -0
- data/docs/subcommands/nodepool_list.md +30 -0
- data/docs/subcommands/pcc_create.md +38 -0
- data/docs/subcommands/pcc_delete.md +26 -0
- data/docs/subcommands/pcc_list.md +26 -0
- data/docs/subcommands/request_list.md +32 -0
- data/docs/subcommands/request_status.md +30 -0
- data/docs/subcommands/request_wait.md +30 -0
- data/docs/subcommands/resource_list.md +34 -0
- data/docs/subcommands/s3key_create.md +30 -0
- data/docs/subcommands/s3key_delete.md +30 -0
- data/docs/subcommands/s3key_list.md +30 -0
- data/docs/subcommands/server_create.md +55 -0
- data/docs/subcommands/server_delete.md +32 -0
- data/docs/subcommands/server_list.md +30 -0
- data/docs/subcommands/server_reboot.md +30 -0
- data/docs/subcommands/server_start.md +30 -0
- data/docs/subcommands/server_stop.md +30 -0
- data/docs/subcommands/share_create.md +40 -0
- data/docs/subcommands/share_delete.md +30 -0
- data/docs/subcommands/share_list.md +30 -0
- data/docs/subcommands/snapshot_create.md +34 -0
- data/docs/subcommands/snapshot_delete.md +26 -0
- data/docs/subcommands/snapshot_list.md +26 -0
- data/docs/subcommands/snapshot_restore.md +38 -0
- data/docs/subcommands/user_create.md +49 -0
- data/docs/subcommands/user_delete.md +26 -0
- data/docs/subcommands/user_list.md +29 -0
- data/docs/subcommands/user_ssourl.md +30 -0
- data/docs/subcommands/volume_attach.md +34 -0
- data/docs/subcommands/volume_create.md +63 -0
- data/docs/subcommands/volume_delete.md +30 -0
- data/docs/subcommands/volume_detach.md +36 -0
- data/docs/subcommands/volume_list.md +33 -0
- data/docs/summary.md +89 -0
- data/docs/templates/subcommand_doc.mustache +26 -0
- data/docs/templates/summary.mustache +10 -0
- data/knife-ionoscloud.gemspec +27 -0
- data/lib/chef/knife/ionoscloud_backupunit_create.rb +63 -0
- data/lib/chef/knife/ionoscloud_backupunit_delete.rb +55 -0
- data/lib/chef/knife/ionoscloud_backupunit_list.rb +41 -0
- data/lib/chef/knife/ionoscloud_backupunit_ssourl.rb +39 -0
- data/lib/chef/knife/ionoscloud_base.rb +76 -0
- data/lib/chef/knife/ionoscloud_composite_server_create.rb +217 -0
- data/lib/chef/knife/ionoscloud_contract_list.rb +50 -0
- data/lib/chef/knife/ionoscloud_datacenter_create.rb +66 -0
- data/lib/chef/knife/ionoscloud_datacenter_delete.rb +56 -0
- data/lib/chef/knife/ionoscloud_datacenter_list.rb +50 -0
- data/lib/chef/knife/ionoscloud_firewall_create.rb +135 -0
- data/lib/chef/knife/ionoscloud_firewall_delete.rb +76 -0
- data/lib/chef/knife/ionoscloud_firewall_list.rb +72 -0
- data/lib/chef/knife/ionoscloud_group_create.rb +89 -0
- data/lib/chef/knife/ionoscloud_group_delete.rb +61 -0
- data/lib/chef/knife/ionoscloud_group_get.rb +46 -0
- data/lib/chef/knife/ionoscloud_group_list.rb +62 -0
- data/lib/chef/knife/ionoscloud_group_user_add.rb +72 -0
- data/lib/chef/knife/ionoscloud_group_user_remove.rb +72 -0
- data/lib/chef/knife/ionoscloud_image_list.rb +47 -0
- data/lib/chef/knife/ionoscloud_ipblock_create.rb +63 -0
- data/lib/chef/knife/ionoscloud_ipblock_delete.rb +50 -0
- data/lib/chef/knife/ionoscloud_ipblock_list.rb +42 -0
- data/lib/chef/knife/ionoscloud_ipfailover_add.rb +76 -0
- data/lib/chef/knife/ionoscloud_ipfailover_remove.rb +76 -0
- data/lib/chef/knife/ionoscloud_k8s_create.rb +79 -0
- data/lib/chef/knife/ionoscloud_k8s_delete.rb +67 -0
- data/lib/chef/knife/ionoscloud_k8s_list.rb +45 -0
- data/lib/chef/knife/ionoscloud_kubeconfig_get.rb +37 -0
- data/lib/chef/knife/ionoscloud_label_add.rb +84 -0
- data/lib/chef/knife/ionoscloud_label_list.rb +83 -0
- data/lib/chef/knife/ionoscloud_label_remove.rb +77 -0
- data/lib/chef/knife/ionoscloud_lan_create.rb +69 -0
- data/lib/chef/knife/ionoscloud_lan_delete.rb +54 -0
- data/lib/chef/knife/ionoscloud_lan_list.rb +46 -0
- data/lib/chef/knife/ionoscloud_loadbalancer_create.rb +87 -0
- data/lib/chef/knife/ionoscloud_loadbalancer_delete.rb +68 -0
- data/lib/chef/knife/ionoscloud_loadbalancer_get.rb +51 -0
- data/lib/chef/knife/ionoscloud_loadbalancer_list.rb +50 -0
- data/lib/chef/knife/ionoscloud_loadbalancer_nic_add.rb +75 -0
- data/lib/chef/knife/ionoscloud_loadbalancer_nic_remove.rb +76 -0
- data/lib/chef/knife/ionoscloud_location_list.rb +38 -0
- data/lib/chef/knife/ionoscloud_nic_create.rb +104 -0
- data/lib/chef/knife/ionoscloud_nic_delete.rb +62 -0
- data/lib/chef/knife/ionoscloud_nic_list.rb +57 -0
- data/lib/chef/knife/ionoscloud_node_delete.rb +65 -0
- data/lib/chef/knife/ionoscloud_node_list.rb +55 -0
- data/lib/chef/knife/ionoscloud_node_replace.rb +54 -0
- data/lib/chef/knife/ionoscloud_nodepool_create.rb +163 -0
- data/lib/chef/knife/ionoscloud_nodepool_delete.rb +60 -0
- data/lib/chef/knife/ionoscloud_nodepool_list.rb +51 -0
- data/lib/chef/knife/ionoscloud_pcc_create.rb +68 -0
- data/lib/chef/knife/ionoscloud_pcc_delete.rb +57 -0
- data/lib/chef/knife/ionoscloud_pcc_list.rb +41 -0
- data/lib/chef/knife/ionoscloud_request_list.rb +94 -0
- data/lib/chef/knife/ionoscloud_request_status.rb +37 -0
- data/lib/chef/knife/ionoscloud_request_wait.rb +41 -0
- data/lib/chef/knife/ionoscloud_resource_list.rb +81 -0
- data/lib/chef/knife/ionoscloud_s3key_create.rb +45 -0
- data/lib/chef/knife/ionoscloud_s3key_delete.rb +57 -0
- data/lib/chef/knife/ionoscloud_s3key_list.rb +46 -0
- data/lib/chef/knife/ionoscloud_server_create.rb +104 -0
- data/lib/chef/knife/ionoscloud_server_delete.rb +62 -0
- data/lib/chef/knife/ionoscloud_server_list.rb +58 -0
- data/lib/chef/knife/ionoscloud_server_reboot.rb +45 -0
- data/lib/chef/knife/ionoscloud_server_start.rb +43 -0
- data/lib/chef/knife/ionoscloud_server_stop.rb +44 -0
- data/lib/chef/knife/ionoscloud_share_create.rb +71 -0
- data/lib/chef/knife/ionoscloud_share_delete.rb +55 -0
- data/lib/chef/knife/ionoscloud_share_list.rb +47 -0
- data/lib/chef/knife/ionoscloud_snapshot_create.rb +58 -0
- data/lib/chef/knife/ionoscloud_snapshot_delete.rb +54 -0
- data/lib/chef/knife/ionoscloud_snapshot_list.rb +45 -0
- data/lib/chef/knife/ionoscloud_snapshot_restore.rb +69 -0
- data/lib/chef/knife/ionoscloud_user_create.rb +83 -0
- data/lib/chef/knife/ionoscloud_user_delete.rb +56 -0
- data/lib/chef/knife/ionoscloud_user_list.rb +60 -0
- data/lib/chef/knife/ionoscloud_user_ssourl.rb +37 -0
- data/lib/chef/knife/ionoscloud_volume_attach.rb +52 -0
- data/lib/chef/knife/ionoscloud_volume_create.rb +133 -0
- data/lib/chef/knife/ionoscloud_volume_delete.rb +67 -0
- data/lib/chef/knife/ionoscloud_volume_detach.rb +77 -0
- data/lib/chef/knife/ionoscloud_volume_list.rb +70 -0
- data/lib/knife-ionoscloud/version.rb +6 -0
- data/spec/chef/knife/ionoscloud_backupunit_create_spec.rb +65 -0
- data/spec/chef/knife/ionoscloud_backupunit_delete_spec.rb +101 -0
- data/spec/chef/knife/ionoscloud_backupunit_list_spec.rb +72 -0
- data/spec/chef/knife/ionoscloud_backupunit_ssourl_spec.rb +93 -0
- data/spec/chef/knife/ionoscloud_base_spec.rb +157 -0
- data/spec/chef/knife/ionoscloud_composite_server_create_spec.rb +111 -0
- data/spec/chef/knife/ionoscloud_contract_list_spec.rb +81 -0
- data/spec/chef/knife/ionoscloud_datacenter_create_spec.rb +72 -0
- data/spec/chef/knife/ionoscloud_datacenter_delete_spec.rb +102 -0
- data/spec/chef/knife/ionoscloud_datacenter_list_spec.rb +76 -0
- data/spec/chef/knife/ionoscloud_firewall_create_spec.rb +90 -0
- data/spec/chef/knife/ionoscloud_firewall_delete_spec.rb +117 -0
- data/spec/chef/knife/ionoscloud_firewall_list_spec.rb +90 -0
- data/spec/chef/knife/ionoscloud_group_create_spec.rb +76 -0
- data/spec/chef/knife/ionoscloud_group_delete_spec.rb +109 -0
- data/spec/chef/knife/ionoscloud_group_get_spec.rb +73 -0
- data/spec/chef/knife/ionoscloud_group_list_spec.rb +115 -0
- data/spec/chef/knife/ionoscloud_group_user_add_spec.rb +134 -0
- data/spec/chef/knife/ionoscloud_group_user_remove_spec.rb +130 -0
- data/spec/chef/knife/ionoscloud_image_list_spec.rb +75 -0
- data/spec/chef/knife/ionoscloud_ipblock_create_spec.rb +72 -0
- data/spec/chef/knife/ionoscloud_ipblock_delete_spec.rb +102 -0
- data/spec/chef/knife/ionoscloud_ipblock_list_spec.rb +74 -0
- data/spec/chef/knife/ionoscloud_ipfailover_add_spec.rb +83 -0
- data/spec/chef/knife/ionoscloud_ipfailover_remove_spec.rb +122 -0
- data/spec/chef/knife/ionoscloud_k8s_create_spec.rb +83 -0
- data/spec/chef/knife/ionoscloud_k8s_delete_spec.rb +172 -0
- data/spec/chef/knife/ionoscloud_k8s_list_spec.rb +73 -0
- data/spec/chef/knife/ionoscloud_kubeconfig_get_spec.rb +91 -0
- data/spec/chef/knife/ionoscloud_label_add_spec.rb +287 -0
- data/spec/chef/knife/ionoscloud_label_list_spec.rb +337 -0
- data/spec/chef/knife/ionoscloud_label_remove_spec.rb +391 -0
- data/spec/chef/knife/ionoscloud_lan_create_spec.rb +77 -0
- data/spec/chef/knife/ionoscloud_lan_delete_spec.rb +103 -0
- data/spec/chef/knife/ionoscloud_lan_list_spec.rb +73 -0
- data/spec/chef/knife/ionoscloud_loadbalancer_create_spec.rb +82 -0
- data/spec/chef/knife/ionoscloud_loadbalancer_delete_spec.rb +107 -0
- data/spec/chef/knife/ionoscloud_loadbalancer_get_spec.rb +68 -0
- data/spec/chef/knife/ionoscloud_loadbalancer_list_spec.rb +74 -0
- data/spec/chef/knife/ionoscloud_loadbalancer_nic_add_spec.rb +128 -0
- data/spec/chef/knife/ionoscloud_loadbalancer_nic_remove_spec.rb +124 -0
- data/spec/chef/knife/ionoscloud_location_list_spec.rb +67 -0
- data/spec/chef/knife/ionoscloud_nic_create_spec.rb +85 -0
- data/spec/chef/knife/ionoscloud_nic_delete_spec.rb +108 -0
- data/spec/chef/knife/ionoscloud_nic_list_spec.rb +83 -0
- data/spec/chef/knife/ionoscloud_node_delete_spec.rb +107 -0
- data/spec/chef/knife/ionoscloud_node_list_spec.rb +75 -0
- data/spec/chef/knife/ionoscloud_node_replace_spec.rb +94 -0
- data/spec/chef/knife/ionoscloud_nodepool_create_spec.rb +99 -0
- data/spec/chef/knife/ionoscloud_nodepool_delete_spec.rb +106 -0
- data/spec/chef/knife/ionoscloud_nodepool_list_spec.rb +76 -0
- data/spec/chef/knife/ionoscloud_pcc_create_spec.rb +70 -0
- data/spec/chef/knife/ionoscloud_pcc_delete_spec.rb +106 -0
- data/spec/chef/knife/ionoscloud_pcc_list_spec.rb +69 -0
- data/spec/chef/knife/ionoscloud_request_list_spec.rb +165 -0
- data/spec/chef/knife/ionoscloud_request_status_spec.rb +92 -0
- data/spec/chef/knife/ionoscloud_request_wait_spec.rb +74 -0
- data/spec/chef/knife/ionoscloud_resource_list_spec.rb +155 -0
- data/spec/chef/knife/ionoscloud_s3key_create_spec.rb +64 -0
- data/spec/chef/knife/ionoscloud_s3key_delete_spec.rb +103 -0
- data/spec/chef/knife/ionoscloud_s3key_list_spec.rb +70 -0
- data/spec/chef/knife/ionoscloud_server_create_spec.rb +84 -0
- data/spec/chef/knife/ionoscloud_server_delete_spec.rb +108 -0
- data/spec/chef/knife/ionoscloud_server_list_spec.rb +85 -0
- data/spec/chef/knife/ionoscloud_server_reboot_spec.rb +95 -0
- data/spec/chef/knife/ionoscloud_server_start_spec.rb +95 -0
- data/spec/chef/knife/ionoscloud_server_stop_spec.rb +95 -0
- data/spec/chef/knife/ionoscloud_share_create_spec.rb +68 -0
- data/spec/chef/knife/ionoscloud_share_delete_spec.rb +103 -0
- data/spec/chef/knife/ionoscloud_share_list_spec.rb +70 -0
- data/spec/chef/knife/ionoscloud_snapshot_create_spec.rb +74 -0
- data/spec/chef/knife/ionoscloud_snapshot_delete_spec.rb +103 -0
- data/spec/chef/knife/ionoscloud_snapshot_list_spec.rb +73 -0
- data/spec/chef/knife/ionoscloud_snapshot_restore_spec.rb +78 -0
- data/spec/chef/knife/ionoscloud_user_create_spec.rb +73 -0
- data/spec/chef/knife/ionoscloud_user_delete_spec.rb +104 -0
- data/spec/chef/knife/ionoscloud_user_list_spec.rb +103 -0
- data/spec/chef/knife/ionoscloud_user_ssourl_spec.rb +93 -0
- data/spec/chef/knife/ionoscloud_volume_attach_spec.rb +99 -0
- data/spec/chef/knife/ionoscloud_volume_create_spec.rb +143 -0
- data/spec/chef/knife/ionoscloud_volume_delete_spec.rb +108 -0
- data/spec/chef/knife/ionoscloud_volume_detach_spec.rb +110 -0
- data/spec/chef/knife/ionoscloud_volume_list_spec.rb +118 -0
- data/spec/spec_helper.rb +702 -0
- data/spec/test.sh +3 -0
- data/summary.md +0 -0
- metadata +460 -0
@@ -0,0 +1,38 @@
|
|
1
|
+
require_relative 'ionoscloud_base'
|
2
|
+
|
3
|
+
class Chef
|
4
|
+
class Knife
|
5
|
+
class IonoscloudLocationList < Knife
|
6
|
+
include Knife::IonoscloudBase
|
7
|
+
|
8
|
+
banner 'knife ionoscloud location list'
|
9
|
+
|
10
|
+
attr_reader :description, :required_options
|
11
|
+
|
12
|
+
def initialize(args = [])
|
13
|
+
super(args)
|
14
|
+
@description =
|
15
|
+
'List available physical locations where resources can reside.'
|
16
|
+
@required_options = [:ionoscloud_username, :ionoscloud_password]
|
17
|
+
end
|
18
|
+
|
19
|
+
def run
|
20
|
+
$stdout.sync = true
|
21
|
+
validate_required_params(@required_options, config)
|
22
|
+
|
23
|
+
location_list = [
|
24
|
+
ui.color('ID', :bold),
|
25
|
+
ui.color('Name', :bold)
|
26
|
+
]
|
27
|
+
location_api = Ionoscloud::LocationApi.new(api_client)
|
28
|
+
|
29
|
+
location_api.locations_get({ depth: 1 }).items.each do |location|
|
30
|
+
location_list << location.id
|
31
|
+
location_list << location.properties.name
|
32
|
+
end
|
33
|
+
|
34
|
+
puts ui.list(location_list, :uneven_columns_across, 2)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,104 @@
|
|
1
|
+
require_relative 'ionoscloud_base'
|
2
|
+
|
3
|
+
class Chef
|
4
|
+
class Knife
|
5
|
+
class IonoscloudNicCreate < Knife
|
6
|
+
include Knife::IonoscloudBase
|
7
|
+
|
8
|
+
banner 'knife ionoscloud nic create (options)'
|
9
|
+
|
10
|
+
option :datacenter_id,
|
11
|
+
short: '-D DATACENTER_ID',
|
12
|
+
long: '--datacenter-id DATACENTER_ID',
|
13
|
+
description: 'Name of the data center'
|
14
|
+
|
15
|
+
option :server_id,
|
16
|
+
short: '-S SERVER_ID',
|
17
|
+
long: '--server-id SERVER_ID',
|
18
|
+
description: 'Name of the server'
|
19
|
+
|
20
|
+
option :name,
|
21
|
+
short: '-n NAME',
|
22
|
+
long: '--name NAME',
|
23
|
+
description: 'Name of the NIC'
|
24
|
+
|
25
|
+
option :ips,
|
26
|
+
short: '-i IP[,IP,...]',
|
27
|
+
long: '--ips IP[,IP,...]',
|
28
|
+
description: 'IPs assigned to the NIC'
|
29
|
+
|
30
|
+
option :dhcp,
|
31
|
+
short: '-d',
|
32
|
+
long: '--dhcp',
|
33
|
+
boolean: true | false,
|
34
|
+
default: true,
|
35
|
+
description: 'Set to false if you wish to disable DHCP'
|
36
|
+
|
37
|
+
option :lan,
|
38
|
+
short: '-l ID',
|
39
|
+
long: '--lan ID',
|
40
|
+
description: 'The LAN ID the NIC will reside on; if the LAN ID does not exist it will be created'
|
41
|
+
|
42
|
+
option :nat,
|
43
|
+
long: '--nat',
|
44
|
+
description: 'Set to enable NAT on the NIC'
|
45
|
+
|
46
|
+
attr_reader :description, :required_options
|
47
|
+
|
48
|
+
def initialize(args = [])
|
49
|
+
super(args)
|
50
|
+
@description =
|
51
|
+
"Creates a NIC on the specified server.\n"\
|
52
|
+
"The Ionoscloud platform supports adding multiple NICs to a server. These NICs "\
|
53
|
+
"can be used to create different, segmented networks on the platform."
|
54
|
+
@required_options = [:datacenter_id, :server_id, :lan, :ionoscloud_username, :ionoscloud_password]
|
55
|
+
end
|
56
|
+
|
57
|
+
def run
|
58
|
+
$stdout.sync = true
|
59
|
+
validate_required_params(@required_options, config)
|
60
|
+
|
61
|
+
print "#{ui.color('Creating nic...', :magenta)}"
|
62
|
+
|
63
|
+
if config[:ips]
|
64
|
+
config[:ips] = config[:ips].split(',')
|
65
|
+
end
|
66
|
+
|
67
|
+
params = {
|
68
|
+
name: config[:name],
|
69
|
+
ips: config[:ips],
|
70
|
+
dhcp: config[:dhcp],
|
71
|
+
lan: config[:lan],
|
72
|
+
nat: !config[:nat].nil?,
|
73
|
+
}
|
74
|
+
|
75
|
+
nic_api = Ionoscloud::NicApi.new(api_client)
|
76
|
+
|
77
|
+
nic, _, headers = nic_api.datacenters_servers_nics_post_with_http_info(
|
78
|
+
config[:datacenter_id],
|
79
|
+
config[:server_id],
|
80
|
+
{ properties: params.compact },
|
81
|
+
)
|
82
|
+
|
83
|
+
dot = ui.color('.', :magenta)
|
84
|
+
api_client.wait_for { print dot; is_done? get_request_id headers }
|
85
|
+
|
86
|
+
nic = nic_api.datacenters_servers_nics_find_by_id(
|
87
|
+
config[:datacenter_id],
|
88
|
+
config[:server_id],
|
89
|
+
nic.id,
|
90
|
+
)
|
91
|
+
|
92
|
+
puts "\n"
|
93
|
+
puts "#{ui.color('ID', :cyan)}: #{nic.id}"
|
94
|
+
puts "#{ui.color('Name', :cyan)}: #{nic.properties.name}"
|
95
|
+
puts "#{ui.color('IPs', :cyan)}: #{nic.properties.ips.to_s}"
|
96
|
+
puts "#{ui.color('DHCP', :cyan)}: #{nic.properties.dhcp}"
|
97
|
+
puts "#{ui.color('LAN', :cyan)}: #{nic.properties.lan}"
|
98
|
+
puts "#{ui.color('NAT', :cyan)}: #{nic.properties.nat}"
|
99
|
+
|
100
|
+
puts 'done'
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require_relative 'ionoscloud_base'
|
2
|
+
|
3
|
+
class Chef
|
4
|
+
class Knife
|
5
|
+
class IonoscloudNicDelete < Knife
|
6
|
+
include Knife::IonoscloudBase
|
7
|
+
|
8
|
+
banner 'knife ionoscloud nic delete NIC_ID [NIC_ID] (options)'
|
9
|
+
|
10
|
+
option :datacenter_id,
|
11
|
+
short: '-D DATACENTER_ID',
|
12
|
+
long: '--datacenter-id DATACENTER_ID',
|
13
|
+
description: 'The ID of the data center'
|
14
|
+
|
15
|
+
option :server_id,
|
16
|
+
short: '-S SERVER_ID',
|
17
|
+
long: '--server-id SERVER_ID',
|
18
|
+
description: 'The ID of the server assigned the NIC'
|
19
|
+
|
20
|
+
attr_reader :description, :required_options
|
21
|
+
|
22
|
+
def initialize(args = [])
|
23
|
+
super(args)
|
24
|
+
@description =
|
25
|
+
'Deletes an existing NIC from a server.'
|
26
|
+
@required_options = [:datacenter_id, :server_id, :ionoscloud_username, :ionoscloud_password]
|
27
|
+
end
|
28
|
+
|
29
|
+
def run
|
30
|
+
$stdout.sync = true
|
31
|
+
validate_required_params(@required_options, config)
|
32
|
+
|
33
|
+
nic_api = Ionoscloud::NicApi.new(api_client)
|
34
|
+
@name_args.each do |nic_id|
|
35
|
+
begin
|
36
|
+
nic = nic_api.datacenters_servers_nics_find_by_id(config[:datacenter_id], config[:server_id], nic_id)
|
37
|
+
rescue Ionoscloud::ApiError => err
|
38
|
+
raise err unless err.code == 404
|
39
|
+
ui.error("Nic ID #{nic_id} not found. Skipping.")
|
40
|
+
next
|
41
|
+
end
|
42
|
+
|
43
|
+
msg_pair('ID', nic.id)
|
44
|
+
msg_pair('Name', nic.properties.name)
|
45
|
+
msg_pair('IPs', nic.properties.ips)
|
46
|
+
msg_pair('DHCP', nic.properties.dhcp)
|
47
|
+
msg_pair('LAN', nic.properties.lan)
|
48
|
+
msg_pair('NAT', nic.properties.nat)
|
49
|
+
|
50
|
+
begin
|
51
|
+
confirm('Do you really want to delete this Nic')
|
52
|
+
rescue SystemExit => exc
|
53
|
+
next
|
54
|
+
end
|
55
|
+
|
56
|
+
_, _, headers = nic_api.datacenters_servers_nics_delete_with_http_info(config[:datacenter_id], config[:server_id], nic.id)
|
57
|
+
ui.warn("Deleted Nic #{nic.id}. Request ID: #{get_request_id headers}")
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require_relative 'ionoscloud_base'
|
2
|
+
|
3
|
+
class Chef
|
4
|
+
class Knife
|
5
|
+
class IonoscloudNicList < Knife
|
6
|
+
include Knife::IonoscloudBase
|
7
|
+
|
8
|
+
banner 'knife ionoscloud nic list (options)'
|
9
|
+
|
10
|
+
option :datacenter_id,
|
11
|
+
short: '-D DATACENTER_ID',
|
12
|
+
long: '--datacenter-id DATACENTER_ID',
|
13
|
+
description: 'The ID of the datacenter containing the NIC'
|
14
|
+
|
15
|
+
option :server_id,
|
16
|
+
short: '-S SERVER_ID',
|
17
|
+
long: '--server-id SERVER_ID',
|
18
|
+
description: 'The ID of the server assigned the NIC'
|
19
|
+
|
20
|
+
attr_reader :description, :required_options
|
21
|
+
|
22
|
+
def initialize(args = [])
|
23
|
+
super(args)
|
24
|
+
@description =
|
25
|
+
'List all available NICs connected to a server.'
|
26
|
+
@required_options = [:datacenter_id, :server_id, :ionoscloud_username, :ionoscloud_password]
|
27
|
+
end
|
28
|
+
|
29
|
+
def run
|
30
|
+
$stdout.sync = true
|
31
|
+
validate_required_params(@required_options, config)
|
32
|
+
|
33
|
+
nic_list = [
|
34
|
+
ui.color('ID', :bold),
|
35
|
+
ui.color('Name', :bold),
|
36
|
+
ui.color('IPs', :bold),
|
37
|
+
ui.color('DHCP', :bold),
|
38
|
+
ui.color('NAT', :bold),
|
39
|
+
ui.color('LAN', :bold)
|
40
|
+
]
|
41
|
+
|
42
|
+
nic_api = Ionoscloud::NicApi.new(api_client)
|
43
|
+
|
44
|
+
nic_api.datacenters_servers_nics_get(config[:datacenter_id], config[:server_id], { depth: 1 }).items.each do |nic|
|
45
|
+
nic_list << nic.id
|
46
|
+
nic_list << nic.properties.name
|
47
|
+
nic_list << nic.properties.ips.to_s
|
48
|
+
nic_list << nic.properties.dhcp.to_s
|
49
|
+
nic_list << nic.properties.nat.to_s
|
50
|
+
nic_list << nic.properties.lan.to_s
|
51
|
+
end
|
52
|
+
|
53
|
+
puts ui.list(nic_list, :uneven_columns_across, 6)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
require_relative 'ionoscloud_base'
|
2
|
+
|
3
|
+
class Chef
|
4
|
+
class Knife
|
5
|
+
class IonoscloudNodeDelete < Knife
|
6
|
+
include Knife::IonoscloudBase
|
7
|
+
|
8
|
+
banner 'knife ionoscloud node delete NODE_ID [NODE_ID] (options)'
|
9
|
+
|
10
|
+
option :cluster_id,
|
11
|
+
short: '-C CLUSTER_ID',
|
12
|
+
long: '--cluster-id CLUSTER_ID',
|
13
|
+
description: 'The ID of the K8s Cluster'
|
14
|
+
|
15
|
+
|
16
|
+
option :nodepool_id,
|
17
|
+
short: '-P NODEPOOL_ID',
|
18
|
+
long: '--nodepool-id NODEPOOL_ID',
|
19
|
+
description: 'The ID of the K8s Nodepool'
|
20
|
+
|
21
|
+
attr_reader :description, :required_options
|
22
|
+
|
23
|
+
def initialize(args = [])
|
24
|
+
super(args)
|
25
|
+
@description =
|
26
|
+
'Delete a single Kubernetes Node.'
|
27
|
+
@required_options = [:cluster_id, :nodepool_id, :ionoscloud_username, :ionoscloud_password]
|
28
|
+
end
|
29
|
+
|
30
|
+
def run
|
31
|
+
$stdout.sync = true
|
32
|
+
validate_required_params(@required_options, config)
|
33
|
+
|
34
|
+
kubernetes_api = Ionoscloud::KubernetesApi.new(api_client)
|
35
|
+
|
36
|
+
@name_args.each do |node_id|
|
37
|
+
begin
|
38
|
+
node = kubernetes_api.k8s_nodepools_nodes_find_by_id(config[:cluster_id], config[:nodepool_id], node_id)
|
39
|
+
rescue Ionoscloud::ApiError => err
|
40
|
+
raise err unless err.code == 404
|
41
|
+
ui.error("K8s Node ID #{node_id} not found. Skipping.")
|
42
|
+
next
|
43
|
+
end
|
44
|
+
|
45
|
+
msg_pair('ID', node.id)
|
46
|
+
msg_pair('Name', node.properties.name)
|
47
|
+
msg_pair('Public IP', node.properties.public_ip)
|
48
|
+
msg_pair('K8s Version', node.properties.k8s_version)
|
49
|
+
msg_pair('State', node.metadata.state)
|
50
|
+
|
51
|
+
puts "\n"
|
52
|
+
|
53
|
+
begin
|
54
|
+
confirm('Do you really want to delete this K8s Node')
|
55
|
+
rescue SystemExit => exc
|
56
|
+
next
|
57
|
+
end
|
58
|
+
|
59
|
+
kubernetes_api.k8s_nodepools_nodes_delete(config[:cluster_id], config[:nodepool_id], node.id)
|
60
|
+
ui.warn("Deleted K8s Node #{node.id}.")
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require_relative 'ionoscloud_base'
|
2
|
+
|
3
|
+
class Chef
|
4
|
+
class Knife
|
5
|
+
class IonoscloudNodeList < Knife
|
6
|
+
include Knife::IonoscloudBase
|
7
|
+
|
8
|
+
banner 'knife ionoscloud node list'
|
9
|
+
|
10
|
+
option :cluster_id,
|
11
|
+
short: '-C CLUSTER_ID',
|
12
|
+
long: '--cluster-id CLUSTER_ID',
|
13
|
+
description: 'The ID of the K8s Cluster'
|
14
|
+
|
15
|
+
|
16
|
+
option :nodepool_id,
|
17
|
+
short: '-P NODEPOOL_ID',
|
18
|
+
long: '--nodepool-id NODEPOOL_ID',
|
19
|
+
description: 'The ID of the K8s Nodepool'
|
20
|
+
|
21
|
+
attr_reader :description, :required_options
|
22
|
+
|
23
|
+
def initialize(args = [])
|
24
|
+
super(args)
|
25
|
+
@description =
|
26
|
+
'Retrieve a list of Kubernetes Nodes in a Nodepool.'
|
27
|
+
@required_options = [:cluster_id, :nodepool_id, :ionoscloud_username, :ionoscloud_password]
|
28
|
+
end
|
29
|
+
|
30
|
+
def run
|
31
|
+
$stdout.sync = true
|
32
|
+
validate_required_params(@required_options, config)
|
33
|
+
|
34
|
+
node_list = [
|
35
|
+
ui.color('ID', :bold),
|
36
|
+
ui.color('Name', :bold),
|
37
|
+
ui.color('Public IP', :bold),
|
38
|
+
ui.color('K8s Version', :bold),
|
39
|
+
ui.color('State', :bold),
|
40
|
+
]
|
41
|
+
|
42
|
+
kubernetes_api = Ionoscloud::KubernetesApi.new(api_client)
|
43
|
+
|
44
|
+
kubernetes_api.k8s_nodepools_nodes_get(config[:cluster_id], config[:nodepool_id], { depth: 2 }).items.each do |node|
|
45
|
+
node_list << node.id
|
46
|
+
node_list << node.properties.name
|
47
|
+
node_list << node.properties.public_ip
|
48
|
+
node_list << node.properties.k8s_version
|
49
|
+
node_list << node.metadata.state
|
50
|
+
end
|
51
|
+
puts ui.list(node_list, :uneven_columns_across, 5)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require_relative 'ionoscloud_base'
|
2
|
+
|
3
|
+
class Chef
|
4
|
+
class Knife
|
5
|
+
class IonoscloudNodeReplace < Knife
|
6
|
+
include Knife::IonoscloudBase
|
7
|
+
|
8
|
+
banner 'knife ionoscloud node replace NODE_ID [NODE_ID] (options)'
|
9
|
+
|
10
|
+
option :cluster_id,
|
11
|
+
short: '-C CLUSTER_ID',
|
12
|
+
long: '--cluster-id CLUSTER_ID',
|
13
|
+
description: 'The ID of the K8s Cluster'
|
14
|
+
|
15
|
+
|
16
|
+
option :nodepool_id,
|
17
|
+
short: '-P NODEPOOL_ID',
|
18
|
+
long: '--nodepool-id NODEPOOL_ID',
|
19
|
+
description: 'The ID of the K8s Nodepool'
|
20
|
+
|
21
|
+
attr_reader :description, :required_options
|
22
|
+
|
23
|
+
def initialize(args = [])
|
24
|
+
super(args)
|
25
|
+
@description =
|
26
|
+
"You can recreate a single Kubernetes Node.\n\n"\
|
27
|
+
"Managed Kubernetes starts a process which based on the nodepool\'s "\
|
28
|
+
"template creates & configures a new node, waits for status \"ACTIVE\", "\
|
29
|
+
"and migrates all the pods from the faulty node, deleting it once empty. "\
|
30
|
+
"While this operation occurs, the nodepool will have an extra billable \"ACTIVE\" node."
|
31
|
+
@required_options = [:cluster_id, :nodepool_id, :ionoscloud_username, :ionoscloud_password]
|
32
|
+
end
|
33
|
+
|
34
|
+
def run
|
35
|
+
$stdout.sync = true
|
36
|
+
validate_required_params(@required_options, config)
|
37
|
+
|
38
|
+
kubernetes_api = Ionoscloud::KubernetesApi.new(api_client)
|
39
|
+
|
40
|
+
@name_args.each do |node_id|
|
41
|
+
begin
|
42
|
+
kubernetes_api.k8s_nodepools_nodes_replace_post(config[:cluster_id], config[:nodepool_id], node_id)
|
43
|
+
rescue Ionoscloud::ApiError => err
|
44
|
+
raise err unless err.code == 404
|
45
|
+
ui.error("K8s Node ID #{node_id} not found. Skipping.")
|
46
|
+
next
|
47
|
+
end
|
48
|
+
|
49
|
+
ui.warn("Recreated K8s Node #{node_id}.")
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,163 @@
|
|
1
|
+
require_relative 'ionoscloud_base'
|
2
|
+
|
3
|
+
class Chef
|
4
|
+
class Knife
|
5
|
+
class IonoscloudNodepoolCreate < Knife
|
6
|
+
include Knife::IonoscloudBase
|
7
|
+
|
8
|
+
banner 'knife ionoscloud nodepool create (options)'
|
9
|
+
|
10
|
+
option :datacenter_id,
|
11
|
+
short: '-D DATACENTER_ID',
|
12
|
+
long: '--datacenter-id DATACENTER_ID',
|
13
|
+
description: 'ID of the virtual datacenter'
|
14
|
+
|
15
|
+
option :cluster_id,
|
16
|
+
short: '-C CLUSTER_ID',
|
17
|
+
long: '--cluster-id CLUSTER_ID',
|
18
|
+
description: 'ID of the Kubernetes cluster'
|
19
|
+
|
20
|
+
option :name,
|
21
|
+
short: '-n NAME',
|
22
|
+
long: '--name NAME',
|
23
|
+
description: 'Name of the Kubernetes node pool'
|
24
|
+
|
25
|
+
option :version,
|
26
|
+
short: '-v VERSION',
|
27
|
+
long: '--version VERSION',
|
28
|
+
description: 'The version for the Kubernetes cluster.'
|
29
|
+
|
30
|
+
option :maintenance_day,
|
31
|
+
short: '-d MAINTENANCE_DAY',
|
32
|
+
long: '--maintenance-day MAINTENANCE_DAY',
|
33
|
+
description: 'Day Of the week when to perform the maintenance.'
|
34
|
+
|
35
|
+
option :maintenance_time,
|
36
|
+
short: '-t MAINTENANCE_TIME',
|
37
|
+
long: '--maintenance-time MAINTENANCE_TIME',
|
38
|
+
description: 'Time Of the day when to perform the maintenance.'
|
39
|
+
|
40
|
+
option :node_count,
|
41
|
+
short: '-c NODE_COUNT',
|
42
|
+
long: '--node-count NODE_COUNT',
|
43
|
+
description: 'The number of worker nodes that the node pool should contain. Min 2, Max: Determined by the resource availability.'
|
44
|
+
|
45
|
+
option :cpu_family,
|
46
|
+
short: '-f CPU_FAMILY',
|
47
|
+
long: '--cpu-family CPU_FAMILY',
|
48
|
+
description: 'Sets the CPU type. [AMD_OPTERON, INTEL_XEON, INTEL_SKYLAKE]',
|
49
|
+
default: 'INTEL_SKYLAKE'
|
50
|
+
|
51
|
+
option :cores,
|
52
|
+
long: '--cores CORES',
|
53
|
+
description: 'The total number of cores for the node.'
|
54
|
+
|
55
|
+
option :ram,
|
56
|
+
short: '-r RAM',
|
57
|
+
long: '--ram RAM',
|
58
|
+
description: 'The amount of RAM in MB'
|
59
|
+
|
60
|
+
option :availability_zone,
|
61
|
+
short: '-a AVAILABILITY_ZONE',
|
62
|
+
long: '--availability-zone AVAILABILITY_ZONE',
|
63
|
+
description: 'The availability zone of the node pool',
|
64
|
+
default: 'AUTO'
|
65
|
+
|
66
|
+
option :storage_type,
|
67
|
+
long: '--storage-type STORAGE_TYPE',
|
68
|
+
description: 'Sets the storage type. [HDD, SSD]',
|
69
|
+
default: 'HDD'
|
70
|
+
|
71
|
+
option :storage_size,
|
72
|
+
long: '--storage-size STORAGE_SIZE',
|
73
|
+
description: 'The total allocated storage capacity of a node.'
|
74
|
+
|
75
|
+
option :min_node_count,
|
76
|
+
long: '--min-node-count MIN_NODE_COUNT',
|
77
|
+
description: 'The minimum number of worker nodes that the managed node group can scale in'
|
78
|
+
|
79
|
+
option :max_node_count,
|
80
|
+
long: '--max-node-count MAX_NODE_COUNT',
|
81
|
+
description: 'The maximum number of worker nodes that the managed node pool can scale-out.'
|
82
|
+
|
83
|
+
option :lans,
|
84
|
+
long: '--lans LAN_ID [LAN_ID]',
|
85
|
+
description: 'An array of additional private LANs attached to worker nodes'
|
86
|
+
|
87
|
+
attr_reader :description, :required_options
|
88
|
+
|
89
|
+
def initialize(args = [])
|
90
|
+
super(args)
|
91
|
+
@description =
|
92
|
+
"Creates a node pool into an existing Kubernetes cluster. "\
|
93
|
+
"The Kubernetes cluster must be in state \"ACTIVE\" before creating a node pool.\n\n"\
|
94
|
+
"The worker nodes within the node pools will be deployed into an existing data centers."
|
95
|
+
@required_options = [
|
96
|
+
:datacenter_id, :cluster_id, :name, :version, :node_count, :cpu_family, :cores, :ram,
|
97
|
+
:availability_zone, :storage_type, :storage_size, :ionoscloud_username, :ionoscloud_password,
|
98
|
+
]
|
99
|
+
end
|
100
|
+
|
101
|
+
def run
|
102
|
+
$stdout.sync = true
|
103
|
+
validate_required_params(@required_options, config)
|
104
|
+
|
105
|
+
print "#{ui.color('Creating K8s Nodepool...', :magenta)}"
|
106
|
+
|
107
|
+
kubernetes_api = Ionoscloud::KubernetesApi.new(api_client)
|
108
|
+
|
109
|
+
nodepool_properties = {
|
110
|
+
name: config[:name],
|
111
|
+
k8sVersion: config[:version],
|
112
|
+
datacenterId: config[:datacenter_id],
|
113
|
+
nodeCount: config[:node_count],
|
114
|
+
cpuFamily: config[:cpu_family],
|
115
|
+
coresCount: config[:cores],
|
116
|
+
ramSize: config[:ram],
|
117
|
+
availabilityZone: config[:availability_zone],
|
118
|
+
storageType: config[:storage_type],
|
119
|
+
storageSize: config[:storage_size],
|
120
|
+
}
|
121
|
+
|
122
|
+
if config[:maintenance_day] && config[:maintenance_time]
|
123
|
+
nodepool_properties[:maintenanceWindow] = {
|
124
|
+
dayOfTheWeek: config[:maintenance_day],
|
125
|
+
time: config[:maintenance_time],
|
126
|
+
}
|
127
|
+
end
|
128
|
+
|
129
|
+
if config[:min_node_count] || config[:max_node_count]
|
130
|
+
nodepool_properties[:autoScaling] = {}
|
131
|
+
nodepool_properties[:autoScaling][:minNodeCount] = config[:min_node_count] unless config[:min_node_count].nil?
|
132
|
+
nodepool_properties[:autoScaling][:maxNodeCount] = config[:max_node_count] unless config[:max_node_count].nil?
|
133
|
+
end
|
134
|
+
|
135
|
+
if config[:lans]
|
136
|
+
nodepool_properties[:lans] = config[:lans].split(',').map! { |lan| { id: Integer(lan) } }
|
137
|
+
end
|
138
|
+
|
139
|
+
nodepool = kubernetes_api.k8s_nodepools_post(config[:cluster_id], { properties: nodepool_properties })
|
140
|
+
|
141
|
+
auto_scaling = "Min node count: #{nodepool.properties.auto_scaling.min_node_count}, Max node count:#{nodepool.properties.auto_scaling.max_node_count}"
|
142
|
+
maintenance_window = "#{nodepool.properties.maintenance_window.day_of_the_week}, #{nodepool.properties.maintenance_window.time}"
|
143
|
+
|
144
|
+
puts "\n"
|
145
|
+
puts "#{ui.color('ID', :cyan)}: #{nodepool.id}"
|
146
|
+
puts "#{ui.color('Name', :cyan)}: #{nodepool.properties.name}"
|
147
|
+
puts "#{ui.color('K8s Version', :cyan)}: #{nodepool.properties.k8s_version}"
|
148
|
+
puts "#{ui.color('Datacenter ID', :cyan)}: #{nodepool.properties.datacenter_id}"
|
149
|
+
puts "#{ui.color('Node Count', :cyan)}: #{nodepool.properties.node_count}"
|
150
|
+
puts "#{ui.color('CPU Family', :cyan)}: #{nodepool.properties.cpu_family}"
|
151
|
+
puts "#{ui.color('Cores Count', :cyan)}: #{nodepool.properties.cores_count}"
|
152
|
+
puts "#{ui.color('RAM', :cyan)}: #{nodepool.properties.ram_size}"
|
153
|
+
puts "#{ui.color('Storage Type', :cyan)}: #{nodepool.properties.storage_type}"
|
154
|
+
puts "#{ui.color('Storage Size', :cyan)}: #{nodepool.properties.storage_size}"
|
155
|
+
puts "#{ui.color('Availability Zone', :cyan)}: #{nodepool.properties.availability_zone}"
|
156
|
+
puts "#{ui.color('Auto Scaling', :cyan)}: #{auto_scaling}"
|
157
|
+
puts "#{ui.color('Maintenance Window', :cyan)}: #{maintenance_window}"
|
158
|
+
puts "#{ui.color('State', :cyan)}: #{nodepool.metadata.state}"
|
159
|
+
puts 'done'
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
163
|
+
end
|