knife-oneandone 1.0.0 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +12 -12
  3. data/.rspec +2 -2
  4. data/.rubocop.yml +29 -26
  5. data/.travis.yml +5 -5
  6. data/Gemfile +4 -4
  7. data/LICENSE +201 -201
  8. data/README.md +358 -278
  9. data/Rakefile +6 -6
  10. data/knife-oneandone.gemspec +30 -31
  11. data/lib/1and1/helpers.rb +29 -29
  12. data/lib/chef/knife/oneandone_appliance_list.rb +39 -39
  13. data/lib/chef/knife/oneandone_base.rb +32 -32
  14. data/lib/chef/knife/oneandone_block_storage_attach.rb +33 -0
  15. data/lib/chef/knife/oneandone_block_storage_create.rb +64 -0
  16. data/lib/chef/knife/oneandone_block_storage_delete.rb +59 -0
  17. data/lib/chef/knife/oneandone_block_storage_detach.rb +28 -0
  18. data/lib/chef/knife/oneandone_block_storage_list.rb +42 -0
  19. data/lib/chef/knife/oneandone_block_storage_rename.rb +38 -0
  20. data/lib/chef/knife/oneandone_datacenter_list.rb +33 -33
  21. data/lib/chef/knife/oneandone_firewall_create.rb +97 -97
  22. data/lib/chef/knife/oneandone_firewall_delete.rb +59 -59
  23. data/lib/chef/knife/oneandone_firewall_list.rb +33 -33
  24. data/lib/chef/knife/oneandone_ip_list.rb +39 -39
  25. data/lib/chef/knife/oneandone_loadbalancer_create.rb +147 -147
  26. data/lib/chef/knife/oneandone_loadbalancer_delete.rb +59 -59
  27. data/lib/chef/knife/oneandone_loadbalancer_list.rb +39 -39
  28. data/lib/chef/knife/oneandone_mp_list.rb +37 -37
  29. data/lib/chef/knife/oneandone_server_baremetal_model_list.rb +31 -0
  30. data/lib/chef/knife/oneandone_server_create.rb +193 -163
  31. data/lib/chef/knife/oneandone_server_delete.rb +63 -63
  32. data/lib/chef/knife/oneandone_server_hdd_add.rb +60 -60
  33. data/lib/chef/knife/oneandone_server_hdd_delete.rb +55 -55
  34. data/lib/chef/knife/oneandone_server_hdd_list.rb +44 -44
  35. data/lib/chef/knife/oneandone_server_hdd_resize.rb +59 -59
  36. data/lib/chef/knife/oneandone_server_list.rb +35 -35
  37. data/lib/chef/knife/oneandone_server_modify.rb +80 -80
  38. data/lib/chef/knife/oneandone_server_reboot.rb +41 -41
  39. data/lib/chef/knife/oneandone_server_rename.rb +37 -37
  40. data/lib/chef/knife/oneandone_server_size_list.rb +39 -39
  41. data/lib/chef/knife/oneandone_server_start.rb +35 -35
  42. data/lib/chef/knife/oneandone_server_stop.rb +41 -41
  43. data/lib/chef/knife/oneandone_ssh_key_create.rb +54 -0
  44. data/lib/chef/knife/oneandone_ssh_key_delete.rb +59 -0
  45. data/lib/chef/knife/oneandone_ssh_key_list.rb +44 -0
  46. data/lib/chef/knife/oneandone_ssh_key_rename.rb +37 -0
  47. data/lib/knife-oneandone/version.rb +5 -5
  48. metadata +24 -13
@@ -0,0 +1,42 @@
1
+ require 'chef/knife/oneandone_base'
2
+
3
+ class Chef
4
+ class Knife
5
+ class OneandoneBlockStorageList < Knife
6
+ include Knife::OneandoneBase
7
+
8
+ banner 'knife oneandone block storage list'
9
+
10
+ def run
11
+ $stdout.sync = true
12
+
13
+ init_client
14
+
15
+ response = OneAndOne::BlockStorage.new.list
16
+ formated_output(response, true)
17
+
18
+ block_storages = [
19
+ ui.color('ID', :bold),
20
+ ui.color('Name', :bold),
21
+ ui.color('Size', :bold),
22
+ ui.color('State', :bold),
23
+ ui.color('Datacenter', :bold),
24
+ ui.color('Server ID', :bold),
25
+ ui.color('Server Name', :bold)
26
+ ]
27
+
28
+ response.each do |blks|
29
+ block_storages << blks['id']
30
+ block_storages << blks['name']
31
+ block_storages << blks['size'].to_s
32
+ block_storages << blks['state']
33
+ block_storages << blks['datacenter']['country_code']
34
+ block_storages << (blks['server'].nil? ? '' : blks['server']['id'])
35
+ block_storages << (blks['server'].nil? ? '' : blks['server']['name'])
36
+ end
37
+
38
+ puts ui.list(block_storages, :uneven_columns_across, 7)
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,38 @@
1
+ require 'chef/knife/oneandone_base'
2
+
3
+ class Chef
4
+ class Knife
5
+ class OneandoneBlockStorageRename < Knife
6
+ include Knife::OneandoneBase
7
+
8
+ banner 'knife oneandone block storage rename (options)'
9
+
10
+ option :name,
11
+ short: '-n NAME',
12
+ long: '--name NAME',
13
+ description: 'Name of the block storage'
14
+
15
+ option :description,
16
+ long: '--description DESCRIPTION',
17
+ description: 'Description of the block storage'
18
+
19
+ option :id,
20
+ short: '-I ID',
21
+ long: '--id ID',
22
+ description: 'Block storage ID'
23
+
24
+ def run
25
+ $stdout.sync = true
26
+
27
+ init_client
28
+
29
+ block_storage = OneAndOne::BlockStorage.new
30
+ response = block_storage.modify(block_storage_id: config[:id], name: config[:name],
31
+ description: config[:description])
32
+
33
+ formated_output(response, true)
34
+ puts "Block storage updated #{ui.color('updated', :bold)}"
35
+ end
36
+ end
37
+ end
38
+ end
@@ -1,33 +1,33 @@
1
- require 'chef/knife/oneandone_base'
2
-
3
- class Chef
4
- class Knife
5
- class OneandoneDatacenterList < Knife
6
- include Knife::OneandoneBase
7
-
8
- banner 'knife oneandone datacenter list'
9
-
10
- def run
11
- $stdout.sync = true
12
-
13
- init_client
14
-
15
- response = OneAndOne::Datacenter.new.list
16
- formated_output(response, true)
17
-
18
- datacenters = [
19
- ui.color('ID', :bold),
20
- ui.color('Location', :bold),
21
- ui.color('Country Code', :bold)
22
- ]
23
- response.each do |dc|
24
- datacenters << dc['id']
25
- datacenters << dc['location']
26
- datacenters << dc['country_code']
27
- end
28
-
29
- puts ui.list(datacenters, :uneven_columns_across, 3)
30
- end
31
- end
32
- end
33
- end
1
+ require 'chef/knife/oneandone_base'
2
+
3
+ class Chef
4
+ class Knife
5
+ class OneandoneDatacenterList < Knife
6
+ include Knife::OneandoneBase
7
+
8
+ banner 'knife oneandone datacenter list'
9
+
10
+ def run
11
+ $stdout.sync = true
12
+
13
+ init_client
14
+
15
+ response = OneAndOne::Datacenter.new.list
16
+ formated_output(response, true)
17
+
18
+ datacenters = [
19
+ ui.color('ID', :bold),
20
+ ui.color('Location', :bold),
21
+ ui.color('Country Code', :bold)
22
+ ]
23
+ response.each do |dc|
24
+ datacenters << dc['id']
25
+ datacenters << dc['location']
26
+ datacenters << dc['country_code']
27
+ end
28
+
29
+ puts ui.list(datacenters, :uneven_columns_across, 3)
30
+ end
31
+ end
32
+ end
33
+ end
@@ -1,97 +1,97 @@
1
- require 'chef/knife/oneandone_base'
2
- require '1and1/helpers'
3
-
4
- class Chef
5
- class Knife
6
- class OneandoneFirewallCreate < Knife
7
- include Knife::OneandoneBase
8
- include Oneandone::Helpers
9
-
10
- banner 'knife oneandone firewall create (options)'
11
-
12
- option :name,
13
- short: '-n NAME',
14
- long: '--name NAME',
15
- description: 'Name of the firewall (required)'
16
-
17
- option :description,
18
- long: '--description DESCRIPTION',
19
- description: 'Description of the firewall'
20
-
21
- option :port_from,
22
- long: '--port-from [PORT_FROM]',
23
- description: 'A comma separated list of the first firewall ports in range (80,161,443)'
24
-
25
- option :port_to,
26
- long: '--port-to [PORT_TO]',
27
- description: 'A comma separated list of the second firewall ports in range (80,162,443)'
28
-
29
- option :protocol,
30
- short: '-p [PROTOCOL]',
31
- long: '--protocol [PROTOCOL]',
32
- description: 'A comma separated list of the firewall protocols (TCP,UDP,TCP/UDP,ICMP,IPSEC,GRE)'
33
-
34
- option :source,
35
- short: '-S [SOURCE_IP]',
36
- long: '--source [SOURCE_IP]',
37
- description: 'A comma separated list of the source IPs allowed to access though the firewall'
38
-
39
- option :wait,
40
- short: '-W',
41
- long: '--wait',
42
- description: 'Wait for the operation to complete.'
43
-
44
- def run
45
- $stdout.sync = true
46
-
47
- validate(config[:name], '-n NAME')
48
- validate(config[:protocol], 'at least one value for --protocol [PROTOCOL]')
49
-
50
- protocols = split_delimited_input(config[:protocol])
51
- ports_from = split_delimited_input(config[:port_from])
52
- ports_to = split_delimited_input(config[:port_to])
53
- sources = split_delimited_input(config[:source])
54
-
55
- validate_rules(ports_from, ports_to, protocols)
56
-
57
- rules = []
58
-
59
- for i in 0..(protocols.length - 1)
60
- rule = {
61
- 'protocol' => protocols[i].upcase,
62
- 'port_from' => ports_from[i].nil? ? nil : ports_from[i].to_i,
63
- 'port_to' => ports_to[i].nil? ? nil : ports_to[i].to_i,
64
- 'source' => sources[i]
65
- }
66
- rules << rule
67
- end
68
-
69
- init_client
70
-
71
- firewall = OneAndOne::Firewall.new
72
- response = firewall.create(name: config[:name], description: config[:description], rules: rules)
73
-
74
- if config[:wait]
75
- firewall.wait_for
76
- formated_output(firewall.get, true)
77
- puts "Firewall policy #{response['id']} is #{ui.color('created', :bold)}"
78
- else
79
- formated_output(response, true)
80
- puts "Firewall policy #{response['id']} is #{ui.color('being created', :bold)}"
81
- end
82
- end
83
-
84
- def validate_rules(ports_from, ports_to, protocols)
85
- if ports_from.length != ports_to.length
86
- ui.error('You must supply equal number of --port-from and --port-to values!')
87
- exit 1
88
- end
89
-
90
- if protocols.length < ports_from.length
91
- ui.error('It is required that the value count of --protocol >= --port-from value count!')
92
- exit 1
93
- end
94
- end
95
- end
96
- end
97
- end
1
+ require 'chef/knife/oneandone_base'
2
+ require '1and1/helpers'
3
+
4
+ class Chef
5
+ class Knife
6
+ class OneandoneFirewallCreate < Knife
7
+ include Knife::OneandoneBase
8
+ include Oneandone::Helpers
9
+
10
+ banner 'knife oneandone firewall create (options)'
11
+
12
+ option :name,
13
+ short: '-n NAME',
14
+ long: '--name NAME',
15
+ description: 'Name of the firewall (required)'
16
+
17
+ option :description,
18
+ long: '--description DESCRIPTION',
19
+ description: 'Description of the firewall'
20
+
21
+ option :port_from,
22
+ long: '--port-from [PORT_FROM]',
23
+ description: 'A comma separated list of the first firewall ports in range (80,161,443)'
24
+
25
+ option :port_to,
26
+ long: '--port-to [PORT_TO]',
27
+ description: 'A comma separated list of the second firewall ports in range (80,162,443)'
28
+
29
+ option :protocol,
30
+ short: '-p [PROTOCOL]',
31
+ long: '--protocol [PROTOCOL]',
32
+ description: 'A comma separated list of the firewall protocols (TCP,UDP,TCP/UDP,ICMP,IPSEC,GRE)'
33
+
34
+ option :source,
35
+ short: '-S [SOURCE_IP]',
36
+ long: '--source [SOURCE_IP]',
37
+ description: 'A comma separated list of the source IPs allowed to access though the firewall'
38
+
39
+ option :wait,
40
+ short: '-W',
41
+ long: '--wait',
42
+ description: 'Wait for the operation to complete.'
43
+
44
+ def run
45
+ $stdout.sync = true
46
+
47
+ validate(config[:name], '-n NAME')
48
+ validate(config[:protocol], 'at least one value for --protocol [PROTOCOL]')
49
+
50
+ protocols = split_delimited_input(config[:protocol])
51
+ ports_from = split_delimited_input(config[:port_from])
52
+ ports_to = split_delimited_input(config[:port_to])
53
+ sources = split_delimited_input(config[:source])
54
+
55
+ validate_rules(ports_from, ports_to, protocols)
56
+
57
+ rules = []
58
+
59
+ for i in 0..(protocols.length - 1)
60
+ rule = {
61
+ 'protocol' => protocols[i].upcase,
62
+ 'port_from' => ports_from[i].nil? ? nil : ports_from[i].to_i,
63
+ 'port_to' => ports_to[i].nil? ? nil : ports_to[i].to_i,
64
+ 'source' => sources[i]
65
+ }
66
+ rules << rule
67
+ end
68
+
69
+ init_client
70
+
71
+ firewall = OneAndOne::Firewall.new
72
+ response = firewall.create(name: config[:name], description: config[:description], rules: rules)
73
+
74
+ if config[:wait]
75
+ firewall.wait_for
76
+ formated_output(firewall.get, true)
77
+ puts "Firewall policy #{response['id']} is #{ui.color('created', :bold)}"
78
+ else
79
+ formated_output(response, true)
80
+ puts "Firewall policy #{response['id']} is #{ui.color('being created', :bold)}"
81
+ end
82
+ end
83
+
84
+ def validate_rules(ports_from, ports_to, protocols)
85
+ if ports_from.length != ports_to.length
86
+ ui.error('You must supply equal number of --port-from and --port-to values!')
87
+ exit 1
88
+ end
89
+
90
+ if protocols.length < ports_from.length
91
+ ui.error('It is required that the value count of --protocol >= --port-from value count!')
92
+ exit 1
93
+ end
94
+ end
95
+ end
96
+ end
97
+ end
@@ -1,59 +1,59 @@
1
- require 'chef/knife/oneandone_base'
2
-
3
- class Chef
4
- class Knife
5
- class OneandoneFirewallDelete < Knife
6
- include Knife::OneandoneBase
7
-
8
- banner 'knife oneandone firewall delete FIREWALL_ID [FIREWALL_ID] (options)'
9
-
10
- option :wait,
11
- short: '-W',
12
- long: '--wait',
13
- description: 'Wait for the operation to complete.'
14
-
15
- def run
16
- $stdout.sync = true
17
-
18
- init_client
19
-
20
- name_args.each do |firewall_id|
21
- firewall = OneAndOne::Firewall.new
22
-
23
- begin
24
- firewall.get(firewall_id: firewall_id)
25
- rescue StandardError => e
26
- if e.message.include? 'NOT_FOUND'
27
- ui.error("Firewall ID #{firewall_id} not found. Skipping.")
28
- else
29
- ui.error(e.message)
30
- end
31
- next
32
- end
33
-
34
- firewall_name = firewall.specs['name']
35
-
36
- confirm("Do you really want to delete firewall policy '#{firewall_name}'")
37
-
38
- firewall.delete
39
-
40
- if config[:wait]
41
- begin
42
- puts ui.color('Deleting, wait for the operation to complete...', :cyan).to_s
43
- firewall.wait_for
44
- puts "Firewall policy '#{firewall_name}' is #{ui.color('deleted', :bold)}"
45
- rescue StandardError => e
46
- if e.message.include? 'NOT_FOUND'
47
- puts "Firewall policy '#{firewall_name}' is #{ui.color('deleted', :bold)}"
48
- else
49
- ui.error(e.message)
50
- end
51
- end
52
- else
53
- puts "Firewall policy '#{firewall_name}' is #{ui.color('being deleted', :bold)}"
54
- end
55
- end
56
- end
57
- end
58
- end
59
- end
1
+ require 'chef/knife/oneandone_base'
2
+
3
+ class Chef
4
+ class Knife
5
+ class OneandoneFirewallDelete < Knife
6
+ include Knife::OneandoneBase
7
+
8
+ banner 'knife oneandone firewall delete FIREWALL_ID [FIREWALL_ID] (options)'
9
+
10
+ option :wait,
11
+ short: '-W',
12
+ long: '--wait',
13
+ description: 'Wait for the operation to complete.'
14
+
15
+ def run
16
+ $stdout.sync = true
17
+
18
+ init_client
19
+
20
+ name_args.each do |firewall_id|
21
+ firewall = OneAndOne::Firewall.new
22
+
23
+ begin
24
+ firewall.get(firewall_id: firewall_id)
25
+ rescue StandardError => e
26
+ if e.message.include? 'NOT_FOUND'
27
+ ui.error("Firewall ID #{firewall_id} not found. Skipping.")
28
+ else
29
+ ui.error(e.message)
30
+ end
31
+ next
32
+ end
33
+
34
+ firewall_name = firewall.specs['name']
35
+
36
+ confirm("Do you really want to delete firewall policy '#{firewall_name}'")
37
+
38
+ firewall.delete
39
+
40
+ if config[:wait]
41
+ begin
42
+ puts ui.color('Deleting, wait for the operation to complete...', :cyan).to_s
43
+ firewall.wait_for
44
+ puts "Firewall policy '#{firewall_name}' is #{ui.color('deleted', :bold)}"
45
+ rescue StandardError => e
46
+ if e.message.include? 'NOT_FOUND'
47
+ puts "Firewall policy '#{firewall_name}' is #{ui.color('deleted', :bold)}"
48
+ else
49
+ ui.error(e.message)
50
+ end
51
+ end
52
+ else
53
+ puts "Firewall policy '#{firewall_name}' is #{ui.color('being deleted', :bold)}"
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end